Principala sursă pentru acest post este întrebările și răspunsurile la stackoverflow.
Pentru a înțelege ce înseamnă "randament", trebuie să înțelegeți ce sunt generatoarele. Pentru a înțelege ce sunt generatorii, ar trebui să știți despre iteratori și obiecte iterate.
Obiecte iterate (iterabile)
Vreau să le numesc incorect, din punct de vedere al limbii ruse, cuvântul "iterabil" - adică cele pentru care se poate produce repetarea. Dar ar fi mai corect să le numim "iterate", deși acest cuvânt îmi confundă personal personal.
Când creați o listă, puteți să citiți elementele sale câte unul - acest lucru se numește iterație.
Lst - obiect iterabil. Când utilizați comprehensiunea listei, creați o listă - obiectul iterat:
Orice obiect pe care le puteți utiliza în design „.. Pentru că în“ este iterirumym: liste, siruri de caractere, obiecte de fișiere, etc. obiecte Iterirumye sunt convenabile, deoarece puteți citi de la ele date la fel de mult ca ai nevoie, dar sunt stocate toate valorile de secvență în memorie și nu este întotdeauna acceptabilă, mai ales dacă aveți o secvență suficient de mare.
generatoare
Generatoarele sunt obiecte iterate, dar, în general, le puteți folosi o singură dată. Acest lucru se datorează faptului că nu stochează toate valorile în memorie, ci generează valori "în zbor" - ca interogare:
Codul arată aproape la fel ca în exemplul anterior, dar în loc de paranteze pătrate ("<.>] ") au fost utilizate rotunde ("<.>) „). Rețineți că nu puteți efectua un generator de ciclu pentru a doua oară, pentru că nimic în memorie nu este stocat, o încercare de a merge a doua oară va fi pur și simplu ignorate, deoarece generatorul va arunca prima cerere la StopIterationError valoarea următoare, cu toate acestea, nu veți observa acest lucru dacă utilizați buclă pentru, această excepție va fi interceptată și interpretată ca sfârșitul bucla.) Dar puteți verifica manual acest lucru:
următorul este metoda de a obține următoarea valoare a generatorului, dacă nu îl folosiți în buclă pentru.
Randamentul este un cuvânt cheie care este folosit în același mod ca și cuvântul returnat. Diferența este că funcția începe să returneze generatorul în locul valorii.
În acest caz, din punct de vedere practic, acesta este un exemplu inutil. Veți obține un beneficiu tangibil într-o situație în care funcția dvs. ar trebui să returneze o cantitate destul de mare de date, dar trebuie să le folosiți doar o singură dată.
Pentru a înțelege pe deplin declarația de randament, trebuie să știți că atunci când apelați o funcție în corpul căruia se află randamentul, această funcție nu se execută. În locul executării, funcția returnează un generator de obiecte. Se pare oarecum ciudat la prima vedere - funcția este chemată, dar codul nu este executat, dar amintesc doar acest lucru. Codul va fi executat la fiecare iterație - fie că este vorba de o buclă <.> în
Când codul corpului funcției este executat pentru prima dată, codul va fi executat de la început până la prima instrucțiune de randament. După aceasta, prima valoare va fi returnată iar execuția corpului funcției este suspendată din nou. Interogarea următoarei valori a generatorului în timpul iterației va determina executarea ulterioară a codului corporal al funcției (din randamentul anterior) până la producerea următorului randament. Generatorul este considerat a fi "completat" dacă în următoarea execuție a codului corporal al funcției nu sa întâlnit nicio declarație de randament.
Controlul execuției generatorului
În unele cazuri, această logică poate fi utilă, de exemplu, pentru a controla accesul la resurse.
Modulul bibliotecii standard Python - itertools
Modulul itertools standard al bibliotecii python conține funcții speciale pentru crearea și lucrul cu iteratori. Cu acest modul puteți: clona iterator, de a combina într-un lanț de mai multe iteratorii, grup valorile listelor imbricate într-o singură, utilizați versiunea harta / zip pe generatoare - IMAP / izip, această listă nu se termina aici.
De exemplu, să calculam toate variantele posibile de sosire a cailor în curse (o sarcină din combinatorică - permutări fără repetiția elementelor):
Rețineți că aplicarea listei la generator va calcula toate valorile sale și va crea o listă de la acestea.
Înțelegerea mecanicii interne de iterație
Iterare - un proces care implică iterable ( "iterability", adică punerea în aplicare a metodei "__ __iter ()") și iteratori (realizând "__next __ ()" metoda). Obiectele iterate sunt orice obiecte pe care poate avea loc o iterație. Iteratoarele sunt obiecte care vă permit să iterați prin obiecte iterate. Sasha se afla pe autostrada.