Dowiedz się, jak ten alternatywny typ funkcji może pomóc w zmniejszeniu zużycia pamięci.
Jeśli czytasz wiersze z pliku dziennika lub przetwarzasz długą listę elementów, jedną z opcji jest załadowanie całych danych do pamięci. Jednak takie podejście może zużywać dużo pamięci i zmniejszać wydajność. Generatory oferują cenne rozwiązanie.
Generatory eliminują potrzebę jednoczesnego ładowania wszystkich danych do pamięci. Są przydatne podczas obsługi dużych zestawów danych, nieskończonych sekwencji lub w dowolnym scenariuszu, w którym najważniejsza jest wydajność pamięci.
Czym są generatory?
Generator to specjalna funkcja umożliwiająca iterację po sekwencji wartości. Zamiast zwracać pełny zestaw danych, generują — lub dają — jedną wartość na raz. Dzięki temu są wydajne w pracy z dużymi lub nieograniczonymi sekwencjami danych.
A zwykła funkcja Pythona zazwyczaj oblicza wartość i zwraca ją. Ale generatory działają inaczej. Mogą z biegiem czasu generować wiele wartości, wstrzymując i wznawiając wykonywanie pomiędzy kolejnymi wynikami.
Kluczowa różnica między funkcjami zwykłymi a generatorami polega na tym, że zamiast używać powrót słowo kluczowe generujące wynik, używają generatorów dawać.
Jak stworzyć generator
Aby utworzyć generator zamiast powrót stwierdzenie, użyj a dawać instrukcja wewnątrz funkcji. The dawać słowo kluczowe nie tylko instruuje funkcję, aby zwróciła wartość, ale także pozwala jej zapisać swój stan, umożliwiając wznowienie w przyszłości.
Oto przykład prostej funkcji generatora:
defnumeric_generator():
yield1
yield2
yield3
gen = numeric_generator()
Ta funkcja generatora zwraca wartości liczbowe od 1 do 3.
The dawać instrukcja zapisuje stan funkcji, zachowując zmienne lokalne pomiędzy wywołaniami, aby wznowić je, gdy zażądasz następnej wartości.
Przypisanie funkcji generatora do zmiennej tworzy obiekt generatora, z którym można pracować.
Praca z generatorami
Generatory mają wiele zastosowań. Możesz z nich skorzystać w pętlach for Lub w obrębie wyrażeń listowych, a także inne struktury iterowalne. Generatory mogą również służyć jako argumenty funkcji.
Po utworzeniu generatora możesz iterować po nim za pomocą pętli for:
for i in numeric_generator():
print(i)
Możesz także skorzystać z Następny funkcja do pobierania wartości jedna po drugiej:
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
Daje to większą kontrolę nad obiektem generatora.
Generatory mogą śledzić ich stan. Każda instrukcja Yield w funkcji działa jak punkt kontrolny. Kiedy zadzwonisz do Następny() funkcji na obiekcie generatora, wykonanie rozpoczyna się od poprzedniego punktu plastyczności.
Możesz także przekazywać wartości do generatora za pomocą wysłać():
defgenerator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")# Second yield: Receive another value
y = yield
print(f"Received: {y}")# Third yield: Yield the sum
yield x + ygen = generator_with_send()
# Start generator and reach first yield
next(gen)# Send 10 into generator, received at first yield
result = gen.send(10)# Send 5 into generator, received at second yield
result = gen.send(5)
# Print result of third yield
print(result)
The wysłać() Metoda umożliwia pobieranie wartości z generatora i wysyłanie wartości z powrotem do funkcji generatora, skutecznie ją wstrzymując i pozwalając kontrolować jej wykonanie. The wysłać() metoda jest przydatna podczas pisania współprogramów lub używania generatorów do celów zaawansowanych.
Korzystanie z wyrażeń generatora
Wyrażenia generatora zapewniają zwięzły sposób tworzenia prostego i anonimowego generatora. Są podobne do wyrażeń listowych, ale zamiast nawiasów używają nawiasów.
Oto przykład:
gen = (i**2for i in range(10))
for x in gen:
print(x)
Kod tworzy wyrażenie generatora, które zwraca kwadraty liczb od 0 do 9. Wyrażenia generatora są idealne do leniwego generowania sekwencji wartości.
Wykorzystanie generatorów do przetwarzania danych
Generatory Pythona to wygodny sposób opisywania strumieni danych i tworzenia iteratorów bez konieczności przechowywania wszystkiego w pamięci. Możesz znacznie ulepszyć swoje programowanie, ucząc się korzystania z generatorów, dzięki czemu łatwiej będzie Ci sprostać trudnym zadaniom przetwarzania danych.
Następnym razem, gdy będziesz pracować z dużymi zbiorami danych, pamiętaj o generatorach i deleguj im pracochłonne zadania, aby Twój kod pozostał responsywny i wydajny.