初识生成器

  只要函数中有yield的,就是生成器函数,(生成器函数只是生成可迭代的对象).

  yield的特性:

        1.和return差不多,都可以做返回值.

        2.只要在函数执行的过程中遇到了yield,就会暂停这个函数的运行,并返回yield后面值

        3.下次再执行这个函数就会从上一次暂停的地方重新往下执行

# def outer():
# 	print("马云")
# 	yield '阿里巴巴'
# 	print('马化腾')
# 	yield '腾讯'
# 	print('刘强东')
# 	yield '京东'

# ger = outer()
# print(ger)      # 生成的是一个生成器
# <generator object outer at 0x0000000002761F10>

 如何使用这个生成器 

   生成器是生成一个可迭代的对象,之前的list,str,dict等都是可迭代的对象,方法一致.

  2.1 方法一 

# r1 = ger.__next__()     # 执行"__next__"是打印第一个yield之前的内容,r1接受的是第一个yield的返回值
# print(r1)
# 结果:
# 马云
# 阿里巴巴

# 每一次执行生成器的"__next__"就是执行到下一个yield的出现
# r2 = ger.__next__()
# print(r2)
# 结果:
# 马云
# 阿里巴巴
# 马化腾
# 腾讯

  

  2.2 方法二

def outer():
	print("马云")
	yield '阿里巴巴'
	print('马化腾')
	yield '腾讯'
	print('刘强东')
	yield '京东'

ger = outer()       # 这就是生成器函数"outer"的迭代器
for i in ger:       #只要是可迭代的对象,for循环都可以进行迭代,迭代器既是可迭代对象,也是迭代器,所以可以使用for循环
	print(i)
# 结果:
# 马云
# 阿里巴巴
# 马化腾
# 腾讯
# 刘强东
# 京东

  2.3 方法三

  

def outer():
	print("马云")
	yield '阿里巴巴'
	print('马化腾')
	yield '腾讯'
	print('刘强东')
	yield '京东'

ger = outer()
print(list(ger))        # 把yield的返回值放进一个列表,并以此执行函数里的代码

send使用

def outer():
	print("马云")
	a = yield '阿里巴巴'
	print('我是a',a)
	print('马化腾')
	b = yield '腾讯'
	print('我是b',b)
	print('刘强东')
	yield '京东'


ger = outer()
ger.__next__()
ger.send("a")       
ger.send("b")
# 结果:
# 马云
# 我是a a
# 马化腾
# 我是b b
# 刘强东

  

send的执行过程

  生成器函数及生成器的基本用法-冯金伟博客园

   3.2 __next__() 和 .send() 的区别,和注意事项

    1.send和next都是让生成器往下在执行一个yield.

    2.send可以上一个yield的位置传递一个值,不能给最后一个yield传递值,因为yield是给上一个yield传递一个值,所以第一次访问生成器,不能是send,只能是__next__()

生成器表达式

# 生成器表达式
# gen = (n for n in range(1,6))
# print(gen)      # gen是一个迭代器.迭代器需要使用"__next__"或迭代,来访问生成器里面的代码.
# 结果:<generator object <genexpr> at 0x00000000028120A0>