生成器

一、生成器

什么是生成器

​ 生成的工具

生成器是一个“自定义”的迭代器,本质上是一个迭代器

如何实现生成器

​ 但凡在函数内部定义的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>

优点:节省资源,节省内存空间

缺点:取值不方便(每次取值都要从第一个值开始)

应用场景:根据优缺点,生成表达式在数据量过大时采用

原文地址:https://www.cnblogs.com/YGZICO/p/11889287.html