Mis vahe on Python Iterator ja Iterable vahel?


Vastus 1:

Iteraatorid

  1. Iteraator on objekt, mis mäletab sisemise olekumuutuja kaudu iteratsioonide arvu. Miski ei lähtesta seda muutujat nullini, kui iteratsioon ületab viimase üksuse, selle asemel tõstetakse StopIteration () iteratsiooni lõpu tähistamiseks. See tähendaks, et neid saab iteratsiooni teha ainult üks kord . some_list = [1, 2]
    iterator_of_some_list = iter (mõned_loend)
    minu jaoks iterator_of_some_list:
        print (i)
    j jaoks iterator_of_some_list: # ei tööta
        print (j)

    # aga
    k jaoks mõnes_loendis:
     prindi (k)
    l jaoks some_list: # töötab
     print (l)
    Seda ka sellepärast, et iteraatori iter () meetod tagastab iseenda (on oleku meelespidamiseks hädavajalik). See on siseringi rakenduste, näiteks „jaoks” silmuse lõpetamiseks sissetungitud.

Parandamatud

  1. Iterable on objektid, mida saab korrata suvalise arv kordi. Kuna iteratsioon on iteraatorites juba tehtud, on itereeritava mitu iteratsiooni võime rakendatud mitme iteraatori kiirendusega. some_list = [1, 2]

    k jaoks mõnes_loendis:
        l jaoks mõnes_loendis:
            print (l, k)
    - “for k…” kutsub iterit (some_list) - iter () kutsub itereeritavat faili __iter __ (), mis tagastab iteraatori objekti (mis sisaldab itereeritavate objektide andmeid) - “for l…” kutsub iterit uuesti (some_list) ja on varustatud uue iteraatori eksemplariga - mõlemad iteraatori objektid jälgivad seega sõltumatult nende ahela olekuid. DRY põhimõte lihtsalt kordab (rakendades iteraatori eksemplari tagastamiseks meetodit __iter __ ()) iteraatori objekti võimalusi itereeritava objekti jaoks, kuna itereeritav peaks tegema kõike seda iteraator teeb.Kindlasti osutab mälus asuvatele andmestruktuuridele ja rakendab seetõttu meetodeid nagu __getitem __ () meetod, mis võib võtta järjestikuseid indekseid nullist alates .Iteraatorite objektid ei pea alati hoidma mälus olevate andmestruktuuride viiteid, nt. generaatorite puhul, millel on järgmine väärtus laiskvooluga. Selle tulemuseks on mõningane superkoolide jõudluse kasv ja see on selle suure populaarsuse peamine põhjus.

Vastus 2:

Iterdab:

__getitem __ (register)

string = "abc"
stringi jaoks:
    prindi char
  1. Alustage indeksiga 0Kõne stringi .__ getitem __ (register) indeksi viga on tõstatatud? Loobi lisamise indeksi StopRun põhiosa, minge tagasi punkti 2 juurde
klass MySequence:
    def __getitem __ (ise, indeks):
        kui indeks> 10:
            tõsta IndexError ("sellest piisab!")
        tagastatav väärtus * 10

Miks me vajame iteraatoreid?

Bulat Bochkariovi vastus

 See pakub laiendatavat iteraatori liidest.

iter (objekt)

__iter __ ()

  1. Järgmine () meetod (ümbernimetatud __next __ () pütonis 3) [b], mis tagastab objekti järgmise üksuse või tõstab StopIteration iteratsiooni lõpust märku andmiseks. Iter __ () meetodi, mis tagastab iseenda.
  • Iteroididel peab olema __iter__ (või __getitem__), samas kui interaatoritel peab olema nii järgmine kui ka __iter__. Kuigi iteratsiooni semantika pärineb ainult esimesest, on viimane kohustatud käituma korduvalt, nii et for-loop saaks iteraatori üle joosta.

 See võimaldab jõudluse täiustustel loetleda iteratsiooni.

See võimaldab sõnastuse iteratsioonis suuri jõudluse täiustusi

võtme sisestamiseks dict.keys ():
    prindiklahv
võtme jaoks dict.iterkeys ():
    prindiklahv

võtme sisestamiseks

See võimaldab pakkuda liidese lihtsalt iteratsiooniks, teeseldamata juhusliku juurdepääsu võimaldamist elementidele.

See ühildub kõigi olemasolevate kasutaja määratletud klasside ja laiendiobjektidega, mis jäljendavad jadasid ja vasteid, isegi vastetega, mis rakendavad ainult {__getitem__, võtmed, väärtused, üksused} alamhulka.

See muudab koodide itereerimise jadata kogumite osas kokkuvõtlikumaks ja loetavamaks.

kui sisestada dict:

kui dict.has_key (k):

Argumendid __next __ () vastu: kuigi palju iteraatoreid kasutatakse silmuste jaoks, eeldatakse, et kasutajakood helistab otse ka järgmisele (), seega on __next __ () kirjutamine inetu; samuti oleks protokolli võimalik laiendamine lubada toiminguid prev (), current () ja reset (); kindlasti ei taha me kasutada __prev __ (), __ praegust __ (), __ lähtestada __ (). (Tagantjärele mõeldes oleks võinud parem otsida __next __ () ja omada uus sisseehitatud järgmine (it), mis kutsub seda .__ next __ (). Kuid kahjuks on liiga hilja; see on kasutusele võetud Python 2.2-s. alates detsembrist 2001.)

Viited / täiendav lugemine:

PEP 234 - iteraatorid

Pythoni avalduse "jaoks" mõistmine

Erinevus Pythoni generaatorite ja iteraatorite vahel