-
迭代器
列表、元组、字典和集合都是可迭代的对象,可以从其中获得迭代器。
所有这些对象都可用iter()方法获取迭代器.
例如:
name = [1,2,3,4,5,6,7,8]
name = iter(name)
next(name)
for i in name:
print(i)
>>> 2,3,4,5,6,7,8
-
StopIteration
name = [1,2,3,4,5,6,7,8]
name = iter(name)
while True:
try:
next(name)
except StopIteration:
break
可以使用StopIteration语句停止迭代,for循环底层使用next进行调用并解决了StopIteration的问题
-
生成器
- 只要函数存在 yield关键字
- 启动生成器 next() 或者 for 或者send()
使用生成器实现斐波拉契数列:
def gen_fib(index):
n,a,b = 0,0,1
while n<index:
yield b
a,b = b,a+b
n+=1
for i in gen_fib(5):
print(i)
例如:
def gen_func():
yield 1
return "name"
gen = gen_func()
print(next(gen))
try:
next(gen)
except StopIteration as e:
print(e.value)
e.value 获取函数的返回值
next(gen) 启动生成器yield,返回值为yield的值
- 生成器接收值
def gen():
print("start..")
html = yield "www.baidu.com"
print(html)
yield 2
return "end.."
gen = gen()
url_00 = next(gen) #启动第一个生成器,url_00是第一个生成器yield出来的值
print(url_00)
url_01 = gen.send("www.google.com") #传值给html ,并启动第二个生成器,url_01是第二个生成器yield出来的值.
print(url_01)
try:
next(gen)
except StopIteration as e:
print(e.value) #获取函数返回值
Result:
start..
www.baidu.com
www.google.com
2
end..
- Send
注意:在调用send的时候,如果这时没有启动过生成器,send需要发送 None 值
例如:
def gen():
print("start..")
html = yield "www.baidu.com"
print(html)
yield 2
return "end.."
gen = gen()
url_00 = gen.send(None)
print(url_00)
url_01 = gen.send("www.google.com")
print(url_01)
result:
start..
2