Python magyarázata a termés, iterátorok és generátorok munkájának

A bejegyzés fő forrása a stackoverflow kérdései és válaszai.

Ahhoz, hogy megértsük, mi a "hozam", meg kell értenünk, hogy mi generátorok. A generátorok megértéséhez ismerned kell az iterátorokat és az iterált objektumokat.







Iterezett tárgyak (iterables)

Az orosz nyelv szempontjából nem helyesnek tartom az "iterábilis" szót - vagyis az "iterálható" szót. azok, amelyeknél iteráció fordulhat elő. De helyesebb lenne "iterációnak" nevezni őket, bár ez a szó kissé összekever engem személyesen.

Lista létrehozásakor egyszerre elolvashatja elemeit - ez az iteráció.

Lst - iterable objektum. Amikor listatörvényeket használ, létrehoz egy listát - az iterált objektumot:

Minden olyan objektum, amelyet a "in." Construct programban használhatunk, listát, karakterláncokat, fájlobjektumokat stb. Iterirumye tárgyak kényelmes, mert el tudja olvasni belőlük annyi adatot, mint amire szüksége van, de tárolására sorrend értékek a memóriában, és ez nem mindig elfogadható, különösen, ha van egy elég nagy sorozatot.

generátorok

A generátorok iterált objektumok, de általában csak egyszer használhatók. Ennek az az oka, hogy nem tárolják az összes értéket a memóriában, hanem értékeket generálnak "menet közben" - lekérdezésként:

A kód majdnem ugyanazt látja, mint az előző példában, hanem a szögletes zárójelek helyett ("<.>] ") használták (" (<.>) „). Fontos tudni, hogy nem tudja végrehajtani a ciklus generátor másodszor, mert semmi sem a memóriában nincs tárolva, kísérlet arra, hogy menjen a második alkalommal is csak figyelmen kívül hagyja, mert a generátor dobja ki az első kérés, hogy a következő érték StopIterationError azonban nem veszi észre, ha egy hurok, ez a kivétel lesz fogott, és értelmezni, mint a végén a ciklus), de akkor nézd meg kézzel .:






A következő módszer a generátor következő értékének megszerzésére szolgál, ha nem használja a for loop-ot.

A hozam olyan kulcsszó, amelyet ugyanúgy használunk, mint a visszatérő szó. A különbség az, hogy a funkció elkezdi visszaadni a generátort az érték helyett.

Ebben az esetben gyakorlati szempontból ez egy haszontalan példa. Meg fogja találni a kézzelfogható előnyöket olyan helyzetben, amikor a funkciója viszonylag nagy mennyiségű adatot visz vissza, de csak egyszer kell használni őket.

Annak érdekében, hogy teljes mértékben megértsük a hozamkifejezést, tudnunk kell, hogy amikor egy olyan függvényt hív meg, amelyikben a hozam található, ez a függvény nem hajtható végre. A végrehajtás helyett a függvény egy objektumgenerátort visz vissza. Első pillantásra kissé különösnek tűnik - a funkciót hívják, de a kódot nem hajtják végre, de csak emlékezz erre a tényre. A kód mindegyik iterációnál végrehajtásra kerül - legyen szó hurokról <.> -ban "vagy egy módszert hív .következő ().

Amikor a funkciókód első alkalommal kerül végrehajtásra, a kódot az elejétől az első hozamnyilatkozathoz kell végrehajtani. Ezután visszatér az első érték, és a függvénytest végrehajtása ismét felfüggesztésre kerül. Kérelem a következő értéket a generátor alatt iteráció teszi a szervezet működését kód kerül végrehajtásra (a korábbi yield'a), amíg el nem éri a következő hozamot. A generátor akkor tekinthető "befejezettnek", ha a funkció testkódjának következő végrehajtásakor nincs hozamjelentés.

Generátor végrehajtás vezérlése

Bizonyos esetekben ez a logika hasznos lehet például az erőforrásokhoz való hozzáférés szabályozásához.

A python szabványos könyvtári modul - itertools

A szabványos python könyvtár itertoolok modulja speciális funkciókat tartalmaz az iterátorok létrehozásához és működtetéséhez. Ezzel a modullal lehet: klón a bejáró, hogy összekapcsolják a lánc több iterátorok csoport értékeit beágyazott listák egyetlen, használja a térkép / zip verziót generátorok - imap / izip, ez a lista még nem ér véget.

Például nézzük számítani érkezése az összes lehetséges változat a lovak a versenyen (a probléma a kombinatorikus - ismétli anélkül permutáció elemek):

Felhívjuk figyelmét, hogy a lista alkalmazása a generátor számára minden értékét kiszámolja, és létrehoz egy listát azokról.

A belső iterációs mechanika megértése

Iteráció - olyan folyamat, amelynek iterable ( "iterability", azaz az eljárás végrehajtására "__iter __ ()") és iterátoroké (megérti "__next __ ()" eljárás). Az Iterált tárgyak olyan objektumok, amelyeken az iteráció megtörténhet. Az iterátorok olyan objektumok, amelyek lehetővé teszik az iterált objektumokon keresztül történő iterációt. Sasha az autópályán volt.




Kapcsolódó cikkek