迭代器和生成器

  1. 迭代器

列表、元组、字典和集合都是可迭代的对象,可以从其中获得迭代器。

所有这些对象都可用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

  1. 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的问题

  1. 生成器

  2. 只要函数存在 yield关键字
  3. 启动生成器 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的值

  1. 生成器接收值

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..

  1. 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..

www.baidu.com

www.google.com

2

 

原文地址:https://www.cnblogs.com/wenshu/p/12267153.html