• Python函数进阶:生成器的原理及使用


    '''
    1,什么是生成器?
    函数内但凡有一个yield关键字,
    再调用函数就不会执行函数代码,得到的返回值就是一个生成器对象
    生成器本身就是一种迭代器
    next(g)过程:
    会触发生成器g所对应的函数的执行,直到遇到yield才停下来
    然后把yield的返回值当做本次next操作的结果

    2,为什么要用生成器?
    学习生成器是为了掌握一种自定义的迭代器的方式

    3,总结yield
    1.yield提供一种自定义迭代器的方式
    2,与return对比,都能返回值,都能返回多个值,都没有类型限制,而return只能返回一次值,而yield
    可以返回多次值,yield 可以帮我们保存函数的执行状态

    '''
    def func():
    print('first')
    yield 1###暂停,
    print('second')
    yield 2
    print('third')


    # g = func()
    # print(g)#<generator object func at 0x0000025D76288480>
    # # g.__iter__()
    # # g.__next__()
    # res = next(g)
    # print(res)
    #
    # g = func()####要再掉用一次才会生成新的值
    # next(g)
    # res = next(g)
    # print(res)
    # # next(g)

    ###通过这种方式,可以获得一个无限生成数字的一个无限长度的数
    def num():
    i = 0
    while True:
    i += 1
    print('111111')
    yield i
    num1 = num()
    print(num1.__next__())
    print(num1.__next__())
    print(num1.__next__())

    ##自己定义一个迭代器,实现range的功能 range(1,100,2)

    #用传统的函数做
    # def my_range(start,stop,step = 1):
    # # res = []
    # # while start < stop:
    # # res.append(start)
    # # start += step
    # # return res
    # # res = my_range(1,1000,2)
    # # print(res)
    #用迭代器实现
    def my_range(start,stop,step = 1):
    while start < stop:
    yield start
    start += step
    res = my_range(1,10000,2)
    print(res)
    res.__next__()
    res.__next__()
    res.__next__()
    res.__next__()
    res.__next__()
    res.__next__()
    # print(res.__next__())
    # print(res.__next__())
    # print(res.__next__())
    # print(res.__next__())
    # print(res.__next__())
    # print(res.__next__())
    ###################################
    ###################################
    ##yelid的表达式形式应用
    def dog(name):
    print('狗哥%s准备开吃' %name)
    while True:
    food = yield ###暂停 fooc = yield = None
    print('狗哥%s吃了%s' %(name,food))

    g = dog('alex')
    next(g)####让狗准备好,让生成器对象先暂停到一个位置,准备接受
    g.send('骨头')
    ###g.send()的作用和next的作用相类似,都是返回到上一次函数执行的位置,也就是上一次yeild的位置
    ###开始执行这个函数,但是在执行函数之前,会先把send()括号后面的参数传递给yeild,然后再开始执行函数
    ###直到遇到下一个yeild停止或者整个函数结束
    g.send('泔水')
    g.send('泔水')

    next(g)
    next(g)
    ###################################
    '''
    掌握的重点:
    1,迭代器
    什么是可迭代对象以及什么是迭代器对象(*****)
    迭代器的使用 next(g) (***** )
    迭代器的优缺点(*****)
    for 循环的工作机制(*****)
    2,生成器
    自定义迭代器的方式(****)
    在函数体内使用yeild 值
    表达式形式yeild的应用
    注意:g.send(None) 完全等同于next(g).强调,对于表达式形式yeild
    的生成器在使用前必须先用next(g)或者g.send(None)初始化一次

    '''
    ###################################
  • 相关阅读:
    外观模式
    虚拟专用网
    DHCP服务
    NFS文件服务器
    samba服务器
    fatal error: Invalid layout of preloaded class
    ftp上传与下载
    byte与char的区别
    android管理联系人操作
    android图像与图像处理系列(一、Bitmap和BitmapFactory)
  • 原文地址:https://www.cnblogs.com/1832921tongjieducn/p/10779807.html
Copyright © 2020-2023  润新知