• python_day17_生成器_debug单步调试


          今天肚子特别的不舒服,就是明明一天没吃饭了,但是胃里还是满满的那种不舒服,额,晚上吃东西了,就是早上和中午实在是不舒服,就没去吃饭。可能是因为昨天做了接近5个小时的地跌+公交车+喝酒的原因吧,现在回想起地铁和公交车,全是恶心的感觉。。。。去吃晚饭的时候给我妈打了一电话,听到妈妈的声音,真好。

    #Author:"haijing"
    #date:2018/9/28

    #列表生成式
    # a = [x for x in range(10)] #生成列表的式子
    # print(a) #打印[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    #
    # b = [x*2 for x in range(10)]
    # print(b) #打印[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    #
    # c = [x*x for x in range(10)]
    # print(c) #打印[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    #函数+列表生成式
    # def f(n):
    # return n*3
    # d = [f(x) for x in range(10)]
    # print(d) #打印0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
    #
    # t = ['123',8]
    # a,b = t #等价于a=123 b=8,但此时t中只能有两个变量
    # print(a) #打印123
    # print(b) #打印8


    #生成器,不能固定的去取哪个值,只能一个一个的取
    # s = (x for x in range(10)) #此时s是一个对象,没有值,节约内存空间
    # print(s) #打印<generator object <genexpr> at 0x0238F8A0>
    #
    # a = s.__next__() #拿出第一个数0,但是不经常用
    # print(a) #打印0
    #
    # b = next(s) #常用,等价于s.__next__() in python2 s.next()
    # print(b) #打印1,因为第29行已经把0给拿出来了
    # print(next(s)) #拿出2
    # print(next(s)) #拿出3
    # print(next(s)) #拿出4,一直拿出9,再写print(next(s))的话就会报错了

    #生成器就是一个可迭代对象(元组、列表、字典都是可迭代对象) for i in 可迭代对象
    #生成一个生成器方式一
    # s1 = (x for x in range(10))
    # for i in s1:
    # print(i) #打印0到9

    #生成一个生成器方式二 yield python遇到return和yield都会推出该函数,
    #但是return退出之后就不再进来了,但是党程序中再次调用改生成器时,程序可以再回到yield原来的地方继续执行

    #程序执行的之后,会首先执行被调用的函数,不会首先执行def f():这个,只有被调用f()时才会返回到def这里来执行
    # def f():
    # print('ok1')
    # yield 1 #有一个yield,所以生成器中就只有一个数
    # print('ok2')
    # yield 2
    #
    # print(f) #打印<function f at 0x00D1B780>
    # f() #什么也不打印,f()就是一个生成器对象,压根就没进来,所以不会执行print('ok')
    # g=f()
    # d1 = next(g) #yield后面的1赋值给d1 并打印ok1
    # d2 = next(g) #yield后面的2赋值给d2 并打印ok2
    # print(d1,d2) #打印1 2

    #应用:斐波那契数列第n个数,等于第n-2和第n-1个数相加
    def fib(max):
    n,before,after = 0,0,1 #n,before,after分别赋值为001
    while n<max:
    print(before)
    after,before = before,after+before #这些才可以,执行这一句时,cpu会首先将before=0,after+before=1计算出来
    #再将before=0赋值给after,将after+before=1赋值给before,即先执行等号的右边的计算
    # after=before
    # before=after+before #以上两句不能替换以上第三句,这样写的话不对!!
    n = n+1
    fib(10)
    print('ok4') #上下分割标志

    #斐波那契数列+生成器
    def fib1(max):
    n,before,after = 0,0,1 #n,before,after分别赋值为001
    while n<max:
    # print(before)
    yield before
    after,before = before,after+before
    n = n+1
    # fib1(10) #此时fib(10)就是一个生成器对象
    g = fib1(10)
    print(next(g)) #打印0
    print(next(g)) #打印1
    print(next(g)) #打印1
    print(next(g)) #打印2
    print(next(g)) #打印3
    print(next(g)) #打印5
    print(next(g)) #打印8 只能调用10次next(g) 否则会报错

    #其他应用
    def bar():
    print('ok5')
    count = yield 111 #相当于return 返回111,遇到yield也直接返回
    print(count)
    print('ok6')
    yield 222
    b = bar()
    s=b.send(None) #第一次进去,不知道给谁传值,否则会报错
    print(s)
    c = b.send('eee') #将eee赋值给count
    print(c)
    #最好自己可以debug调试一下,看到底是个怎么样的执行顺序


    #Author:"haijing"
    #date:2018/9/28

    def bar():
    print('ok5')
    count = yield 111 #相当于return 返回111,遇到yield也直接返回
    print(count)
    print('ok6')
    yield 222

    b = bar() #只要定义时bar()中有yield,再次调用bar()时,就可以创建一个生成器bar(),并赋值给b
    s=b.send(None) #第一次进去,不知道给谁传值,只能传一个None进去,否则会报错
    print(s)
    c = b.send('eee') #将eee赋值给count
    print(c)
    #最好自己可以debug调试一下,看到底是个怎么样的执行顺序
    #调试最开始,程序会首先在def bar()为函数创建一个内存空间,之后跑到第11行处,创建一个生成器,并赋值给b
    #之后执行b.send(None),之后回到第4行,def bar()处,遇到yield 111,返回,并将返回值111赋值给s
    #之后再回到第13行处执行,打印111,之后再执行第14行的b.send('eee') ,之后再回到第7行处执行,此时已经将eee赋值给了count
    #打印eee,之后再执行第8行,打印ok6,之后再执行第九行,遇到了yield,退出并返回222给c,最后执行第15行打印222

    haijing in hz
    miss min
    2018.9.28 晚




  • 相关阅读:
    图片中添加文字
    几种经典的滤波算法(转)
    OPENCV初试
    图像处理和图像识别中常用的OpenCV函数
    SIP开发
    【转】opencv老是卡在某一层,
    大电子文件读取成二进制流方案
    C# 调试方法之即时窗口输出
    关于如何解锁你的WP7,以便安装自己开发的程序。
    Windows phone 7 之初体验(一.安装Windows phone 7 sdk)
  • 原文地址:https://www.cnblogs.com/YiYA-blog/p/9721339.html
Copyright © 2020-2023  润新知