Kas yra iteratorius, iteracija, iteracija?

Kokia yra pagrindinė „iterable“, „iterator“ ir „iteracijos“ apibrėžtis „Python“?

Aš perskaičiau keletą apibrėžimų, bet aš negaliu nustatyti tikslios vertės, nes ji vis dar nepriima.

Ar kas nors gali man padėti, naudodamasis 3 terminų apibrėžimais?

349
27 марта '12 в 9:03 2012-03-27 09:03 thechrishaddad paklausė kovo 27 d. 12 val. 09:03 2012-03-27 09:03
@ 12 atsakymų

Iteracija yra bendras terminas, pagal kurį kiekvienas elementas gali būti paimtas po vieną. Kiekvieną kartą, kai naudojate kilpą, aiškiai ar netiesiogiai, kartokite elementų grupę, t.

„Python“ sistemoje iteracinis ir iteratorius turi konkrečių reikšmių.

Iterable yra objektas, turintis __iter__ metodą, kuris grąžina iteratorių arba apibrėžia __getitem__ metodą, kuris gali būti iš eilės iš eilės, pradedant nuo nulio (ir padidina IndexError reikšmę, kai indeksai nebegalioja). Taigi, iterable yra objektas, iš kurio galite gauti iteratorių .

Iteratorius yra objektas, turintis next (Python 2) arba __next__ (Python 3) metodą.

Kai naudojate kilpą arba map , ar sąrašo supratimą ir pan. Pythone, next metodas automatiškai kviečiamas gauti kiekvieną elementą iš iteratoriaus, taip einant per iteracijos procesą.

Gera vieta pradėti mokytis bus vadovėlio iteratorių ir standartinių puslapio tipų iteratorių sekcija . Suprasdami pagrindinius dalykus, išbandykite funkcijų programavimo HOWTO iteratoriaus skyrių.

424
27 марта '12 в 9:15 2012-03-27 09:15 atsakymas pateikiamas agf kovo 12 d. 12 val. 2012-03-27 09:15

Čia pateikiamas paaiškinimas, kurį naudoju mokydamas „Python“ klases:

ITERABLE:

  • viskas, ką galite sukonfigūruoti (t.y. galite perjungti liniją ar failą) arba
  • viskas, kas gali pasirodyti dešinėje pusėje: for x in iterable: ... arba
  • viskas, ką galite skambinti su iter() , kuri grąžina ITERATOR: iter(obj) arba
  • Objektas, kuris apibrėžia __iter__ , kuris grąžina naują ITERATOR, arba gali turėti __getitem__ metodą, tinkamą indeksuotai paieškai.

ITERATOR yra objektas:

  • su būsena, kuri prisimena, kur ji vyksta iteracijos metu,
  • naudojant __next__ metodą, kuris:
    • grąžina kitą iteracijos vertę
    • atnaujina būseną, nurodydama kitą vertę.
    • kai tai daroma didinant StopIteration
  • ir tai yra savaime susikerta (tai reiškia, kad ji turi __iter__ metodą, kuris grąžina self ).
border=0

Pastabos:

  • „Python 3“ __next__ metodas yra parašytas next „Python 2“ ir „Python“
  • next() įmontuotas funkcija šį metodą vadina jam perduotu objektu.

Pavyzdžiui:

 >>> s = 'cat' # s is an ITERABLE # s is a str object that is immutable # s has no state # s has a __getitem__() method >>> t = iter(s) # t is an ITERATOR # t has state (it starts by pointing at the "c" # t has a next() method and an __iter__() method >>> next(t) # the next() function returns the next value and advances the state 'c' >>> next(t) # the next() function returns the next value and advances 'a' >>> next(t) # the next() function returns the next value and advances 't' >>> next(t) # next() raises StopIteration to signal that iteration is complete Traceback (most recent call last): ... StopIteration >>> iter(t) is t  # the iterator is self-iterable 
281
27 марта '12 в 9:39 2012-03-27 09:39 atsakė Raymondui Hettingeriui kovo 27 d. 12 val. 9:39 2012-03-27 09:39

Aukščiau pateikti atsakymai yra puikūs, tačiau, kaip ir dauguma mano matomų, nepabrėžkite skirtumų, kurie yra pakankami žmonėms, kaip man.

