一、生成器
什么是生成器
生成的工具
生成器是一个“自定义”的迭代器,本质上是一个迭代器
如何实现生成器
但凡在函数内部定义的yield,调用函数时,函数体代码不会执行,会返回一个结果,返回的该结果就是一个生成器对象
关键字yield
翻译过来后的意思是(生成,产出)
yield只能在函数内部定义
每一次yield都会在生成器中添加一个值
yield可以保存函数的暂停状态
def func():
print('from func')
yield 'tank'
res = func()
# 当我们通过__next__取值的时候,才会执行函数体代码
print(res.__next__())#生成器内置有__iter__和__next__方法,所有生成器本身即是一个迭代器
from func
tank
自定义迭代器
有了yield,我们就有了一种自定义迭代器的实现方式
def func():
print('开始下蛋')
print('1---火鸡蛋1')
yield '火鸡蛋1'
print('2---火鸡蛋2')
yield '火鸡蛋2'
print('3---火鸡蛋3')
yield '火鸡蛋3'
print('取最后一个蛋,查看是否存在')
res = func()
print(next(res))
print(next(res))
print(next(res))
print(next(res)) #StopIteration报错
yield可以用于返回值,但不同于return
- yield和return
- 相同点:返回的值的个数是无限制的
- 不同点:return只能返回一次,函数遇到return就结束了
- yield可以保存函数的运行状态,用来返回多次值
二、三元表达式
三元表达式是Python为我们提供的一种简化代码的解决方案,语法如下
res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
例如:
def max2(x,y):
if x > y:
return x
else:
return y
res = max(1,2)
print(res)
2
三元表达式可以一行解决
x = 1
y = 2
res = x if x > y else y
print(res)
三、列表生成器
列表生成式是Python为我们提供的一种简化代码的解决方案,用来快速生成列表
可以一行实现生成列表
语法:
list = [ 值 for 可迭代对象中取出的每一个值 in 可迭代对象]
将list1 中的值,依次取出,添加到new_list1中
list1 = [1, 2, 3, 4, 5]
new_list1 = []
for i in list1:
new_list1.append(i)
print(new_list1)
[1, 2, 3, 4, 5]
列表生成式
list1 = [line for line in range(1,6)]
print(list1)
[1, 2, 3, 4, 5]
可以添加if判断
优点:取值方便,可以通过索引取值
缺点:浪费资源,占用内存空间
应用场景:根据优缺点,列表生成式在数据量小时采用
四、生成表达式
创建一个生成器对象有两种方式,一种调用带yield关键字的函数,另一种就是生成器表达式,与列表生成式的语法格式相同,只需要将[]换成()
语法:
g = (line for line in range(1,6))
对比列表生成式返回的是一个列表,生成器表达式返回的是一个生成器对象
list1 = [line for line in range(1,6)]
print(list1)
[1, 2, 3, 4, 5]
g = (line for line in range(1, 3))
print(g)
<generator object <genexpr> at 0x000001D4DF8BB1A8>
优点:节省资源,节省内存空间
缺点:取值不方便(每次取值都要从第一个值开始)
应用场景:根据优缺点,生成表达式在数据量过大时采用