„Python“

Iteratoriai „Python“

Iteratoriai „Python“
Iteratorius yra vertingas „Python“ įrankis. Tai objektas, naudojamas pakartoti visus kolekcijos elementus. „Iterator“ suteikia prieigą prie konteinerio elementų, tačiau jis pats neatlieka iteracijos. Jis veikia kaip duomenų bazės žymeklis ir naudojamas įrašų sąrašui skaityti po vieną. Pavyzdžiui,dėl'kilpa, kartojanti konteinerio reikšmes, veikia kaip iteratorius. „Python“ turi daug iteratorių iteruojamiems objektams, tokiems kaip sąrašai, rinkiniai, žodynai ir kt. Be šių pakartotojų “itertooliai'funkcijas galima naudoti norint grąžinti kitus „Python“ iteratorius. Šiame straipsnyje parodyta, kaip naudoti kilpą kaip iteratorių, pasirinktinį iteratorių, begalinį iteratorių ir valdyti begalinį iteratorių „Python 3“. Kai kurie „itertooliai'funkcijos taip pat paaiškintos paskutinėje šios pamokos dalyje.

Iteratorių metodai

Kiekviename iteratoriaus objekte yra šie du metodai.

Šis metodas naudojamas iterinamam objektui inicijuoti. Grąžintame objekte yra metodas '_ _Kitas_ _()„Python 3“.

Šis metodas pateikia kitą iteruojamo objekto vertę. Santykis tarp iteratoriaus ir iteruojamo objekto parodytas šioje diagramoje.

Kartojasi su kilpomis

Anksčiau buvo minėta, kaddėl'kilpa skambina'Kitas()metodas netiesiogiai kartojant bet kokį kartojamą objektą. Kai kartotiniam objektui kartoti naudojama kilpa, 'dėl'kilpa skambina'Kitas()„metodas netiesiogiai ir“kol'kilpa skambina'Kitas()„arba“__Kitas__()metodas, skirtas aiškiai perskaityti kitą iteruojamo objekto vertę. Abiejų tipų kilpos ir toliau vadina šį metodą, kol 'StopIterationgeneruojamas signalas.

1 pavyzdys: kartojami kartojami objektai su „už“ kilpa

Šis scenarijus rodo „dėl'kilpos penkių skirtingų kartojamų objektų kartojimui. Pirmas 'dėl'kilpa naudojama eilutės vertei pakartoti ir kiekvienam eilutės simboliui atspausdinti kiekvienoje iteracijoje. Antras 'dėl'kilpa naudojama kartoti esamo teksto failo turinį ir atspausdinti kiekvieną failo eilutę kiekvienoje iteracijoje. Trečioji 'dėl'kilpa naudojama kartoti reikšmes. Ketvirtas 'dėl'kilpa naudojama pakartoti sąraše esančias vertes. Penktas 'dėl'kilpa naudojama pakartoti žodyno reikšmes.

# Kartoti eilutę naudojant kilpą
spausdinti ("Styginių kartojimas naudojant kilpą")
str = "Python"
už val į str:
spausdinti (val)
# Esamo failo kartojimas naudojant ciklą
spausdinti ("\ n \ nFailo skaitymas eilutėmis pagal eilutes naudojant ciklui")
linija atvira ("testas.txt "):
spausdinti (eilutė, pabaiga = "")
# # Kartojant kartotinį naudojant kilpą
spausdinti ("\ n \ nKartinė kartojimas naudojant ciklą")
tup = ("Knyga", "Popierius", "Pieštukas", "Rašiklis")
val in tup:
spausdinti (val)
# Kartojamas sąrašas naudojant ciklą
spausdinti ("\ n \ nIteriacijos sąrašas naudojant ciklą")
listdata = ["Dizaineris", "Analitikas", "Programuotojas", "Administratorius"]
for val sąrašo duomenyse:
spausdinti (val)
# Žodyno kartojimas naudojant ciklą
spausdinti ("\ n \ nŽodyno kartojimas naudojant ciklą")
dictval = 'Meher': 95, 'Sakib': 97, 'Akhi': 70, 'Fiaz': 78
indeksui „dictval“:
spausdinti ("% s pasiekė% d ženklus"% (rodyklė, dictval [rodyklė]))

Rezultatas

