Python迭代器和生成器
Python 支持在容器中进行迭代,关于迭代的概念有"可迭代对象"、"迭代器"和"生成器"。
1、可迭代对象(iterable)
-
可迭代协议:如果一个对象实现了
__iter__()方法,那么这个对象就是一个可迭代对象; -
可以通过
iter(iterable)或者iterable.__iter__(),返回一个迭代器对象; -
可迭代对象可以使用
iter()函数,不能使用next()函数,可迭代对象可以被for循环; -
Python 中,str、list、tuple、dict、set都是可迭代对象;
-
验证实例:
dir('Hello, World!') # 查看str对象实现了那些方法 -
输出结果:可以看到有
__iter__;['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
2、迭代器(iterator)
-
迭代器协议:如果一个对象实现了
__iter__()和__next__()两个方法,那么该对象就是一个迭代器对象; -
可以通过
next(iterator)或者iterator.__next__(),返回迭代器对象的下一个值; -
当迭代器被迭代完,没有下一项可返回时,会触发
StopIteration异常; -
验证实例:
s = "Hello, World!" s = iter(s) type(s) dir(s) -
输出结果:可以看到
s是一个str_iterator对象,包含__iter__、__next__两个方法;<class 'str_iterator'> ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']
3、生成器(generator)
-
生成器是一种更优雅、实现方式简单的迭代器;
-
生成器有两种实现方式:
第1种,使用常规函数定义,用
yield返回结果;def g(n): for i in range(n): yield i验证
g(n)对象的类型:type(g(10))输出:
<class 'generator'>
第2种,使用生成器表达式:g = (i for i in range(10))验证
g对象的类型:type(g)输出:
<class 'generator'>

浙公网安备 33010602011771号