Python生成器
生成器:自动实现迭代器功能的,叫生成器
1生成器语法上和函数类似
2自动实现迭代器协议
3状态挂起:使用yield代替返回值,可挂起该生成器函数的状态
#生成器函数的send()方法(这个感觉比较重要,放前面了) def sayHi(): #用yield代替return,可以返回多个yield yield "好1" # x = yield 可以接收send传过来的值,赋值给x x = yield print("yield2 = ",x) yield "好3" hello_python = sayHi() #打印第1个返回结果yield的值“好1”没问题 print(hello_python.__next__()) #打印第2个返回结果yield的值“None”是为什么呢,因为yield2还没有赋值 print(hello_python.__next__()) #打印第3个返回结果yield的值“好3”没问题,执行send之前第2个yield的值未有值, # 执行send后,函数从第2个yield后开始执行,于是第2个yield就有了值,并执行到第3个yield值,完成,看不懂多看几遍吧 print(hello_python.send("就你2"))
生成器函数:
#生成器函数 def sayHi(): #用yield代替return,可以返回多个yield yield "好" yield "你们挺好啊" yield "你好" hello_python = sayHi() print(sayHi().__next__()) print(sayHi().__next__()) print("-" * 50) print(hello_python.__next__()) print(hello_python.__next__()) print(hello_python.__next__())
生成器三元表达式(多一元都不行)
#生成器三元表达式(多一元都不行) name = "candy" name = "james" #满足结果放前面(一元),条件判断满足(一元),不满足结果放最后面(一元) res = "Good" if name == "candy" else "bad" print(res)
生成器表达式:
#生成器表达式(二元即可,但不能超过三元): l = ("号码:%s" %i for i in range(9)) print(l.__next__()) print(l.__next__())
列表解析(list解析):
#列表list解析(生成器表达式+[]就变成列表解析了?,就是把结果放到list里,如果这个值过大,电脑就会炸) #结果放前面(一元),过程放中间(一元),条件放后面(三元) ll = ["号码:%s" %i for i in range(9) if i > 5 ] print( ll )