Be to, žmonės linkę gauti „pernelyg pythonišką“, kai „X yra objektas, turintis„ __foo__() metodą anksčiau. Tokios apibrėžtys yra teisingos - jos grindžiamos ančių spausdinimo filosofija, tačiau dėmesys metodams yra linkęs įgyti, bandant suprasti sąvoką savo paprastumu.

Taigi, pridedu savo versiją.


Natūrali kalba

  • Iteracija - tai vienas elementas vienu metu elementų eilėje.

Pythone

  • Pasikartojantis yra objektas, kuris, gerai, pasikartojantis, paprasčiausiai reiškia, kad jis gali būti naudojamas, pavyzdžiui, iteracijos metu. su kilpa. Kaip? Naudojant iteratorių. Toliau paaiškinsiu.

  • ... o iteratorius yra objektas, kuris nustato, kaip iš tikrųjų atlikti iteraciją - būtent tai, kas yra kitas elementas. Štai kodėl ji turi turėti next() .

Iteratoriai taip pat pajausti, nes jų __iter__() metodas grąžina tą patį objektą ( self ), neatsižvelgiant į tai, ar jo elementai buvo naudojami ankstesniais next() skambučiais.


Taigi, ką „Python“ vertėjas galvoja, kai jis mato „ for x in obj: instrukciją for x in obj: :?

Žr. Atrodo kaip iteratoriaus darbas ... Leiskite man jį gauti.

"Pone obj , ar turite iteratorių?" (... kviečia iter(obj) , kuris skambina obj.__iter__() , kuris laimingai gauna blizgančią naują iteratorių _i .)

Gerai, tai buvo lengva ... Tada pradėkite kartoti. ( x = _i.next() ... x = _i.next() ...)

Kadangi p. obj pasisekė šiame teste (su tam tikru metodu, kuris grąžina galiojantį iteratorių), mes jį apdovanojame būdvardžiu: dabar galite jį pavadinti „ obj pasauliu“.

Tačiau paprastais atvejais paprastai negalite naudotis iteratoriumi ir iteracija atskirai. Taigi, jūs apibrėžiate tik vieną objektą, kuris taip pat yra jo iteratorius. (Python tikrai nerūpi, kad _i , išduotas obj , buvo ne tik toks puikus, bet tik pats obj .)

Štai kodėl daugelyje pavyzdžių, kuriuos mačiau (ir kas man vėl ir vėl supainiojo), galite pamatyti:

 class IterableExample(object): def __iter__(self): return self def next(self): pass 

vietoj

 class Iterator(object): def next(self): pass class Iterable(object): def __iter__(self): return Iterator() 

Tačiau yra atvejų, kai jūs galite pasinaudoti tuo, kad iteratorius yra atskirtas nuo pasikartojančio, pavyzdžiui, kai norite turėti vieną elementų eilutę, bet daugiau „žymeklių“. Pvz., Jei norite dirbti su „dabartiniais“ ir „artėjančiais“ elementais, jums gali būti atskiri iteratoriai. Arba keli srautai iš didžiulio sąrašo: kiekvienas gali turėti savo iteratorių, kad galėtų kirsti visus dalykus. Daugiau informacijos rasite @Raymond ir @glglgl .

Įsivaizduokite, ką galėtumėte padaryti:

 class SmartIterableExample(object): def create_iterator(self): # An amazingly powerful yet simple way to create arbitrary # iterator, utilizing object state (or not, if you are fan # of functional), magic and nuclear waste--no kittens hurt. pass # don't forget to add the next() method def __iter__(self): return self.create_iterator() 

Pastabos:

  • Dar kartą kartoju: iteratorius nėra pasikartojantis. Iteratorius negali būti naudojamas kaip „šaltinis“, for loop“. Kas yra ciklas __iter__() (kuris grąžina kažką su next() )?

  • Žinoma, for nėra vienintelė iteracijos kilpa, taigi pirmiau minėta kai kurie kiti taip pat stato ( while ...).

  • next() iteratorius gali išjungti „StopIteration“, kad sustabdytų iteraciją. Neturėtų, nors jis gali kartoti amžinai arba naudoti kitas priemones.

  • Pirmiau minėtoje „minties procese“ tikrai nėra. Aš surinko šį pavadinimą.

  • Dabar mažas Python 3.x: next() metodo (o ne įmontuoto) pakeitimas dabar turėtų būti vadinamas __next__() . Taip, visą laiką jis turėjo būti toks.

  • Taip pat galite tai galvoti: iterable turi duomenis, iteratorius traukia kitą elementą

