Python genetor(生成器)--yield 用法

2022/2/5 14:14:02

本文主要是介绍Python genetor(生成器)--yield 用法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  1. 迭代--一个接一个地读取列表中值的过程
list1=[1,2,3]
for i in list1:
    print(i,end='  ')

  # 1 2 3

list2=[x*x for x in range(5)]
for i in list2:
    print(i,end=' ')

  # 0 1 4 9 16

上述代码当迭代次数为500万时,每一个值都需要放在内存里,非常消耗资源,为了节省内存资源,产生了Python Generator。

   2. Python Generator--用多少生成多少,用完就扔掉,(只能用一次)--解决了资源消耗问题

#创建生成器
data_generator=(x*x for x in range(5))
data_generator

#<generator object <genexpr> at 0x00000168EE7BCF90>

# 生成器用法
for i in data_generator:
    print(i ,end=' ')
# 0 1 4 9 16 

#第二次迭代
for i in data_generator:
    print(i ,end=' ')
# 
#注,什么也没有

#区别列表
data_generator=[x*x for x in range(5)]
data_generator
 
#[0, 1, 4, 9, 16]

  3. yield用法--- 生成器原理

yield与return类似

return expression --直接退出方法(函数),并返回expression 的值

yield也是返回值,但返回的是一个generator,generator当前值就是yield后面跟的表达式的值

每一个generator对象都有一个隐含方法.__next__() --可以单独调用,该方法的返回值就是yield后面表达式的值。

# 输出所有不大于max的偶数
def generator_even(max):
    for i in range(0,max+1):
        if i % 2==0:
            yield i

#generator_even(10)
#<generator object generator_even at 0x00000168EFB2A510>

 

generator_even=generator_even(10)
for i in generator_even:
    print(i,end=' ')
#0 2 4 6 8 10  
#seconds times
for i in generator_even:
    print(i,end=' ')
    
#什么也没有输出

  

 

关于容易出现的报错:--从定义的函数开始,从新跑一边

 

 

def generator_even(max):
    for i in range(0,max+1):
        if i % 2==0:
            yield i

even_generator=generator_even(10)
even_generator.__next__()
# 0
even_generator.__next__()
#2
even_generator.__next__()
#4
even_generator.__next__()
6
even_generator.__next__()
# 8
even_generator.__next__()
10
even_generator.__next__()
#
StopIteration: 
#当调用次数超过迭代次数就会出现上述异常,
应该使用try...except 捕获该异常

  

   4.用普通函数模拟生成器

# 普通函数模拟生成器效果
#将生成器变为普通列表
def generator_even1(max):
    evens=[]
    for i in range(0,max+1):
        if i % 2==0:
            evens.append(i)
#             yield i
    return evens

generator_even1(20)
#[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

  

  

 



这篇关于Python genetor(生成器)--yield 用法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程