列表生成式 就是for的嵌套 实打实的生成全部【】
a = [n for n in range(1,5)]
a # [1,2,3,4]
生成器 采用惰性触发 是迭代器的一种 ()
列表生成式 只要一执行就生成全部的元素
元组生成器只有触发时才生成一个,相当于游标一直向下移动,直到stopIteration
(n for n in range(1,5))
def num(min,max):
for i in range(min,max):
yield i
a = num()#返回一个生成器对象而非调用
#调用方式1
a = num.send(None)#也可对返回值进行处理send('result') result5 这样连接
#调用方式2
next(a)
#等价
a.__next__()
#调用方式3
for i in num:
print(i)
- 单独谈谈send的使用规则
同next一样可以获得一个生成器元素内容,而且可以对 temp = yield i temp返回传入的值
但是
(1).第一次使用生成器的时候 是用next获取下一个值
(2).最后一个yield不能接受外部的值
def num():
i = 0
for i in range(5):
temp = yield i
print("-"+str(temp))
a = num()
# for i in num():
# print(i)
next(a)
print(a.send("resu"))#不能获取第一个生成器对象使用 他既可以返回生成器当前元素内容 游客对yield赋值
print(a.send("resu"))
print(a.send("resu"))
print(a.send("resu"))
print(a.send(None))
- 生成器和拆包语法实现斐波那契数列
def fiber():
a,b=0,1
for i in range(5):
yield (b)# 停止 和 返回b
a,b = b,a+b
a = fiber()
print(next(a))
- 使用生成器实现协程多任务
def func1():
while True:
print("1")
yield 1
def func2():
while True:
print("2")
yield 2
f1=func1()
f2=func2()
while True:
f1.__next__()
f2.__next__()
- 运行结果
反复 1 2 1 2 …
迭代器 可以使用next这种方法生成结果 只能向前 用一个才生成一个 节省内存
- 生成器就是迭代器 而可迭代的字符串 列表 元组 字典不是迭代器
- 迭代器可以使用for循环 这样可以不奔溃但是遍历出所有的值
def fiber():
a,b=0,1
for i in range(5):
yield (b)# 停止 和 返回b
a,b = b,a+b
for i in fiber():
print(i)
可迭代对象 包括能for循环 和 生成器
#判断是否为可迭代对象
from collections import Iterable
isintance([],Iterable)
- iter() 转换为可迭代对象
Python之列表生成式、生成器、可迭代对象与迭代器