Atsakomybės apribojimas: nesu jokio „Python“ vertėjo kūrėjas, todėl nežinau, ką vertėjas vertina. Minėti apmąstymai yra vienintelis pavyzdys, kaip suprantu šią temą iš kitų paaiškinimų, eksperimentų ir tikrosios „Python“ naujokų patirties.

89
11 сент. atsakymą pateikė Alois Mahdal 11 sep . 2013-09-11 17:59 '13, 17:59, 2013-09-11 17:59

Pasikartojantis objektas, turintis __iter__() metodą. Jis gali būti įvykdytas kelis kartus, pvz., list() ir tuple() .

Iteratorius - tai iteratas. Jis grąžinamas __iter__() metodu, jis grąžina save per savo __iter__() metodą ir turi next() ( __next__() metodą 3.x).

Iteracija yra šio next() skambinimo procesas next() resp. __next__() tol, kol jis padidins „ StopIteration .

Pavyzdys:

 >>> a = [1, 2, 3] # iterable >>> b1 = iter(a) # iterator 1 >>> b2 = iter(a) # iterator 2, independent of b1 >>> next(b1) 1 >>> next(b1) 2 >>> next(b2) # start over, as it is the first call to b2 1 >>> next(b1) 3 >>> next(b1) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> b1 = iter(a) # new one, start over >>> next(b1) 1 
20
27 марта '12 в 9:14 2012-03-27 09:14 atsakymas pateikiamas glglgl 27 d. 12 val. 9:14 2012-03-27 09:14

Aš nežinau, ar tai padeda visiems, bet aš visada norėčiau vizualizuoti mano galvoje esančias sąvokas, kad geriau jas suprasti. Kadangi turiu mažą sūnų, pateikiu iteratoriaus / iteratoriaus koncepciją su plytomis ir baltu popieriumi.

Tarkime, mes esame tamsiame kambaryje, o ant grindų turime mano sūnaus plytų. Įvairių dydžių, spalvų plytos, nesvarbu. Tarkime, mes turime 5 tokias plytas. Šios 5 plytos gali būti apibūdinamos kaip objektas - tarkim, plytų rinkinys . Mes galime padaryti daug su šiuo plytų rinkiniu - galite paimti vieną, o tada paimti antrą, o tada trečią, keisti plytų vietas, antroji pastatyti pirmąją plytą. Su jais galime padaryti daug dalykų. Todėl šis plytų rinkinys yra pakartojamas objektas arba seka , nes mes galime eiti per kiekvieną plytų ir daryti kažką su juo. Tai galime padaryti tik kaip mano mažasis sūnus - vienu metu galime žaisti su viena plyta. Todėl aš vėl įsivaizduoju šį plytų rinkinį kaip kartotinį .

Dabar atminkite, kad esame tamsiame kambaryje. Arba beveik tamsus. Tiesa ta, kad mes aiškiai nematome šių plytų, kokios spalvos jie turi, kokia forma ir tt Todėl, net jei norime su jais kažką daryti - dar vadinamų iteracijų per juos, mes tikrai nežinome, ką ir kaip tai yra per tamsi.

Tai, ką mes galime padaryti, yra artumas prie pirmojo plytų - kaip plytų rinkinio elementas - mes galime įdėti baltos spalvos fluorescencinį popierių, kad pamatytume, kur yra pirmasis plytų elementas. Ir kiekvieną kartą, kai mes paimame plytų iš rinkinio, mes pakeisime baltą popieriaus lapą su kita plyta, kad pamatytume jį tamsiame kambaryje. Šis baltas popieriaus gabalas yra tik iteratorius . Tai objektas . Tačiau objektas, su kuriuo mes galime dirbti ir žaisti su mūsų sunaikinamo objekto elementais, yra plytų rinkinys.

Tai, beje, paaiškina mano ankstyvą klaidą, kai bandžiau toliau aprašyti IDLE ir gavau „TypeError“:

  >>> X = [1,2,3,4,5] >>> next(X) Traceback (most recent call last): File "<pyshell#19>", line 1, in <module> next(X) TypeError: 'list' object is not an iterator 

