您好,欢迎访问一九零五行业门户网

Python中迭代器和生成器的示例详解

迭代器iterable定义
class iterable(metaclass=abcmeta): __slots__ = () @abstractmethod def __iter__(self): while false: yield none @classmethod def __subclasshook__(cls, c): if cls is iterable: if any("__iter__" in b.__dict__ for b in c.__mro__): return true return notimplemented
由定义可知iterable必然包含__iter__函数
iterator定义
class iterator(iterable): __slots__ = () @abstractmethod def __next__(self): 'return the next item from the iterator. when exhausted, raise stopiteration' raise stopiteration def __iter__(self): return self @classmethod def __subclasshook__(cls, c): if cls is iterator: if (any("__next__" in b.__dict__ for b in c.__mro__) and any("__iter__" in b.__dict__ for b in c.__mro__)): return true return notimplemented
从定义可知iterator包含__next__和__iter__函数,当next超出范围时将抛出stopiteration事件
类型关系
#! /usr/bin/python #-*-coding:utf-8-*- from collections import iterator,iterable # 迭代器 s = 'abc' l = [1,2,3] d=iter(l) print(isinstance(s,iterable)) # true print(isinstance(l,iterable)) # true print(isinstance(s,iterator)) # false print(isinstance(l,iterator)) # false print(isinstance(d,iterable)) # true print(isinstance(d,iterator)) # true
理论上你可以使用next()来执行__next__(),直到迭代器抛出stopiteration 实际上系统提供了for .. in ..的方式来解析迭代器
l = [1,2,3,4] for i in l: print(i) # 执行结果 # 1 # 2 # 3 # 4
生成器 generator 生成器的本质是一个迭代器
#! /usr/bin/python #-*-coding:utf-8-*- from collections import iterator,iterable s = (x*2 for x in range(5)) print(s) print('is iterable:' + str(isinstance(s,iterable))) print('is iterator:' + str(isinstance(s,iterator))) for x in s: print(x) # 执行结果 # <generator object <genexpr> at 0x000001e61c11f048> # is iterable:true # is iterator:true # 0 # 2 # 4 # 6 # 8
函数中如果存在yield 则该函数是一个生成器对象 在每一次执行next函数时该函数会在上一个yield处开始执行,并在下一个yield处返回(相当于return)
def foo(): print("first") yield 1 print("second") yield 2 f = foo() print(f) a = next(f) print(a) b = next(f) print(b) # <generator object foo at 0x0000020b697f50f8> # first # 1 # second # 2
实例
#! /usr/bin/python #-*-coding:utf-8-*- def add(s,x): return s+x def gen(): for i in range(4): yield i base = gen() # 由于gen函数中存在yield,所以 # for 循环本质是创建了两个generator object,而非执行函数 # base = (add(i,10) for i in base) # base = (add(i,10) for i in base) for n in [1,10]: base = (add(i,n) for i in base) # 这里才开始展开生成器 # 第一个生成器展开 # base = (add(i,10) for i in base) # base = (add(i,10) for i in range(4)) # base = (10,11,12,13) # # 第二个生成器展开 # base = (add(i,10) for i in (10,11,12,13)) # base = (20,21,22,23) print(list(base)) # [20,21,22,23]
以上就是python中迭代器和生成器的示例详解的详细内容。
其它类似信息

推荐信息