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.

instagram viewer

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 + y

gen = 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.