for_loop.py
for i in [0, 1, 2, 3, 4]:
print(i)
Wenn du rennst
% python for_loop.py
0
1
2
3
4
for i in
Ich möchte wissen, wie das Ding dahinter benutzt wird.
(Im obigen Beispiel scheinen die Elemente von "[0, 1, 2, 3, 4]" der Reihe nach extrahiert worden zu sein.)
Mal sehen, wie es in Bezug auf den Laufzeitfehler getroffen wird
duck.py
class Duck(object):
pass
if __name__ == '__main__':
for i in Duck():
print(i)
Wenn ich es starte, werde ich wütend, wenn es nicht iterierbar ist
% python duck.py
Traceback (most recent call last):
File "duck.py", line 6, in <module>
for i in Duck():
TypeError: 'Duck' object is not iterable
`__ iter__ ()`
Mir wurde gesagt, ich solle es implementieren, also werde ich es implementieren. Aber geben Sie einfach ein leeres Objekt zurück
duck.py
class DuckIter(object):
def __init__(self):
pass
class Duck(object):
def __iter__(self):
return DuckIter()
if __name__ == '__main__':
for i in Duck():
print(i)
Der Fehler hat sich geändert (ein Schritt vorwärts!)
% python duck.py
Traceback (most recent call last):
File "duck.py", line 12, in <module>
for i in Duck():
TypeError: iter() returned non-iterator of type 'DuckIter'
next ()
`` Methode`__next__ ()`
Versuche dreimal zu quietschen.
duck.py
class DuckIter(object):
def __init__(self):
self._count = 3
def next(self):
if self._count > 0:
self._count -= 1
return "quack"
raise StopIteration()
class Duck(object):
def __iter__(self):
return DuckIter()
if __name__ == '__main__':
for i in Duck():
print(i)
Keine Fehler mehr beim Ausführen
% python duck.py
quack
quack
quack
Die Ente klingelte!
If it walks like a duck and quacks like a duck, it must be a duck https://ja.wikipedia.org/wiki/ダック・タイピング
Das Objekt selbst bestimmt, was das Objekt tun kann (Unabhängig davon, welche Erbschaft sie haben)
Im Fall des vorherigen Beispiels
`__ iter__ ()`
Methode hat.
next () `` `Methode hat.Dies ermöglichte es uns, die for-Schleife zu drehen:
for i in Duck():
print(i)
Diese Notation entspricht in etwa der folgenden
iter = Duck().__iter__()
while True:
try:
i = iter.next()
print(i)
except StopIteration:
break
Mit anderen Worten, der Verarbeitungsablauf der for-Schleife
Lassen Sie uns ein Objekt mit Iterator in umgekehrter Reihenfolge aus der Liste erstellen
>>> lst = [0, 1, 2, 3, 4]
>>> rev = RevList(lst)
>>> for r in rev:
... print(r)
...
4
3
2
1
0
Trinkgeld:
next ()
Methode" mit ``
iter ()` `` erhalten`next ()`
kehrt vom Ende der ursprünglichen Liste zurückclass RevListIter(object):
def __init__(self, lst):
self._orig = lst
self._i = len(lst)
def next(self):
if self._i > 0:
self._i -= 1
return self._orig[self._i]
raise StopIteration()
class RevList(object):
def __init__(self, lst):
self._orig = lst
def __iter__(self):
return RevListIter(self._orig)
if __name__ == '__main__':
lst = [0, 1, 2, 3, 4]
rev = RevList(lst)
for r in rev:
print(r)
class RevList(object):
def __init__(self, lst):
self._orig = lst
def __iter__(self):
return self._orig[::-1].__iter__()
if __name__ == '__main__':
lst = [0, 1, 2, 3, 4]
rev = RevList(lst)
for r in rev:
print(r)
Erstellen wir einen Iterator, der jedes Element einer Liste von Ganzzahlen quadriert
>>> lst = [0, 1, 2, 3, 4]
>>>für mich in etwas(lst):
... print(i)
...
0
1
4
9
16
>>> lst = [0, 1, 2, 3, 4]
>>> for i in [x*x for x in lst]:
... print(i)
...
0
1
4
9
16
>>> for i in (x*x for x in lst):
... print(i)
...
0
1
4
9
16
Beides sind Lösungen. Lassen Sie uns den Unterschied zwischen den beiden sehen.
Notation
[f(x) for x in lst]
Beispielcode
list_comprehension.py
def f(x):
print("%d*%d" % (x, x))
return x*x
if __name__ == '__main__':
lst = [0, 1, 2, 3, 4]
x = [f(x) for x in lst]
print(type(x))
for i in x:
print(i)
Ausführungsergebnis
% python list_comprehension.py
0*0
1*1
2*2
3*3
4*4
<type 'list'>
0
1
4
9
16
Notation
(f(x) for x in lst)
Beispielcode
generator_expression.py
def f(x):
print("%d*%d" % (x, x))
return x*x
if __name__ == '__main__':
lst = [0, 1, 2, 3, 4]
x = (f(x) for x in lst)
print(type(x))
for i in x:
print(i)
Ausführungsergebnis
% python generator_expression.py
<type 'generator'>
0*0
0
1*1
1
2*2
4
3*3
9
4*4
16
__iter__ ()
,
next ()
`wird iterable abgeschlossen.Recommended Posts