von Standard Funktionen None
Typen zurückgeben zu vermeiden.
def hello():
pass
def gen():
yield hello();
yield hello();
yield hello();
for x in gen():
print(x)
Ausgang:
None
None
None
Was Generatoren sind?
Der Hauptunterschied zwischen Generatoren und Funktionen besteht darin, dass Sie Werte während des Betriebs erhalten können. Und nach einem Wert ist yield
'durch den Generator. und der nächste Wert wird zurückgegeben, der alte ist nicht im Speicher gespeichert.
Iterieren über einen Generator
def hello():
for x in range(3):
yield x*x
for i in hello():
print(i)
Ausgang:
0
1
4
Jetzt next()
def hello():
for x in range(3):
yield x*x
gen = hello()
for i in range(3):
print(next(gen))
Ausgang mit:
0
1
4
So weit so gut. Recht? gen = hello()
Hier gen
wird ein Generatorobjekt.
Iterieren über eine Liste
my_list = [x*x for x in range(3)]
for i in my_list:
print(i)
Ausgang:
0
1
4
gleiche Leistung? Ja gleicher Ausgang. Aber nur hier Unterschied ist, dass ich die my_list
iterable beliebig oft verwenden kann, was ich will,
my_list = [x*x for x in range(3)]
for i in my_list:
print(i)
print("\n")
for i in my_list:
print(i)
Ausgang:
0
1
4
0
1
4
Allerdings, wenn ich versuche, den Generator zu verwenden, wenn sie erschöpft ist.
def hello():
for x in range(3):
yield x*x
gen = hello()
for i in range(3):
print(next(gen))
next(gen)
Ausgabe
0
1
4
Traceback (most recent call last):
File "/home/mr/sadas.py", line 12, in <module>
print(next(gen))
StopIteration
Wie dies zu überwinden? Erstellen Sie ein neues Generatorobjekt erneut und verwenden Sie.
def hello():
for x in range(3):
yield x*x
gen = hello()
for i in range(3):
print(next(gen))
gen = hello()
for i in range(3):
print(next(gen))
Ausgang:
0
1
4
0
1
4
Sie sehen den Unterschied? Hoffe ich war klar.
'hallo()' gibt nicht zurück => gibt implizit 'None' zurück. 'Hallo() ist keine' – falsetru
Vielleicht meintest du das:' def hallo(): zurück "hallo" '? – falsetru
Ich empfehle, Funktionen zuerst zu lesen. –