Heim > Artikel > Backend-Entwicklung > Verwendung von Iteratoren und Generatoren in Python
Diejenigen mit integrierter __iter__
-Methode werden als iterierbare Objekte bezeichnet. __iter__
方法的都叫可迭代的对象。
Python内置str、list、tuple、dict、set、file都是可迭代对象。
x = 1.__iter__ # SyntaxError: invalid syntax # 以下都是可迭代的对象 name = 'nick'.__iter__ print(type(name)) # 'method-wrapper'>
执行可迭代对象的__iter__
方法,拿到的返回值就是迭代器对象。
只有字符串和列表都是依赖索引取值的,而其他的可迭代对象都是无法依赖索引取值的,只能使用迭代器对象。
内置有__iter__
方法,执行该方法会拿到迭代器本身。
内置__next__
s = 'hello' iter_s = s.__iter__() print(type(iter_s)) # 'str_iterator'> iter_s为迭代器对象 while True: try: print(iter_s.__next__()) except StopIteration: break #hello2. Iteratorobjekt Führen Sie die
__iter__
-Methode des iterierbaren Objekts aus, und der erhaltene Rückgabewert ist das Iteratorobjekt. Nur Zeichenfolgen und Listen basieren auf Indexwerten, während andere iterierbare Objekte nicht auf Indexwerten basieren und nur Iteratorobjekte verwenden können.
Es gibt eine integrierte __iter__
-Methode, und durch die Ausführung dieser Methode wird der Iterator selbst abgerufen.
Eingebaute __next__
-Methode. Durch die Ausführung dieser Methode wird ein Wert im Iteratorobjekt abgerufen. s = 'hello' iter_s = iter(s) # 创建迭代器对象 print(type(iter_s)) # iter_s为迭代器对象 while True: try: print(next(iter_s)) # 输出迭代器的下一个元素 except StopIteration: break # hello3. Iteratoren haben zwei grundlegende Methoden: iter() und next().
#str name = 'nick' for x in name: print(x) #list for x in [None, 3, 4.5, "foo", lambda: "moo", object, object()]: print("{0} ({1})".format(x, type(x))) #dict d = { '1': 'tasty', '2': 'the best', '3 sprouts': 'evil', '4': 'pretty good' } for sKey in d: print("{0} are {1}".format(sKey, d[sKey])) #file f = open('32.txt', 'r', encoding='utf-8') for x in f: print(x) f.close()
class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): if self.a <= 20: x = self.a self.a += 1 return x else: raise StopIteration myclass = MyNumbers() myiter = iter(myclass) for x in myiter: print(x)5. Implementieren Sie Iteratoren (__next__ und __iter__)
class Range: def __init__(self, n, stop, step): self.n = n self.stop = stop self.step = step def __next__(self): if self.n >= self.stop: raise StopIteration x = self.n self.n += self.step return x def __iter__(self): return self for i in Range(1, 7, 3): print(i) #1 #4#🎜🎜 # 1. Simulationsbereich
class Fib: def __init__(self): self._a = 0 self._b = 1 def __iter__(self): return self def __next__(self): self._a, self._b = self._b, self._a + self._b return self._a f1 = Fib() for i in f1: if i > 100: break print('%s ' % i, end='') # 1 1 2 3 5 8 13 21 34 55 89
2. Fibonacci-Sequenzimport sys
def fibonacci(n): # 函数 - 斐波那契
a, b, counter = 0, 1, 0
while True:
if counter > n:
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(10) #f 是一个生成器
print(type(f)) # 'generator'>
while True:
try:
print(next(f), end=" ")
except StopIteration:
sys.exit()
2. Generator
def my_range(start, stop, step=1): while start < stop: yield start start += 1 g = my_range(0, 3) print(f"list(g): {list(g)}")Yield und Return: sind gleich: beide befinden sich innerhalb der Funktion Use, you kann einen Wert zurückgeben, und es gibt keine Begrenzung für die Art oder Anzahl der Rückgabewerte Der Unterschied: return kann einen Wert nur einmal zurückgeben; yield kann mehrere Werte zurückgeben # 🎜🎜#
2. Benutzerdefinierte range()-Methode
def range(*args, **kwargs): if not kwargs: if len(args) == 1: count = 0 while count < args[0]: yield count count += 1 if len(args) == 2: start, stop = args while start < stop: yield start start += 1 if len(args) == 3: start, stop, step = args while start < stop: yield start start += step else: step = 1 if len(args) == 1: start = args[0] if len(args) == 2: start, stop = args for k, v in kwargs.items(): if k not in ['start', 'step', 'stop']: raise ('参数名错误') if k == 'start': start = v elif k == 'stop': stop = v elif k == 'step': step = v while start < stop: yield start start += step for i in range(3): print(i) # 0,1,2 for i in range(99, 101): print(i) # 99,100 for i in range(1, 10, 3): print(i) # 1,4,7 for i in range(1, step=2, stop=5): print(i) # 1,3 for i in range(1, 10, step=2): print(i) # 1,3,5,7,9#🎜🎜#Komplexe Version: #🎜🎜#
t = (i for i in range(10)) print(t) # <generator object at 0x00000000026907B0> print(next(t)) # 0 print(next(t)) # 1#🎜🎜#3. Generatorausdruck (i .for .in)#🎜🎜##🎜🎜#Ersetzen Sie [] im Listenverständnis durch (), um einen Generatorausdruck zu erhalten. #🎜🎜##🎜🎜#Vorteile: Im Vergleich zu Listenverständnissen kann es Speicher sparen und generiert jeweils nur einen Wert im Speicher #🎜🎜#
with open('32.txt', 'r', encoding='utf8') as f: nums = [len(line) for line in f] # 列表推导式相当于直接给你一筐蛋 print(max(nums)) # 2 with open('32.txt', 'r', encoding='utf8') as f: nums = (len(line) for line in f) # 生成器表达式相当于给你一只老母鸡。 print(max(nums)) # ValueError: I/O operation on closed file.#🎜🎜#Beispiel: #🎜🎜#rrreee
Das obige ist der detaillierte Inhalt vonVerwendung von Iteratoren und Generatoren in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!