Poddaj się Python Poradnik: Generator & Przykład rentowności i zwrotu
Co to jest Python dawać?
Słowo kluczowe „profit” w Pythonie działa jak zwrot z „jedynym”.
różnica polega na tym, że zamiast zwracać wartość, zwraca obiekt generatora osobie wywołującej.
Gdy funkcja zostaje wywołana i wątek wykonywania znajdzie w niej słowo kluczowe yield, wykonywanie funkcji zatrzymuje się na tym wierszu i zwraca obiekt generatora do wywołującego.
Składnia
yield expression
Opis
Python yield zwraca obiekt generatora. Generators to funkcje specjalne, które należy iterować, aby uzyskać wartości.
Słowo kluczowe yield konwertuje podane wyrażenie na funkcję generatora, która zwraca obiekt generatora. Aby uzyskać wartości obiektu, należy go iterować, aby odczytać wartości podane do yield.
Przykład: Metoda plonu
Oto prosty przykład wydajności. Funkcja testield() ma słowo kluczowe Yield z ciągiem znaków „Witamy w Guru99 Python Poradniki„. Gdy funkcja jest wywoływana, wydruk jest drukowany i zwraca obiekt generatora zamiast rzeczywistej wartości.
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() print(output)
Wyjście:
<generator object testyield at 0x00000028265EB9A8>
Uzyskany wynik jest obiektem generatora, który ma wartość, jaką nadaliśmy metodzie yield.
Ale nie otrzymujemy wiadomości, którą musimy przekazać, aby uzyskać wynik!
Aby wydrukować komunikat przekazany do yield, należy wykonać iterację obiektu generatora, jak pokazano w poniższym przykładzie:
def testyield(): yield "Welcome to Guru99 Python Tutorials" output = testyield() for i in output: print(i)
Wyjście:
Welcome to Guru99 Python Tutorials
Jakie są Generatorów w Python?
Generators to funkcje, które zwracają iterowalny obiekt generatora. Wartości z obiektu generatora są pobierane pojedynczo, zamiast całej listy razem, dlatego aby uzyskać rzeczywiste wartości, możesz użyć pętli for, używając metody next() lub list().
Korzystanie z Generator funkcjonować
Generatory można tworzyć za pomocą funkcji generatora i wyrażeń generatora.
Funkcja generatora jest podobna do normalnej funkcji, z tą różnicą, że zamiast wartości zwracanej ma słowo kluczowe yield.
Aby utworzyć funkcję generatora, musisz dodać słowo kluczowe yield. Poniższe przykłady pokazują, jak utworzyć funkcję generatora.
def generator(): yield "H" yield "E" yield "L" yield "L" yield "O" test = generator() for i in test: print(i)
Wyjście:
H E L L O
Różnica między funkcją normalną v/s Generator funkcja.
Poznajmy różnice między funkcją generatora a funkcją normalną.
Istnieją 2 funkcje normal_test() i generator_test().
Obie funkcje mają zwrócić ciąg „Hello World”. Funkcja normal_test() używa return, a generator_test() używa yield.
# Normal function def normal_test(): return "Hello World" #Generator function def generator_test(): yield "Hello World" print(normal_test()) #call to normal function print(generator_test()) # call to generator function
Wyjście:
Hello World <generator object generator_test at 0x00000012F2F5BA20>
Wyjście pokazuje, że po wywołaniu normalnej funkcji normal_test() zwraca ona ciąg Hello World. W przypadku funkcji generatora ze słowem kluczowym yield zwraca ona i nie sznurek.
To jest główna różnica między funkcją generatora a normalną funkcją. Teraz, aby uzyskać wartość z obiektu generatora, musimy użyć obiektu wewnątrz pętli for lub użyć metody next() lub skorzystać z list().
print(next(generator_test())) # will output Hello World
Kolejną różnicą, którą należy dodać do funkcji normalnej w porównaniu z funkcją generatora, jest to, że po wywołaniu funkcji normalnej wykonywanie rozpocznie się i zakończy, gdy dotrze do powrót i wartość jest zwracana wywołującemu. Zatem po rozpoczęciu wykonywania nie można zatrzymać normalnej funkcji pomiędzy nimi i zatrzyma się ona tylko wtedy, gdy natrafi na słowo kluczowe return.
Ale w przypadku funkcji generatora, gdy wykonywanie się rozpocznie, gdy otrzyma pierwszy yield, zatrzymuje wykonywanie i zwraca obiekt generatora. Możesz użyć obiektu generatora, aby uzyskać wartości, a także wstrzymać i wznowić zgodnie ze swoimi wymaganiami.
Jak odczytać wartości z generatora?
Wartości z obiektu generatora można odczytać za pomocą list(), pętli for i metody next().
Używanie: lista()
Lista jest obiektem iterowalnym, którego elementy znajdują się w nawiasach. Użycie metody list() na obiekcie generatora spowoduje zwrócenie wszystkich wartości przechowywanych przez generator.
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) print(list(num))
Wyjście:
[0, 2, 4, 6, 8]
Używanie: for-in
W tym przykładzie zdefiniowano funkcję even_numbers(), która zwróci wszystkie liczby parzyste dla zdefiniowanego n. Wywołanie funkcji even_numbers() zwróci obiekt generatora, który jest używany wewnątrz pętli for.
Przykład:
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) for i in num: print(i)
Wyjście:
0 2 4 6 8
Używanie następnego()
Metoda next() wyświetli następny element na liście, tablicy lub obiekcie. Gdy lista będzie pusta i wywołana funkcja next(), zwróci błąd z sygnałem stopIteration. Ten błąd z next() wskazuje, że na liście nie ma więcej elementów.
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) print(next(num)) print(next(num)) print(next(num)) print(next(num)) print(next(num)) print(next(num))
Wyjście:
0 2 4 6 8 Traceback (most recent call last): File "main.py", line 11, in <module> print(next(num)) StopIteration
Generatorsą jednorazowego użytku
W przypadku generatorów są one dostępne do użycia tylko raz. Jeśli spróbujesz użyć ich ponownie, będą puste.
Na przykład:
def even_numbers(n): for x in range(n): if (x%2==0): yield x num = even_numbers(10) for i in num: print(i) print("\n") print("Calling the generator again: ", list(num))
Wyjście:
0 2 4 6 8 Calling the generator again: []
Jeśli chcesz, aby dane wyjściowe zostały ponownie użyte, będziesz musiał ponownie wywołać funkcję.
Przykład: Generatorsi i rentowność szeregu Fibonacciego
Poniższy przykład pokazuje, jak używać generatorów i yield w Python. Przykład wygeneruje szereg Fibonacciego.
def getFibonnaciSeries(num): c1, c2 = 0, 1 count = 0 while count < num: yield c1 c3 = c1 + c2 c1 = c2 c2 = c3 count += 1 fin = getFibonnaciSeries(7) print(fin) for i in fin: print(i)
Wyjście:
<generator object getFibonnaciSeries at 0x0000007F39C8BA20> 0 1 1 2 3 5 8
Przykład: wywołanie funkcji z Yield
W tym przykładzie zobaczymy jak wywołać funkcję z wydajnością.
Poniższy przykład zawiera funkcję o nazwie test(), która zwraca kwadrat podanej liczby. Istnieje inna funkcja o nazwie getSquare(), która wykorzystuje test() ze słowem kluczowym Yield. Dane wyjściowe dają wartość kwadratową dla danego zakresu liczb.
def test(n): return n*n def getSquare(n): for i in range(n): yield test(i) sq = getSquare(10) for i in sq: print(i)
Wyjście:
0 1 4 9 16 25 36 49 64 81
Kiedy używać Yield zamiast Return in Python
Python3 Wydajność Słowo kluczowe zwraca generator do wywołującego, a wykonywanie kodu rozpoczyna się dopiero po iteracji generatora.
A powrót w funkcji oznacza koniec wykonywania funkcji, a wywołującemu zwracana jest pojedyncza wartość.
Oto sytuacja, w której powinieneś użyć Yield zamiast Return
- Użyj wydajności zamiast zwrotu, gdy rozmiar danych jest duży
- Yield to najlepszy wybór, gdy potrzebujesz szybszego wykonywania dużych zbiorów danych
- Użyj wydajności, jeśli chcesz zwrócić duży zestaw wartości do funkcji wywołującej
- Wydajność to efektywny sposób tworzenia dużych lub nieskończonych danych.
Wydajność a zwrot
Oto różnice między Yield i Return
Wydajność | Powrót |
---|---|
Yield zwraca obiekt generatora do wywołującego, a wykonywanie kodu rozpoczyna się dopiero w momencie iteracji generatora. | Powrót funkcji oznacza koniec wykonywania funkcji, a wywołującemu zwracana jest pojedyncza wartość. |
Gdy funkcja jest wywoływana i napotyka słowo kluczowe yield, wykonywanie funkcji zostaje zatrzymane. Zwraca obiekt generatora z powrotem do wywołującego. Wykonywanie funkcji rozpocznie się dopiero po wykonaniu obiektu generatora. | Po wywołaniu funkcji rozpoczyna się wykonywanie, a wartość jest zwracana wywołującemu, jeśli istnieje słowo kluczowe return. Powrót do wnętrza funkcji oznacza koniec wykonywania funkcji. |
wyrażenie plonu | wyrażenie zwrotne |
W przypadku użycia słowa kluczowego return nie jest używana żadna pamięć. | Pamięć jest przydzielana na zwróconą wartość. |
Bardzo przydatne, jeśli masz do czynienia z dużymi rozmiarami danych, ponieważ pamięć nie jest używana. | Wygodny w przypadku bardzo małych rozmiarów danych. |
Wydajność jest lepsza, jeśli słowo kluczowe Yield jest używane w przypadku dużych danych. | Jeśli rozmiar danych jest duży, zużywana jest duża ilość pamięci, co utrudnia wydajność. |
Czas wykonania jest szybszy w przypadku wydajności dla dużych rozmiarów danych. | Czas wykonania jest dłuższy, ponieważ wykonywane jest dodatkowe przetwarzanie w przypadku, gdy rozmiar danych jest duży, będzie działać dobrze w przypadku małych rozmiarów danych. |
Podsumowanie
- Słowo kluczowe yield w Pythonie działa jak return, z tą różnicą, że zamiast zwracać wartość, zwraca wywołującemu funkcję generatora.
- Generator to specjalny typ iteratora, który po użyciu nie będzie ponownie dostępny. Wartości nie są przechowywane w pamięci i są dostępne tylko po wywołaniu.
- Wartości z generatora można odczytać za pomocą metod for-in, list() i next().
- Główną różnicą pomiędzy yield i return jest to, że yield zwraca funkcję generatora do wywołującego, a return zwraca wywołującemu pojedynczą wartość.
- Yield nie przechowuje żadnych wartości w pamięci, a zaletą jest to, że jest pomocny, gdy rozmiar danych jest duży, ponieważ żadna wartość nie jest przechowywana w pamięci.
- Wydajność jest lepsza, jeśli użyte zostanie słowo kluczowe „profit” w porównaniu do zwracania danych o dużym rozmiarze.