可迭代对象
- 获取迭代器中可迭代对象
迭代器 = iter(可迭代对象)
- 通过迭代器获取下一个元素的值
下一个元素的值 = next(可迭代对象)
- 实现可迭代对象
类中实现__iter__方法(提供迭代器)
迭代器
实现迭代器
- 类中实现__next__方法:提供下一个元素的值
- 类中实现__iter__方法:python官方规定迭代器也是一种可迭代对象
import time
class MylistIter(object):
"""迭代器类"""
def __init__(self,data):
self.data = data
self.index = 0
def __next__(self):
# 当迭代完成时,应该抛出异常StopIteration
if self.index == len(self.data):
raise StopIteration
else:
ret = self.data[self.index]
self.index += 1
return ret
def __iter__(self):
"""迭代器也是一个可迭代对象"""
return self
class Mylist(object):
"""可迭代对象"""
def __init__(self):
self.data = [1,2,3,4,5]
def __iter__(self):
"""提供一个迭代器"""
mi = MylistIter(self.data)
return mi
# 实例对象list
list = Mylist()
li = iter(list)
while True:
try:
i = next(li)
except StopIteration as exp:
break
else:
print(i)
time.sleep(1)
结果:
生成器
- 概念:一种特殊的迭代器
- 生成器的两种表达方式:
①生成器表达式:
②生成器函数含有yield关键字的函数
yield关键字的作用
- 挂起当前代码,将yield后面的值返回到调用生成器对象的地方
- 当再次唤醒生成器代码时,yield能够恢复代码,从上次运行的地方紧接着运行
- 接收额外数据,赋值给yield等号左边的值
唤醒生成器的两种方式
- 下一个元素的值 = next(生成器对象)
- 生成器对象.send(data)——使用yield接收消息
注意事项:第一次唤醒生成器,必须使用next( ),因为生成器代码刚开始运行时,没有yield接收消息
def fib(n):
"""生成器函数"""
current = 0
num1, num2 = 0, 1
while current < n:
num = num1
num1, num2 = num2, num1+num2
current += 1
data = yield num
print("收到数据: %s" % data)
return "Done"
li = iter(fib(10))
# 第一种唤醒生成器的方法:next(生成器对象)
data = next(li)
print(data)
# 第二种唤醒生成器的方式:生成器对象.send(发送的数据)
i = li.send("Hello")
print(i)
结果: