迭代
一、生成器:
''' 在 Python 中,使用了 yield 的函数被称为生成器(generator) 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息, 返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行 注意:生成器特别适合用于选历 一些大序列对象, 它无须将对象的所有元素都载入内存后才 开始进行操 作,仅在迭代至某个元素时才会将该元素载入 内存 ''' def square(num): for i in range(1, num + 1): yield i * i print('over') # return # 函数已经结束,不能继续调用。return可以省略 g = square(5) print(next(g)) print(next(g)) print(next(g)) print(g.__next__()) print(g.__next__()) # next(g) 等价于 g.__next__() # print(next(g)) 已经over了,继续迭代会抛出:StopIteration for i in square(5): print(i, end=' ') print() g = lambda a, b: a + b print(g(1, 2)) # ------------------------------------------------------------ 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 是一个迭代器,由生成器返回生成 既然f是一个迭代器,那么就可以把f包装成一个list或tuple或set l = list(f) # 确实可行 for i in f: print(i, end=' ') # 也可以用下面的方法迭代 # import sys # while True: # try: # print(next(f), end=" ") # except StopIteration: # sys.exit() 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)
二、迭代器:
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__()
class Test: def __init__(self): self.__a = 0 # 这里赋值是因为如果不用iter和for in,直接用next(Test()) 或者 Test().__next__() 时就不会调用__iter__ 方法。 def __iter__(self): # 把对象装载进iter的时候或者for in 时会调用这个方法:it = iter(t) # 但是,如果用next(Test()) 或者 Test().__next__() 时就不会调用__iter__ 方法。,所以,需要在构造函数中给__a赋值。 print('iter') self.__a = 1 return self def __next__(self): # 循环迭代的时候,会调用这个方法。 if self.__a < 10: self.__a += 1 return self.__a else: raise StopIteration t = Test() # Test本来就是一个迭代器,可以直接for in了,不需要再用iter包装。 it = iter(t) for i in it: print(i) tt = Test() print(next(tt)) print(next(tt)) print(next(tt))

浙公网安备 33010602011771号