zoukankan      html  css  js  c++  java
  • 关于python3 的高级特性yield用法与实践

    针对于理解yield,那么首先了解迭代器,生成器,最后去了解yield
    # 执行函数
    mylist = [1,2,3] for i in mylist: print(i)
    输出结果:
    1
    2
    3
    这里的mylist是一个可迭代对象,当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代的对象:
    # 使用列表生成式新增的一个mylist2
    mylist2 = [x*x for x in range(1,4)] for j in mylist2: print(j)
    生成器是可以迭代的,但是你只可以读取它一次 , 因为它并不把所有的值放在内存中,它是实时地生成数据,栗子:
    def CreateGenerator():
        mylist = (x * x for x in range(1, 4))
        for z in mylist:
            yield z
    if __name__ == '__main__':
        mygenerator = CreateGenerator()
        for i in mygenerator:
            print(i)
    CreateGenerator()这个函数就是生成器,我把它赋值给一个变量mygenerator ,在使用for循环输出,也可以在python consele控制台进行next(mygenerator)进行一个一个的输出;
    tips:
    迭代是一个实现可迭代对象(实现的是 `__iter__()` 方法)和迭代器(实现的是 `__next__()` 方法)的过程。
    可迭代对象是你可以从其获取到一个迭代器的任一对象。迭代器是那些允许你迭代可迭代对象的对象。
    因为迭代器的数据不在内存中,一次只给出一个返回值,使用return(返回全部的)无法获取到我们想要的值,所以使用yield可以中断并返回这个值;
    举个栗子,实现杨辉三角10层:
    # 杨辉三角的实现@@@@@@@
    def CreatGenerator():
        x = [1]
        for i in range(0,10):
            yield x
            x.append(0)
            x = [x[k] + x[k-1] for k in range(i+2)]
    zz = CreatGenerator()
    for i in zz:
        print(i)

    输出结果为:

    [1]
    [1, 1]
    [1, 2, 1]
    [1, 3, 3, 1]
    [1, 4, 6, 4, 1]
    [1, 5, 10, 10, 5, 1]
    [1, 6, 15, 20, 15, 6, 1]
    [1, 7, 21, 35, 35, 21, 7, 1]
    [1, 8, 28, 56, 70, 56, 28, 8, 1]
    [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

    代码不是很完善,有错误还请指正,定当修改~

  • 相关阅读:
    16.10.16学到的JAVA知识
    参数类型转换求和(JAVA)
    大道至简第一篇读后感之愚公移山(伪代码)
    First
    18.10.22 luoguP3374 【模板】树状数组 1
    18.10.16 luoguP3372 线段树模板-区间更新值&求和(POJ3468 A Simple Problem with Integers)
    18.10.16 POJ 2528 Mayor's posters(线段树+离散化)
    18.10.15 POJ 2182 Lost Cows(线段树)
    18.10.10 数算作业-字符串
    18.10.9 不好做的最长上升子序列(nlogn树状数组解LIS)
  • 原文地址:https://www.cnblogs.com/spider3658/p/14511136.html
Copyright © 2011-2022 走看看