Czym są generatory w Pythonie i jak ich używać?



Dowiedz się, czym są generatory w Pythonie i jakie są zalety. Dowiedz się również, jak je tworzyć i używać wraz z różnymi przypadkami użycia.

Generowanie iterowalnych lub obiektów, które pozwalają na ich przejście, jest uważane za uciążliwe. Ale w , realizacja tego bolesnego zadania staje się naprawdę płynna. Więc przejdźmy dalej i przyjrzyjmy się bliżej generatorom w Pythonie.

Oto lista wszystkich tematów poruszonych w tym artykule:





Więc zacznijmy. :)

Co to są generatory w Pythonie?

Generatory to w zasadzie funkcje, które zwracają obiekty lub elementy, które można przechodzić. Te funkcje nie produkują wszystkich elementów naraz, raczej produkują je pojedynczo i tylko wtedy, gdy jest to wymagane. Zawsze, gdy jest dołączony do iteracji po zestawie elementów, uruchamiana jest funkcja generatora. Generatory mają również wiele zalet.



Zalety korzystania z generatorów

  • Bez generatorów w Pythonie tworzenie iteracji jest niezwykle trudne i długotrwałe.

  • Generatory są łatwe do zaimplementowania, ponieważ automatycznie implementują __iter __ (), __next __ () i StopIteration, które w przeciwnym razie muszą być jawnie określone.



  • Pamięć jest zapisywana, gdy elementy są produkowane zgodnie z wymaganiami, w przeciwieństwie do normalnych . Fakt ten staje się bardzo ważny, gdy trzeba utworzyć ogromną liczbę iteratorów. Jest to również uważane za największą zaletę generatorów.

  • Może być użyty do produkcji nieskończonej liczby przedmiotów.

  • Mogą być również używane do obsługi wielu operacji

Funkcje normalne a funkcje generatora:

java to związek

Generatory w Pythonie są tworzone tak samo, jak Ty tworzysz używając słowa kluczowego „def”. Ale funkcje generatora używają słowa kluczowego yield zamiast zwrotu. Ma to na celu powiadomienie interpretera, że ​​jest to iterator. Nie tylko to, funkcje generatora są uruchamiane, gdy wywoływana jest funkcja next (), a nie przez ich nazwę, jak w przypadku normalnych funkcji. Rozważ następujący przykład, aby lepiej to zrozumieć:

PRZYKŁAD:

def func (a): yield a a = [1,2,3] b = func (a) next (b)

WYNIK: [1, 2, 3]

Jak widać, na powyższym wyjściu func () używa słowa kluczowego yield i następnej funkcji do wykonania. Jednak do normalnego działania potrzebny będzie następujący fragment kodu:

PRZYKŁAD:

def func (a): return a a = [1,2,3] func (a)

WYNIK: [1, 2, 3]

Jeśli spojrzysz na powyższy przykład, możesz się zastanawiać, po co używać funkcji generatora, skoro normalna funkcja również zwraca te same dane wyjściowe. Przejdźmy więc dalej i zobaczmy, jak używać generatorów w Pythonie.

Korzystanie z funkcji generatora:

Jak wspomniano wcześniej, generatory w Pythonie generują iterowalne pojedynczo. Spójrz na następujący przykład:

PRZYKŁAD:

def myfunc (a): while a> = 3: yield a a = a + 1 b = myfunc (a) print (b) next (b)

Po wykonaniu poniższej funkcji zobaczysz następujące dane wyjściowe:

WYNIK: 4

Tutaj został zwrócony jeden iterowalny obiekt spełniający warunek while. Po wykonaniu kontrola jest przekazywana wywołującemu. W przypadku, gdy potrzeba więcej elementów, tę samą funkcję należy wykonać ponownie, wywołując funkcję next ().

dalej (b)

WYNIK: 5

Przy kolejnych wykonaniach funkcja zwróci 6,7 itd. Funkcje generatora w Pythonie implementują metody __iter __ () i __next __ () automatycznie. Dlatego można iterować po obiektach, używając po prostu metody next (). Gdy generowanie elementu powinno zostać zakończone, funkcje generatora implementują Zatrzymanie wewnętrznie bez martwienia się o dzwoniącego. Oto kolejny przykład:

PRZYKŁAD:

a = 2 def myfunc (a): while a> = 0: yield a a - = 1 b = myfunc (a) print (b) next (b)

WYNIK:

