Научете как този алтернативен тип функция може да ви помогне да намалите отпечатъка от паметта.

Ако четете редове от лог файл или обработвате дълъг списък от елементи, една от възможностите е да заредите всички данни в паметта. Този подход обаче може да използва много памет и да попречи на производителността. Генераторите предлагат ценно решение.

Генераторите премахват необходимостта от зареждане на всички данни в паметта едновременно. Те са полезни при работа с големи набори от данни, безкрайни последователности или всеки сценарий, при който ефективността на паметта е от първостепенно значение.

Какво представляват генераторите?

Генераторът е специална функция, която ви позволява да обхождате поредица от стойности. Вместо да върнат пълен набор от данни, те генерират - или дават - една стойност наведнъж. Това ги прави ефективни за работа с големи или неограничени поредици от данни.

А обикновена функция на Python обикновено изчислява стойност и я връща. Но генераторите работят по различен начин. Те могат да дадат множество стойности с течение на времето, като поставят на пауза и възобновяват изпълнението между всеки добив.

instagram viewer

Ключовата разлика между обикновените функции и генераторите е, че вместо използването на връщане ключова дума за генериране на резултат, използвана от генераторите добив.

Как да създадете генератор

За да създадете генератор, вместо връщане изявление, използвайте a добив израз в рамките на функцията. The добив ключовата дума не само инструктира функцията да върне стойност, но също така й позволява да запази състоянието си, което позволява бъдещо възобновяване.

Ето пример за проста генераторна функция:

defnumeric_generator():
yield1
yield2
yield3

gen = numeric_generator()

Тази генераторна функция дава числови стойности от 1 до 3.

The добив операторът записва състоянието на функцията, като запазва локалните променливи между извикванията, за да продължи, когато поискате следващата стойност.

Присвояването на генераторна функция на променлива създава генераторен обект, с който можете да работите.

Работа с генератори

Генераторите имат множество приложения. Можете да ги използвате във for цикли или в рамките на списък разбирания, както и други итерируеми структури. Генераторите могат да служат и като аргументи за функции.

След като създадете генератор, можете да го повторите, като използвате for цикъл:

for i in numeric_generator():
print(i)

Можете също да използвате следващия функция за извличане на стойности една по една:

print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3

Това ви дава повече контрол върху генераторния обект.

Генераторите могат да следят състоянието си. Всяко изявление за доходност във функция действа като контролна точка. Когато се обадите на следващия() функция на генераторния обект, изпълнението започва от предишната точка на добив.

Можете също да предавате стойности в генератор, като използвате изпрати ():

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 изпрати () метод ви позволява да извличате стойности от генератора и да изпращате стойности обратно във функцията на генератора, като ефективно я поставяте на пауза и ви позволява да контролирате нейното изпълнение. The изпрати () методът е удобен при писане на съпрограми или използване на генератори за разширени цели.

Използване на генераторни изрази

Изразите на генератора предоставят кратък начин за създаване на прост и анонимен генератор. Те са подобни на списъчните разбирания, но използват скоби вместо скоби.

Ето един пример:

gen = (i**2for i in range(10))

for x in gen:
print(x)

Кодът създава генераторен израз, който дава квадратите на числата от 0 до 9. Генераторните изрази са идеални за лениво генериране на поредица от стойности.

Използване на генератори за обработка на данни

Генераторите на Python са удобен начин за описване на потоци от данни и изграждане на итератори, без да съхранявате всичко в паметта. Можете значително да подобрите програмирането си, като се научите да използвате генератори, което улеснява справянето с предизвикателни задачи за обработка на данни.

Следващият път, когато работите с големи набори от данни, имайте предвид генераторите и им делегирайте трудоемките задачи, така че вашият код да остане отзивчив и ефективен.