Definicja: Generator jest jak normalna funkcja, która generuje zakres wartości za pomocą wydajność słowo kluczowe. Zwraca jeden obiekt na raz. Wewnętrznie używa iteratora. Aby uzyskać dostęp do następnego elementu Kolejny() funkcja jest używana, czy możemy jej użyć dla pętla. Jeśli spróbujemy uzyskać dostęp do wartości spoza zakresu, podnosi a StopIteracja błąd.
Zobaczymy kilka przykładów, aby lepiej zrozumieć
Dawny: funkcja generatora dla zakresu wartości
def zakres_zabawy(n):x = 0
podczas gdy x < n:
wydajność x
x += 1
y = zabawa_zakresowa (3)
#call za pomocą pętli for
print('Generuj wartości przy użyciu metody next()')
dla mnie w range_fun(3):
drukuj(i)
#wywołaj generator przy użyciu następnej metody
print('Generuj wartości za pomocą metody pętli for')
drukuj(następny(y))
drukuj(następny(y))
drukuj(następny(y))
print(next(y))#Zostanie zgłoszony wyjątek Zatrzymaj iterację
Dawny: Funkcja generatora dla serii Fibonacciego
def fib_fun(n):x, y = 0, 1
podczas gdy x < n:
wydajność x
x, y = y, x + y
z = fib_fun(6) #obiekt generatora
print('Generuj wartości przy użyciu metody next()')
drukuj(następny(z))
drukuj(następny(z))
drukuj(następny(z))
drukuj(następny(z))
drukuj(następny(z))
drukuj(następny(z))
print('Generuj wartości za pomocą metody pętli for')
dla mnie w fib_fun(6):
drukuj(i)
Dawny: Funkcja generatora do tworzenia zakresu wartości z zadaną wartością początkową i końcową.
def mój_zakres(początek, koniec):prąd = początek
póki prąd < end:
wydajność prąd
prąd +=1
print('Generuj wartości przy użyciu metody next()')
liczby = mój_zakres(1,5)
drukuj(następny(liczby))
drukuj(następny(liczby))
drukuj(następny(liczby))
drukuj(następny(liczby))
print('Generuj wartości używając metody pętli for')
dla num w moim_zakresie(1,5):
drukuj (liczba)
Dawny: Generator do mnożenia każdej liczby (mniejszej niż liczba) przez liczbę
def gen_mulby_num(maks.,liczba):n = 0
podczas gdy n < max:
wydajność n * liczba
n += 1
dla mnie w gen_mulby_num(5,3):
drukuj(i)
Dawny: Generator do znajdowania sześcianu dla zakresu wartości
def gen_mulby_num(maks,liczba):n = 0
podczas gdy n < max:
wydajność n * liczba
n += 1
dla mnie w gen_mulby_num(5,3):
drukuj(i)
Dawny: wiele generatorów: znajdź kwadrat liczb parzystych wygenerowanych z liczby
Generator 1: generuj wartości parzyste z podanej liczby
Generator 2: generuj liczby kwadratowe z wartości generatora1
def gen_even(m):n = 0
podczas gdy n < m:
jeśli n % 2 == 0:
wydajność n
n += 2
def gen_square(liczby):
dla num w liczbach:
wydajność 2 * liczba
dla n w gen_square(gen_even(15)):
drukuj(n)
Dawny: Wiele generatorów: utwórz serię fibnacciego i dodaj wartość 10 dla każdej liczby.
Generator1: generuje szereg Fibonacciego z podanej liczby
Generator2: dodaj każdą liczbę o 10 z generatora1
def gen_fib(n):x, y = 0, 1
podczas gdy x < n:
wydajność x
x, y = y, x + y
def gen_add_10(liczby):
dla num w liczbach:
wydajność 10 + liczba
dla n w gen_add_10(gen_fib(5)):
drukuj(n)
Zrozumienia generatora:
Wyrażenia generatora są podobne do wyrażeń listowych, w których lista używa nawiasów kwadratowych; to używa normalnego nawiasu.
Dawny:
nums = (i dla i w zakresie(10))drukuj(typ(liczby))
drukuj(lista(liczby))
Różnica między generatorem a normalną funkcją:
- Generator dostarcza wartości za pomocą wydajność słowo kluczowe, w którym normalna funkcja używa powrót słowo kluczowe
- Generator uruchamia się od miejsca, w którym się zatrzymał przy następnym wywołaniu. Normalna funkcja wykonuje wszystkie instrukcje za każdym razem.
- Generator oszczędza pamięć, ponieważ zwraca jedną wartość na raz. Więc możemy go użyć do generowania nieskończonych wartości.
Wniosek:
Generator jest bardzo pomocny, gdy mamy do czynienia z ogromnymi/dużymi danymi. W danym momencie przechowuje tylko jedną część danych, a nie całe dane. Koncepcja generatorów jest uważana za zaawansowaną koncepcję w Pythonieth.