StopIteration-Generators w Python-EdurekaPowyższy obraz pokazuje wymaganą liczbę razy wykonanie naszego programu. Jeśli spróbujesz ponownie wywołać następną funkcję, zwróci ona komunikat przedstawiający Zatrzymanie Został wdrożony. Jeśli spróbujesz to zrobić za pomocą normalnych funkcji, zwrócone wartości nie ulegną zmianie ani iteracji. Spójrz na poniższy przykład:

PRZYKŁAD:

def z (): n = 1 wydajność n n = n + 3 wydajność n p = z () next (p)

WYNIK:

Generatory z pętlami:

Jeśli chcesz wykonać tę samą funkcję naraz, możesz skorzystać z pętli „for”. Ta pętla pomaga w iteracji po obiektach i po wszystkich implementacjach wykonuje StopIteration.

PRZYKŁAD:

def z (): n = 1 wydajność n n = n + 3 wydajność n dla x in z (): print (x)

WYNIK:

jeden
4

Możesz także określić wyrażenia, aby wygenerować iterowalne obiekty.

Wyrażenia generatora:

Możesz także użyć wyrażeń wraz z pętlą for do tworzenia iteratorów. Zwykle sprawia to, że generowanie iteracji jest znacznie łatwe. Wyrażenia generatora przypominają listy składane i podobne funkcje lambda , wyrażenia generatora tworzą anonimowe funkcje generatora.

Spójrz na poniższy przykład:

PRZYKŁAD:

Przykład przestrzeni nazw c ++
a = zakres (6) print ('Zrozumienie listy', end = ':') b = [x + 2 for x in a] print (b) print ('Wyrażenie generatora', end = ': n') c = (x + 2 for x in a) print (c) for y in c: print (y)

WYNIK:

Rozumienie listy: [2, 3, 4, 5, 6, 7]

Wyrażenie generatora:

2
3
4
5
6

Jak widać, na powyższym wyjściu pierwszym wyrażeniem jest lista składowana, która jest określona w nawiasach []. Zrozumienie listy generuje od razu pełną listę elementów. Następnym jest wyrażenie generatora, które zwraca te same elementy, ale pojedynczo. Jest określony za pomocą nawiasów ().


Generatorfunkcje mogą być również używane w ramach innych funkcji.Na przykład:

PRZYKŁAD:

a = range (6) print ('Wyrażenie generatora', end = ': n') c = (x + 2 for x in a) print (c) print (min (c))

WYNIK:

Wyrażenie generatora
2

Powyższy program drukuje minimalną wartość, gdy powyższe wyrażenie jest stosowane do wartości a.

Przypadków użycia:

Użyjmy generatorów w do:

  • Wygeneruj serię Fibonacciego
  • Generowanie liczb

Generowanie serii Fibonacciego:

Szereg Fibonacciego, jak wszyscy wiemy, jest szeregiem liczb, w których każda liczba jest sumą dwóch poprzednich liczb. Pierwsze dwie liczby to 0 i 1. Oto program generujący szereg Fibonacciego:

PRZYKŁAD:

def fibo (): first, second = 0,1 while True: yield first first, second = second, first + second for x in fibo (): if x> 50: break print (x, end = '')

WYNIK:

0 1 1 2 3 5 8 13 21 34

Powyższe dane wyjściowe pokazują szereg Fibonacciego z wartościami mniejszymi niż 50. Przyjrzyjmy się teraz, jak wygenerować listę liczb.

Generowanie liczb:

Jeśli chcesz wygenerować określone numery list, możesz to zrobić za pomocą funkcji generatora. Spójrz na następujący przykład:

PRZYKŁAD:

a = zakres (10) b = (x dla x in a) print (b) dla y in b: print (y)

WYNIK:

0
jeden
2
3
4
5
6
7
8
9

PRZYKŁAD:

a = zakres (2,10,2) b = (x for x in a) print (b) for y in b: print (y)

WYNIK:


2
4
6
8

Powyższy program zwrócił liczby parzyste od 2 do 10. To prowadzi nas do końca artykułu o generatorach w Pythonie. Mam nadzieję, że zrozumiałeś wszystkie tematy.

Upewnij się, że ćwiczysz jak najwięcej i cofnij swoje doświadczenie.

Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy na tym blogu „Generatory w Pythonie”, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.

Aby uzyskać dogłębną wiedzę na temat języka Python i jego różnych aplikacji, możesz zarejestrować się na żywo z całodobowym wsparciem i dożywotnim dostępem.