• 生成器


    列表生成式:

    li = [i + 1 for i in range(10)]
    print(li)
    #生成式可以用于列表或者元祖 但是不可以用于字典
    #这里是先循环‘for i in range(10)’然后把每一个值给‘i+1’成为新的列表被打印

     #同时列表生成式也可以三目运算 但是最多可以加三目运算:

    li = [i if i < 5 else i*i for i in range(10)]
    print(li)




    #'generator'生成器对象 用的是括号来形成
    >>> a = (i for i in range(1000))
    >>> a
    <generator object <genexpr> at 0x000000000333A678>


    #此时用‘next’取值:
    li = (i for i in range(1000))
    # for i in li:
    # print(next(li)) #用‘for’循环并不会报错 因为‘for’里面有接收异常的机制
    while True:
    print(next(li)) #用‘while’会报错 因为没接收异常的机制 报错内容‘StopIteration’停止迭代



    #在’python2中range(100)‘ 会直接生成列表 在python3中的range()就相当于生成器 只是具备了后续的执行调用的能力,并没有把全部加载出来成列表
    #在‘python2’的‘xrange()’和‘python3()’中的’range()‘同效果




    def fib(max):  #  这里离函数生成器差一步
    n, a, b, = 0, 0, 1
    while n < max:
    a, b = b, a + b #这里的’a+b‘是’b‘的值 但是所加时 ’a‘是原来没有被’b‘赋值的’a‘和原来的’b‘相加的结果是新的’b‘ ’a是原来的’b‘
    print('bofret yield')
    yield b #加入‘yield’是把这个函数冻结暂停并返回外边 方便下次‘next’‘next’是启动生成器的作用 但是遇见‘yield’就暂停 ’yield‘是单次暂停并返回 ’return‘是结束函数并且返回
    print(b)
    n+=1
    return 'down'
    fib(10) #这样的函数的调用只是让函数生成了一个生成器对象‘generator’
    f= fib(10)
    next(f) #这才能调用函数执行里面的内容 但是并不能执行打印‘yield’
    print(next(f)) #此时才能打印‘yield’返回的的‘b’的值
    for i in f:
    print(next(f))




    #斐波那契是初正整数前俩最小的值以外,后面的所有的值是前俩数的和:
    0,1,2,3,5,8,12,20.。。。。。。。



    def range2(n):
    count = 0
    while count < n:
    print('count', count)
    count+=1
    yield count
    f = range2(10) #函数调用只是生成了一个生成器
    next(f) #'next(f)'就等于‘f.__next__()’
    f.__next__()
    print(next(f)) #启动函数生成式并输出‘count’并且打印‘yield count’的返回值







    def range2(n):
    count = 0
    while count < n:
    count+=1
    sigo = yield count
    if sigo == 'stop':
    print('sigo', sigo)
    break
    return '3233'
    f = range2(10) #函数调用只是生成了一个生成器
    #print(next(f)) #’print(next(f))‘和’print(f.send(None))‘功能一样都是唤醒继续进行下一步但是’send‘里面传入的值与生成器里面的条件里的值如果相等 就会停止并’return‘返回
    print(f.send(None))
    print(f.send(None))
    print(f.send(None))


    #函数生成器:
      1函数名字节加()组成一个生成器
      2生成器里面加’return‘会停止并且返回,但是会异常
    #'send()'方法可以给’yield‘传去一个停止的指令,同时它也有返回和唤醒’yield‘的功能
    #'next()'只有返回和继续的功能并不能传值
     
  • 相关阅读:
    【免费赠书】前端程序员修炼之路:积土而为山,积水而为海
    开源网站流量统计系统Piwik源码分析——后台处理(二)
    开源网站流量统计系统Piwik源码分析——参数统计(一)
    数学思维修炼
    《代码大全》中的变量
    linux dmesg命令参数及用法详解(linux显示开机信息命令)
    dd命令使用详解
    Linux就这个范儿 第10章 生死与共的兄弟
    Linux就这个范儿 第9章 特种文件系统
    Bash中的shopt选项
  • 原文地址:https://www.cnblogs.com/yuexijun/p/10014838.html
Copyright © 2020-2023  润新知