python生成器

        理解生成器,最好的方法就是给他取个突出其本质的别名:生成数据的机器代码。

        生成器是一种用时间换空间的做法。比如,利用list列表储存全体正整数,无穷个正整数再大的内存也无法装得下,这个时候就可以使用生成器,实现用一段代码来储存全部正整数的作用。如下面代码,每隔0.5秒自动递增生成一个正整数。

import time
#生成器实际上就是一个函数,但是这个函数必须使用yield关键字,然后函数返回一个生成器对象generator
def inf_N():
    num = 1
    while True:
        yield num
        num += 1
        
if __name__ == '__main__':
    #使用变量名inf_N_gennerate绑定这个生成器
    inf_N_gennerate = inf_N()
    while True:
        time.sleep(0.5)
        #使用next()方法取生成器里面的数据
        print(next(inf_N_gennerate))

目录


一,生成器的官方定义

        Python中,一边循环一边计算的机制,称为生成器:generator。

二,创建生成器的两种方式

1,生成器表达式

        生成器表达式返回一个生成器对象即generator object,需要用一个变量名来接收并绑定。

python生成器

2,生成器函数

import time


def inf_N():
    num = 1
    while num <= 100:
        temp = yield num
        # 执行顺序是:①yield num将num返回出去;②将"yield num"这个个表达式的值交给变量temp,但是num已经被yield返回出去了,所以交给temp的只能是None了
        # yield与return一样会将num返回出去,但不是像return一样结束函数。而是会卡在这里不执行,直到下一次使用next()方法唤醒
        num += 1
        print(temp)

    print("数据已经生成并拿走完毕!")
    return None


if __name__ == '__main__':
    inf_N_gennerate = inf_N()
    while True:
        # time.sleep(0.5)
        print(next(inf_N_gennerate))

三,__next__()&next()和send()方法

1,__next__()&next()的区别

        __next__()是生成器对象的实例方法,next()是python的内置方法。他们实现的功能是一样的,只能对可迭代的对象使用。

2,next()和send()用以唤醒生成器

        当生成器函数中执行yield时,程序会卡在yield的地方不执行,next()和send()的作用就是唤醒卡住的程序,让他继续执行。

3,send()方法的作用

        send()作为生成器对象的实例方法,可以向生成器发送数据并唤醒生成器函数。一般send()方法要写在next()方法后面,当next()和send()写在一块时,相当于唤醒两次生成器。

import time


def inf_N():
    num = 1
    while num <= 100:
        temp = yield num
        # 执行顺序是:①yield num将num返回出去;②将"yield num"这个个表达式的值交给变量temp,但是num已经被yield返回出去了,所以交给temp的只能是None了
        # yield与return一样会将num返回出去,但不是像return一样结束函数。而是会卡在这里不执行,直到下一次使用next()方法唤醒
        num += 1
        print(temp)

    print("数据已经生成并拿走完毕!")
    return None


if __name__ == '__main__':
    inf_N_gennerate = inf_N()
    while True:
        time.sleep(0.5)
        value = next(inf_N_gennerate)
        print(value)
        inf_N_gennerate.send(100)
        # 会打印1 3 5 7 9是因为next和send都会唤醒生成器

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年3月11日
下一篇 2023年3月11日

相关推荐