Šis išvestis rodo, kad eilutės vertės simboliai; linijos testas.txt byla; o paleidus scenarijų atspausdinami rinkinių, sąrašo ir žodyno elementai.

2 pavyzdys: kartojami sąrašai su „while“ kilpa

Šis scenarijus parodo „kol'kilpa duomenų kartojimui. Čiakartoti ()'metodas naudojamas iterinamam objektui inicijuoti, o'Kitas()'metodas naudojamas nuskaityti kitą iteruojamo objekto vertę. StopIteration signalas naudojamas nutraukti nuo begalinio “kol ' ciklo, kai nė vieno sąrašo punkto neliko skaityti.

# Apibrėžkite sąrašą
listdata = ['google.com ',' bing.com “,„ yahoo “.com “,„ baidu.com ',' duckduckgo.com ']
# Inicializuokite kartojamą objektą
init_iter_object = iter (sąrašo duomenys)
spausdinti ("Kartojami sąrašo duomenys naudojant while loop: \ n")
# Deklaruoti ir begalinis, o kilpa
o tiesa:
bandyti:
Metodas # next () naudojamas pakartoti kitą vertę
reikšmė = kitas (init_iter_object)
spausdinti (vertė)
išskyrus StopIteration:
# Nutraukti iš ciklo, pakartojus visas vertes
pertrauka

Rezultatas

Šis išvestis rodo, kad kiekviena sąrašo vertė buvo atspausdinta kiekvienoje eilutėje naudojant 'Kitas()'metodas paleidus scenarijų.

3 pavyzdys: Tuple kartojimas naudojant metodą „__next __ ()“ ir „loop“

Šiame scenarijuje abuKitas()„ir“__Kitas__()'pakartojimo reikšmių kartojimui naudojami metodai. „kartoti ()"metodas naudojamas kartojamam objektui, pavadintam"inic_iteris."Čia,"Kitas()'metodas iškviečiamas du kartus, kad būtų išspausdintos dvi pirmosios reikšmės. Kitas, begalinis “kol'kilpa naudojama pakartoti likusias reikšmes ir "StopIteration'signalas naudojamas nutraukti nuo kilpos, kaip ir ankstesniame pavyzdyje.

# apibrėžkite po kelis
animal_tuple = ('Paukštis', 'Liūtas', 'Beždžionė', 'Gyvatė', 'Dramblys')
spausdinti ("Tuple reikšmės yra: \ n")
# Inicijuokite iteratoriaus objektą naudodami iter ()
init_iter = iter (animal_tuple)
# iteruoti ir atspausdinti vertę naudojant „next“ () metodą
spausdinti (kitas (init_iter))
spausdinti (kitas (init_iter))
# Apibrėžkite begalinį ciklą
o tiesa:
bandyti:
# iteruoti ir spausdinti vertę naudojant metodą __next __ ()
spausdinti (init_iter.__Kitas__())
išskyrus StopIteration:
# Nutraukti iš ciklo, pakartojus visas vertes
pertrauka

Rezultatas

Šis išvestis rodo, kad paleidus scenarijų, pirmosios dvi reikšmės "Paukštis„ir“Liūtas,"spausdinami su"Kitas()metodas, o kitos trys reikšmės “Beždžionė,"Gyvatė,„ir“Dramblys,"spausdinami su"__Kitas__()metodas.

Kartojasi pasirinktiniu iteratoriumi

Šiame skyriuje parodoma, kaip kuriant klases galima įgyvendinti įvairių tipų pritaikytus iteratorius. Tiek „__iteras __ ()' ir '__Kitas__()metodai bus įgyvendinti klasėje, okol'kilpa bus naudojama iteruojamo objekto reikšmėms pakartoti.  Kitoje šio straipsnio dalyje taip pat bus parodyta, kaip sukurti begalinį pasirinktinį iteratorių ir valdyti iteraciją.

4 pavyzdys: paprasto pritaikyto iteratoriaus naudojimas

