列表推导式是什么?
类似于这样[x for x in range(101)],[x for x in range(10) if x % 2==0],[x*y for x in range(10) for y in range(10)]式子,就叫做列表推导式
列表推导式的好处就是能快速生成列表
列表推导式的好处就是浪费内存(空间复杂度太大),如果列表太过于庞大,它就会让大量无用的数据占据内存,所以我们应该用多少,生成多少
列表生成器
正因为列表推导式的一些弊端,为了弥补这些弊端,列表生成器产生了
如何将列表推导式装换为列表生成器,[ 列表推导式 ] --> (列表推导式) # 就会变成一个列表推导式
使用全局函数next,调用一次next,返回下一个值,直到最后抛出异常,这样就解决了列表推导式空间复杂度的问题
好处:节约内存
也可以使用循环迭代generator
生成器对象也存在一个__next__魔方方法,等价于next全局函数
如何将函数转换为列表生成器
函数转换为列表生成器
当列表生成时,需要大量代码来完成时,不可能使用列表推导式,一般使用函数完成,如:(斐波那契数列)
斐波那契数列:
从第三个元素开始,每一个元素是前两个元素之和
# 如果函数中使用yield关键字,那么这个函数的返回值就是一个生成器
ls = []
def feibo(n):
index = 0
first, second = 1, 1
while index<n:
yield first # 每执行一次next函数,就会返回一个first
ls.append(first)
first, second = second, first+second
index += 1
res=feibo(10)
print(next(res))
print(next(res))
print(next(res))
|-- yield关键字的作用
|-- 具有return的功能,能够返回一个函数的值
|-- 当一个函数出现yield,那么这个函数就被调用执行,而是返回值是一个生成器
next它返回值,不断地返回被yield的值
|-- yield值之后,会记住当前位置,下一次next函数调用生成器的时候,会在记住的位置
继续执行
下面是yield的执行顺序
def test_yeild(num):
print("yeild执行开始1")
index=0
while index<num:
print("yeild执行开始2")
yield "哈哈"
print("yeild执行结束")
index+=1
res= test_yeild(6)
print(next(res))
第一次执行的结果是:
def test_yeild(num):
print("yeild执行开始1")
index=0
while index<num:
print("yeild执行开始2")
yield "哈哈"
print("yeild执行结束")
index+=1
res= test_yeild(6)
print(next(res))
print(next(res))
第二次的执行结果是:
yield执行的规律是每次执行以yield处开始,以yield处结束