Ceux avec la méthode __iter__
intégrée sont appelés objets itérables. __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 #hello
__iter__
de l'objet itérable, et la valeur de retour obtenue est l'objet itérateur. Seules les chaînes et les listes reposent sur des valeurs d'index, tandis que les autres objets itérables ne peuvent pas s'appuyer sur des valeurs d'index et ne peuvent utiliser que des objets itérateurs. Il existe une méthode __iter__
intégrée, et l'exécution de cette méthode obtiendra l'itérateur lui-même. Méthode __next__
intégrée, l'exécution de cette méthode obtiendra une valeur dans l'objet itérateur. s = 'hello' iter_s = iter(s) # 创建迭代器对象 print(type(iter_s)) # iter_s为迭代器对象 while True: try: print(next(iter_s)) # 输出迭代器的下一个元素 except StopIteration: break # hello
#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)
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
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
import 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()
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)}")
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
t = (i for i in range(10)) print(t) # <generator object at 0x00000000026907B0> print(next(t)) # 0 print(next(t)) # 1
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.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!