Šis scenarijus leidžia apskaičiuoti xn naudojant pasirinktinį iteratorių nenaudojant jokios integruotos „Python“ funkcijos. Klasė pavadinta „x_to_power_n“yra deklaruojama scenarijuje. „__init __ ()klasės metodas inicijuos x ir n kuri bus naudojama kuriant objektą. „__iteras __ ()metodas inicijuos klasės kintamąjį, kuriame busrezultataskiekvienos iteracijos skaičiavimo kintamasis. Vertybės x ir n bus laikoma vartotojo įvestimi. Klasės objektas “numeriai'yra sukurtas su x ir n. Toliau kartojamas objektas, pavadintas 'iter_objyra sukurtas skambinti__Kitas__()metodas n-1 kartų naudojantkol'kilpa apskaičiuoti xn. Kiekvienoje iteracijoje vertė x bus padauginta iš ankstesnės vertėsrezultatas'kintamasis. Nutraukęs „kol"kilpa,"__Kitas__()metodas bus dar kartą iškviestas atspausdinti reikšmę xn.

"Sukurkite klasę, kad apskaičiuotumėte
x iki galios n, naudojant iteratorių
"
„x_to_the_power_n“ klasė:
# Inicializuokite x ir n reikšmes
def __init __ (savęs, x = 0, n = 0):
savarankiškai.x = x
savarankiškai.n = n
# Inicializuokite kartojamą
def __iter __ (savęs):
savarankiškai.rezultatas = 1
grąžinti save
# Apskaičiuokite kiekvienos iteracijos vertę
def __next __ (pats):
jei pats.n> = 0:
savarankiškai.rezultatas * = savęs.x
savarankiškai.n - = 1
grąžinti save.rezultatas
# Paimkite x ir n reikšmes
x = int (įvestis ("Įveskite x reikšmę:"))
n = int (įvestis ("Įveskite n reikšmę:"))
# Sukurkite klasės objektą
skaičiai = x_į_galios_n (x, n)
# Sukurkite kartojamą programą
iter_obj = iter (skaičiai)
bandyti:
i = 0
kol aš < n-1):
# Atgaukite kitą vertę naudodami metodą next ()
kitas (iter_obj)
i + = 1
spausdinti ("\ n% d galiai% d yra% d"% (x, n, iter_obj.__Kitas__()))
išskyrus StopIteration:
# Nutraukti iš scenarijaus, jei nėra vertės
spausdinti (kitas (iter_obj))

Rezultatas

Šis išvestis rodo, kad 2 yra vertinamas kaip x ir 4 yra vertinamas kaip n. Taigi scenarijus apskaičiavo 2būti 16.

5 pavyzdys: begalinio pasirinktinio iteratoriaus naudojimas

Šis scenarijus nuolat spausdins skaičius, kurie dalijasi iš 5, su vienos sekundės vėlavimu, kol vartotojas paspaus „Ctrl“ + c sugeneruotiKlaviatūra'signalas. Begalinis 'kol'kilpa čia naudojama kuriant begalinį pasirinktinį iteratorių. „laikas'modulis importuojamas scenarijaus pradžioje, norint naudoti'miegas ()metodas atidėti kiekvieną išėjimą vienai sekundei. Skaičius 5 inicijuojamas į „skaičius'kintamasis kaip pirmasis dalinamasis skaičius scenarijuje, o kitas skaičius generuojamas pridėjus 5 su ankstesne reikšme'skaičius'kintamasis.