X sąrašas čia buvo mūsų plytų rinkinys, bet ne baltas popieriaus lapas. Pirmiausia reikėjo rasti iteratorių:

 >>> X = [1,2,3,4,5] >>> bricks_kit = [1,2,3,4,5] >>> white_piece_of_paper = iter(bricks_kit) >>> next(white_piece_of_paper) 1 >>> next(white_piece_of_paper) 2 >>> 

Nežinau, ar tai padeda, bet tai padėjo man. Jei kas nors galėtų patvirtinti / ištaisyti koncepcijos vizualizaciją, būčiau dėkingas. Tai padės man sužinoti daugiau.

9
30 сент. Atsakymą pateikė Nikolajus Dudaev 30 rugsėjis 2015-09-30 15:25 '15 15:25 2015-09-30 15:25

Čia yra mano apgauti sąrašas:

  sequence + | v def __getitem__(self, index: int): + ... | raise IndexError | | | def __iter__(self): | + ... | | return <iterator> | | | | +--> or <-----+ def __next__(self): + | + ... | | | raise StopIteration v | | iterable | | + | | | | v | +----> and +-------> iterator | ^ v | iter(<iterable>) +----------------------+ | def generator(): | + yield 1 | | generator_expression +-+ | | +-> generator() +-> generator_iterator +-+ 

Apklausa: matote, kaip ...

  • yra kiekvienas iteratorius?
  • __iter__() konteinerių objekto metodas gali būti įgyvendintas kaip generatorius?
  • iteracinis plius metodas __next__ nebūtinai yra iteratorius?
5
25 марта '18 в 17:53 2018-03-25 17:53 atsakymą pateikė AXO kovo 25 d. 18 val. 17:53 2018-03-25 17:53

Nemanau, kad tai galite padaryti daug lengviau nei dokumentacija , bet bandysiu:

  • Iteruotas yra tai, ką galima pakartoti. Praktiškai tai paprastai reiškia seką. tai, kas turi pradžią ir pabaigą, ir tam tikras būdas eiti per visus jo elementus.
  • Jūs galite galvoti apie „ Iterator“ kaip pseudo pagalbininko metodą (arba pseudo-atributą), kuris suteikia (arba turi) kitą (arba pirmąjį) elementą pasikartojančiame. (Praktiškai tai tik objektas, apibrėžiantis next() metodą)

  • Iteraciją tikriausiai geriausiai paaiškina žodis :

b: pakartokite kompiuterio komandų seką, nurodytą kartų skaičių, arba kol bus įvykdyta sąlyga - palyginkite rekursiją

3
27 марта '12 в 9:15 2012-03-27 09:15 atsakymą pateikė Kimvais , kovo 27 d. 12 val. 9:15 2012-03-27 09:15

Iterable : - kas kartojama, kartojama; pvz., sąrašai, stygos ir kt. Jis taip pat turi arba __getItem__() metodą, arba iter() funkciją, kuri grąžina iteratorių.

Iterator : - Kai gauname iteratoriaus objektą iš iteruojamo iterio metodo iter() iterable; mes vadiname __next__() (į python3) arba tiesiog next() (į python2), kad elementus gautumėte po vieną. Ši šios klasės klasė arba egzempliorius vadinama iteratoriumi.

Iš dokumentų: -

Naudodamiesi iteratoriais, Python suveikia ir suvienija. Užkulisiuose už konteinerio objektą skambinama „ iter() . Funkcija grąžina iteratoriaus objektą, kuris apibrėžia __next__() metodą, kuris vienu metu pasiekia konteinerio elementus. Kai daugiau elementų nėra, __next__() sukelia StopIteration išimtį, kuri nurodo, kad kilpa sustabdoma. Galite paskambinti __next__() metodu, naudodami next() integruotą funkciją; Šis pavyzdys rodo, kaip tai veikia:

 >>> s = 'abc' >>> it = iter(s) >>> it <iterator object at 0x00A1DB50> >>> next(it) 'a' >>> next(it) 'b' >>> next(it) 'c' >>> next(it) Traceback (most recent call last): File "<stdin>", line 1, in <module> next(it) StopIteration 

Ex klasė: -

 class Reverse: """Iterator for looping over a sequence backwards.""" def __init__(self, data): self.data = data self.index = len(data) def __iter__(self): return self def __next__(self): if self.index == 0: raise StopIteration self.index = self.index - 1 return self.data[self.index] >>> rev = Reverse('spam') >>> iter(rev) <__main__.Reverse object at 0x00A1DB50> >>> for char in rev: ... print(char) ... m a p s 
