傻傻分不清
可迭代对象
- 举例:容器如字符串、列表、元组、字典、集合,文件对象和管道对象,迭代器
- 可通过for..in来调用next方法进行遍历的对象
- 当我们对可迭代对象进行for...in循环时,实际是用iter()方法把它转化为迭代器后再next()返回
- 有限序列?
迭代器
- 为容器对象添加
__iter__()
和__next__()
方法(Python 2.7 中是next()
)
__iter__()
返回迭代器对象本身 self,__next__()
则返回每次调用next()或迭代时的元素; - 内置函数
iter()
将可迭代对象转化为迭代器 - 通过yield语句快速生成迭代器
生成器
- 迭代器的一种,即上面的第三种
- 两种类型:生成器函数(包含yield的函数)和生成器表达式(把列表生成式的[]改为())
- return关键词被yield取代,程序执行到 yield 会返回值并暂停,再次调用 next() 时会从上次暂停的地方继续开始执行。
是这样吗↓
普通函数
def sth():
result = []
for … in …
result.append(x)
return result
生成器函数
def iter_sth():
for … in …
yield x
迭代器构造
class Counter:
def __init__(self):
self.index = 0
def __iter__(self):
return self
def __next__(self):
i = self.index
if i < 10:
self.index += 1
return i
else:
raise StopIteration
counter = Counter()
for i in counter:
print(i)
让普通对象可迭代
class Name:
def __iter__(self):
return iter(['zhangsan', 'lisi', 'wangwu'])
name = Name()
for n in name:
print(n)