# Importo laiko modulis
importo laikas
"
Sukurkite klasę, kad sugeneruotumėte skaičius
kurie nuolatos dalijasi iš 5
"
klasės numeris: Divisible_by_five:
# Inicializuokite numerio reikšmę
def __iter __ (savęs):
savarankiškai.skaičius = 5
grąžinti save
# Apskaičiuokite kitą skaičių, kuris dalijasi iš 5
def __next __ (pats):
next_num = pats.skaičius
laikas.miegoti (1)
savarankiškai.skaičius + = 5
grįžti kitas_num
# Sukurkite klasės objektą
Object = Number_Divisible_by_five ()
# Sukurkite kartojamą objektą
iterObject = iter (objektas)
# Apibrėžkite begalinę kilpą
o tiesa:
bandyti:
# Eikite į kitą kartojimą
spausdinti (iterObject.__Kitas__())
išskyrus „KeyboardInterrupt“:
spausdinti („paspaudžiami„ Ctrl “+ C.")
# Nutraukti iš ciklo, kai paspaudžiamas „Ctrl“ + C
pertrauka

Rezultatas

Ši išvestis rodo, kad skaičius pradėtas spausdinti nuo 5 ir vienas po kito nuolat spausdindavo kitus skaičius. Kai vartotojas paspaudė „Ctrl“ + c išspausdinus numerį 60, žinutė 'Paspaudžiami „Ctrl“ + C.prieš nutraukiant scenarijų buvo išspausdintas.

6 pavyzdys: Individualaus begalinio kartotuvo valdymas

Šis scenarijus parodo, kaip sustabdyti pasirinktinį begalinį iteratorių, baigus nurodytą skaičių pakartojimų. „__iteras __ ()„klasės metodas inicijuos„n„ir“rezultatas'klasės kintamieji. Scenarijus apskaičiuos skaičių kvadratus, pradedant nuo 1, kurios saugomos kintamajame n, ir atspausdinkite kvadratinę vertę n iki vertės n yra didesnis nei 5. Čia skelbiama begalinė, kol kilpa, norint paskambinti '__Kitas__()"kvadratinės vertės atspausdinimo metodas n. Kai vertė n pasiekia 6, „StopIteration'generuos signalą, kad nutrauktų kilpą.

# Importo laiko modulis
importo laikas
"
Sukurkite klasę apskaičiuoti
skaičiaus kvadratas prasideda nuo 1 iki
skaičiaus vertė yra mažesnė nei 6
"
klasė apskaičiuoti_galia:
# Inicializuokite numerio reikšmę
def __iter __ (savęs):
savarankiškai.n = 1
savarankiškai.rezultatas = 0
grąžinti save
# Apskaičiuokite kitą skaičių, kuris dalijasi iš 5
def __next __ (pats):
# Patikrinkite, ar n reikšmė yra mažesnė arba lygi 5, ar ne
jei pats.n <= 5:
savarankiškai.rezultatas = savęs.n ** 2
laikas.miegas (0.5)
savarankiškai.n + = 1
grąžinti save.rezultatas
Kitas:
pakelti StopIteration
# Sukurkite klasės objektą
Objektas = apskaičiuoti_galia ()
# Sukurkite kartojamą objektą
iterObject = iter (objektas)
# Apibrėžkite begalinę kilpą
o tiesa:
bandyti:
# Eikite į kitą kartojimą ir atspausdinkite kvadrato vertę
spausdinti ("% d kvadratas yra% d"% (iterObject.n, iterObject.__Kitas__()))
išskyrus StopIteration:
spausdinti ("\ nNutraukta nuo ciklo.")
# Nutraukti nuo ciklo
pertrauka

Rezultatas

Šis išvestis rodo, kad begalinis pasirinktinis iteratorius buvo nutrauktas, kai n reikšmė tapo didesnė nei 5. Scenarijus apskaičiavo ir atspausdino skaičių verčių kvadratines vertes nuo 1 iki 5.

Kartojasi su itertooliais

„Python“ turi įmontuotą modulį pavadinimu „itertooliai', kurį galima naudoti norint sukurti iteratorių duomenims kartoti naudojant kilpą. Kitame šio straipsnio skyriuje parodyta, kaip naudoti tris šio modulio funkcijas.

itertooliai.suskaičiuoti ()

The 'itertooliai.tęsinys'funkcija gali būti naudojama su'žemėlapis ()„nuoseklių duomenų generavimo metodas su„pašto kodas ()'metodas pridėti sekas, naudojant šio metodo skaičiavimo parametrą. Šios funkcijos sintaksė pateikiama žemiau.

Sintaksė

itertooliai.skaičius (pradžia = 0, žingsnis = 1)

Čia pirmasis parametras 'pradžia,"naudojamas apibrėžti pradinę sekos vertę, ir 0 yra numatytoji šio parametro vertė. Antrasis parametras 'žingsnis,"naudojamas nustatyti skaičių iš eilės skaičių ir 1 yra numatytoji šio parametro vertė.

7 pavyzdys: Count () funkcijos naudojimas

Šis scenarijus apskaičiuos sumą iš 0 į n skaičiai, kur vertė n bus paimtas iš vartotojo. „suskaičiuoti ()funkcija importuota išitertooliai'scenarijaus pradžioje. „my_iterator'objektas inicijuojamas su'suskaičiuoti ()funkcija su apradžia„0 vertė ir a“žingsnis1 vertė. Toliausuma_rezultatas'kintamasis inicijuojamas pagal pirmąją iteruojamo objekto vertę. Pradinė vertė inicijuojama pagal kintamąjį i ir pradinis numeris yra saugomas kaip kintamojo simbolis - skaičiai, kurie bus naudojami sujungiant kitus skaičius kiekvienoje iteracijoje. Nuosekliųjų skaičių vertės bus pridedamos kiekvienoje iteracijoje, kaiKitas()vadinamas metodas. Kai vertė i tampa didesnis nei n, scenarijus bus nutrauktas rodant sumos rezultatą.

"Šis scenarijus apskaičiuos
0 suma iki skaičiaus, kuris bus laikomas įvestimi.
"
# Importo skaičius
iš itertoolių importo skaičius
# Sukuria pasikartojantį skaičiavimo objektą ()
my_iterator = skaičius (pradžia = 0, žingsnis = 1)
# Perskaitykite pirmąją iteratoriaus vertę
sum_result = kitas (my_iterator)
# Paimkite skaičiaus įvestį, kad užbaigtumėte begalinį, kol ciklas
n = int (įvestis ("Įveskite ribinę vertę:"))
# Inicializuokite i ir skaičių vertę
i = suma_rezultatas
skaičiai = f 'i'
# Paskelbti begalinę kilpą
o tiesa:
# Pridėkite skaičių kiekvienoje iteracijoje
suma_rezultatas + = i
i = kitas (my_iterator)
# Nutraukite kilpą, jei i reikšmė yra didesnė nei n
jei (i> n):
pertrauka
# Pridėkite skaičiaus reikšmę kaip eilutę su „+“ simboliu
skaičiai + = "+" + f 'i'
# Atspausdinkite galutinę vertę
spausdinti ("% s =% d"% (skaičiai, suma_rezultatas))

Rezultatas

Šis išvestis rodo, kad skaičius 10 yra laikomas įvestimi, naudojamu užbaigiant kilpą paleidus scenarijų. Šiame išvestyje scenarijus apskaičiavo sumą nuo 0 iki 10 ir išspausdino išvestį, 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55.

Itertools.ciklas ()

Šioje funkcijoje yra tik vienas argumentas, kuris gali būti bet koks objektas. Šios funkcijos tikslas yra pakartoti objekto reikšmes baigus visų verčių pakartojimą. Čia eilutės, rinkiniai, sąrašai ir kt. gali būti naudojamas kaip objektas. Šios funkcijos kartojami objekto grąžinimai naudojami norint pakartoti kiekvieną objekto vertę, kuri bus naudojama kaip argumentas naudojant „Kitas()metodas. Kartojamų objektų verčių kartojimo skaičius bus pagrįstas ciklo iteracijų skaičiumi. Šios funkcijos sintaksė pateikiama žemiau.

Sintaksė

itertooliai.ciklas (objektas)

8 pavyzdys: ciklo () naudojimas. Itertoolių funkcija

atsitiktinis„ir“itertooliai'moduliai importuojami scenarijaus pradžioje, norint sugeneruoti atsitiktinį skaičių ir naudoti'ciklas ()„funkcija iš“itertooliai'modulis duomenims kartoti. Trijų atsitiktinių skaičių sąrašas naudojamas kaip „ciklas ()' funkcija. Kartojamas objektas pavadinimu „num_list'inicijuojama pagal šios funkcijos grąžinimo vertę. „suskaičiuoti'kintamasis inicijuojamas 0, ir kai šio kintamojo reikšmė taps 6, „kol'kilpa baigsis. Taigi 'kol'kilpa kartosis šešis kartus, o kiekviena sąrašo reikšmė kartosis tik vieną kartą.

# Importuoti atsitiktinį modulį
importuoti atsitiktinai
# Importuokite itertoolių modulį
importuoti itertoolius
# Sukurkite kartojamą objektą, remdamiesi trijų atsitiktinių skaičių sąrašu
num_list = itertools.ciklas ([atsitiktinis.randintas (1,5), atsitiktinis.randintas (10,50), atsitiktinis.randint
(100 500)])
# Inicializuokite skaitiklį
skaičius = 0
# Kartokite kilpą 6 kartus
kol (skaičiuok != 6):
spausdinti ('Dabartinis atsitiktinis skaičius yra:' + f 'next (num_list)')
skaičius + = 1

Rezultatas

Ši išvestis rodo, kad trys atsitiktiniai skaičiai, 3, 17, ir 185, buvo sugeneruoti kaip sąrašo elementai. Kilpa kartojama šešis kartus, o šios trys vertės kartojamos kitoms kartojimams.

Itertools.pakartoti ()

Funkcija „pakartoti ()“ veikia kaip begalinis kartotuvas ir gali pateikti du argumentus. Kai praleidžiamas antrasis argumentas, funkcija „pakartoti ()“ veikia kaip begalinis kartotojas ir reikšmę pakartoja begalinį skaičių kartų. Ši funkcija neužima atminties kiekvienam pakartojimui. Tai tiesiog sukuria kintamąjį vieną kartą atmintyje ir pakartoja tą patį kintamąjį begalinį skaičių kartų, kai šiai funkcijai nustatytas tik vienas argumentas. Šios funkcijos sintaksė pateikiama žemiau.

Sintaksė

itertooliai.pakartoti (vertė, riba)

Pirmasis argumentas naudojamas norint pasikartoti vertę. Antrasis argumentas yra neprivalomas ir naudojamas pakartojimų ribai nustatyti.

9 pavyzdys: pakartojimo () funkcijos naudojimas

itertooliai'modulis importuojamas scenarijaus pradžioje, norint naudoti'pakartoti ()' funkcija. Iš vartotojo bus paimta eilutės reikšmė pakartoti, o iš vartotojo bus paimta skaičių reikšmė, kad būtų galima nustatyti pakartojimo limitą. Grąžinimo vertė pakartoti ()funkcija bus paversta į sąrašą su 'sąrašas ()metodas ir saugomaslistData'kintamasis. „listData"bus atspausdintas su"dėl'kilpa.

# Importuokite itertoolių modulį
importuoti itertoolius
# Paimkite įvesties vertę, kuri pasikartos
string = input ("Įveskite eilutę:")
# Pakartokite skaičiaus vertę
pakartoti = int (įvestis ("Įveskite pakartotiną skaičių:"))
# naudodami pakartojimą () pakartotinai pridėkite eilutę į sąrašą
listData = sąrašas (itertools.pakartoti (eilutė, pakartoti))
# Inicijuoti i
i = 1
spausdinti ("Sąrašo vertės yra: \ n")
# Kartokite sąrašą naudodami ciklą
for val in listData:
spausdinti („Sąrašo elementas% d =% s“% (i, val))
i + = 1

Rezultatas

Šis išvestis rodo, kad "„Python“"yra laikoma eilutės verte ir 3 laikomas skaičiumi, naudojamu eilutės vertei pakartoti paleidus scenarijų. Išvestis rodo, kad eilutė '„Python“'kartojamas tris kartus.

Išvada

Iteratoriaus sąvoką ir įvairių tipų „Python“ iteratorių naudojimą bandoma paaiškinti labai paprastais šio straipsnio pavyzdžiais. „Python“ vartotojai gali naudoti įmontuotą iteratorių arba sukurti reikalingą iteratorių. Šis straipsnis padės pitono vartotojams sužinoti apie iteratoriuje naudojamus metodus ir kaip šie metodai veikia su bet kuria kilpa norint perskaityti bet kokį kartojamą objektą. Kai kurie „ itertooliai modulis python taip pat paaiškinta šiame straipsnyje, norint sužinoti daugiau informacijos apie iteratorių python.

Pelės kairiuoju pelės mygtuku mygtukas neveikia „Windows 10“
Jei naudojate specialią pelę su savo nešiojamuoju kompiuteriu arba staliniu kompiuteriu, tačiau neveikia pelės kairysis mygtukas dėl tam tikrų priežas...
Žymeklis peršoka arba juda atsitiktinai, kai rašote „Windows 10“
Jei pastebite, kad pelės žymeklis peršoka arba juda pats, automatiškai, atsitiktinai, kai vedate „Windows“ nešiojamąjį kompiuterį ar kompiuterį, kai k...
Kaip pakeisti pelės ir jutiklinių plokščių slinkimo kryptį sistemoje „Windows 10“
Pelė ir Jutiklinė dalisTai ne tik palengvina skaičiavimus, bet ir efektyvesnį bei mažiau laiko reikalaujantį. Mes neįsivaizduojame gyvenimo be šių pri...