3
28 мая '18 в 22:00 2018-05-28 22:00 „ Vicrobot“ atsakymą pateikė gegužės 28 d., 18 val. 10:00 val. 2018-05-28 22:00
 iterable = [1, 2] iterator = iter(iterable) print(iterator.__next__()) print(iterator.__next__()) 

taip

  • iterable yra objektas , galintis iterable . pvz., sąrašas, eilutė, eilutė ir tt

  • naudojant iter funkciją mūsų iterable bus grąžintas iteratoriaus objektas .

  • Dabar šis iteratoriaus objektas turi metodą, vadinamą __next__ (Python 3 arba tiesiog next Python 2), su kuriuo galite pasiekti kiekvieną iterable elementą.

taip, PAGALBOS KODEKSO IŠLAIDAS:

1

2

2
19 июня '17 в 15:57 2017-06-19 15:57 atsakymą pateikė arpan kumar birželio 17 d. 15:57 2017-06-19 15:57

Prieš kreipiantis į iteratorius ir iteratorių, pagrindinis veiksnys, lemiantis iteracinį iteratorių, yra seka

Seka: seka yra duomenų rinkinys.

Iterable: Iterable yra sekos tipo objektas, palaikantis Iter metodą.

Iteros metodas: Iteros metodas ima seką kaip įvestį ir sukuria objektą, kuris yra žinomas kaip iteratorius.

Iteratorius: iteratorius yra objektas, kuris skambina tokiu būdu ir per seką. Skambinant šiuo metodu, jis grąžina objektą, kurį jis šiuo metu kerta.

Pavyzdys:

 x=[1,2,3,4] 

x yra seka, sudaryta iš duomenų rinkinio

 y=iter(x) 

Skambindamas iter (x), jis grąžina iteratorių tik tada, kai objektas x turi iteracinį metodą, kitaip jis išmeta išimtį. Jei jis grąžina iteratorių, y priskiriamas taip:

 y=[1,2,3,4] 

Kadangi y yra iteratorius, jis palaiko kitą () metodą

Skambindami tokiu būdu, jis grąžina atskirus sąrašo elementus po vieną.

Grąžinus paskutinį sekos elementą, jei dar kartą vadiname kitą metodą, tai sukelia StopIteration klaidą.

Pavyzdys:

 >>> y.next() 1 >>> y.next() 2 >>> y.next() 3 >>> y.next() 4 >>> y.next() StopIteration 
1
28 янв. atsakymas duotas Shadow Jan 28 2018-01-28 10:31 '18, 10:31 2018-01-28 10:31

Iterables turi __iter__ metodą, kuris kiekvieną kartą paleidžia naują iteratorių.

Iteratoriai įgyvendina __next__ metodą, kuris grąžina atskirus elementus, ir __iter__ metodą, kuris grąžina self .

Todėl iteratoriai taip pat gali būti rodomi, tačiau iteratoriai nėra iteratoriai.

Lucciano Ramallo, Free Python.

0
06 сент. atsakymą pateikė trthhrtz 06 Sep. 2018-09-06 14:10 '18, 14:10 pm 2018-09-06 14:10

Pythone viskas yra objektas. Kai objektas vadinamas iterable, tai reiškia, kad galite atlikti (pvz., Kartoti) objektą kaip kolekciją.

Pavyzdžiui, matricos yra pasikartojančios. Jūs galite eiti per juos su kilpa ir pereiti nuo indekso 0 iki indekso n, n yra masyvo objekto ilgis, atėmus 1.

Žodynai (raktų / reikšmių poros, taip pat vadinamos asociatyviomis matricomis) taip pat gali būti pateikiami. Galite atlikti jų raktus.

Akivaizdu, kad objektai, kurie nėra kolekcijos, nėra pasikartojami. Pavyzdžiui, „Bool“ objektas turi tik vieną vertę: „True“ arba „False“. Tai nėra pasikartojantis (tai būtų beprasmiška būti pasikartojančiu objektu).

Daugiau informacijos. http://www.lepus.org.uk/ref/companion/Iterator.xml

-6
15 июля '14 в 11:59 2014-07-15 11:59 atsakymą pateikė vartotojo93097373 liepos 15 d. 14:59 2014-07-15 11:59

Kiti klausimai, susiję su etikete „ arba „ Klauskite“