生成器
格式:
(表达式 for 变量参数 in 序列对象)
gen = (x * 2 for x in range(5))
print(gen, type(gen))
使用next()函数获取generator对象的数据内容
print(next(gen))
对于generator对象而言:
生成的每个元素只能被调用(使用)一次,调用完毕了,不可逆。如果generator中元素已经全部被使用过了(一次),再去通过next()方法调用的话,会报错 --> stopIteration
将generator对象转为一个列表对象
lt = list(gen)
方式二:
定义函数,函数体中需要配合yield关键字来返回数据
def demo(n):
lt = []
for x in range(1, n + 1):
lt.append(x)
yield x
return lt
#需求:实现全排列
str1 = ‘ABCD’
str2 = ‘WXYZ’
def func(str1,str2):
for i in str1:
for j in str2:
yield i + j
f = func(str1,str2)
print(f)
for x in f:
print(x)
gen = (x + y for x in str1 for y in str2)
for y in gen:
print(y)
生成器:
生成器对象内部封装了一套算法(生成数据的),只有等到需要调用(使用)数据的时候,
才会真正的去解析算法,将数据加入到内存中;
注意:内部的数据只能被调用(使用)一次
说一说:生成器和列表生成式的区别?
生成器:
执行完毕以后生成一个生成器(generator)对象,
此时这个对象中并没有具体真实的数据;
等到你想要去使用的使用,它才会解析表达式(算法)将数据进入内存,
由于数据并不直接存在内存中,所以它几乎不需要消耗过多的内存空间,
但是运算数据的效率比列表生成式稍逊一筹
列表生成式:
执行完毕以后得到一个列表对象,
此时这个对象中已经确定了每个元素的内容(进内存了),
由于数据已经在内存中,所以它占用内存空间比较多;
但是运算数据的效率比生成器好优秀