zoukankan      html  css  js  c++  java
  • python(4)yield函数

    这个函数据说叫做函数发生器,看文档也没看明白,后来在网上看了一个用法,发现实际上相当于return 语句,如下代码:

     
    def addlist(alist):
        for i in alist:
            yield i + 1

    取出alist的每一项,然后把i + 1塞进去。然后通过调用取出每一项:

    alist = [1, 2, 3, 4]
    for x in addlist(alist):
        print x,

    结果为:2 3 4 5

    这个调用非常清晰,每到yield i + 1就相当于return i + 1,即执行到这儿,此函数就结束了,有了前面基本的认识,对于后面较高级用法有很大的作用。

    较高级用法:

    原先的yield是作为一条语句使用,现在可将之作为表达式使用。

    def g():
        a0 = 'first'
        print 'step a0', 'a0= ', a0
        a1 = yield a0 + ‘_myadd’
        print 'step a1', 'a1 = ', a1
        a2 = yield a1
        print 'step a2', 'a2 = ', a2
    f = g()
    f.next()
    f.send('x1')
    f.send('x2')

    返回如下结果:

    step a0 a0=  first
    'first'
    step a1 a1 =  x1
    'x1'
    step a2 a2 =  x2

    Traceback (most recent call last):
      File "<pyshell#133>", line 1, in <module>
        f.send('x2')
    StopIteration

    简单解释,前面说到yield相当于return,

    调用f.next()时,执行到yield a0,函数挂起,函数值为‘first_myadd’

    调用f.send(‘x1’),将表达式yield a0赋值为'x1’,并赋给a1,执行到yield a1,函数挂起,函数值为’x1’

    调用f.send(‘x2’),将表达式yield a1赋值为‘x2’,并赋给a2,打印完成后发现没有yield使其挂起,引发异常

    注意,yield表达式值和函数值是不同的概念,像a1, a2通过=获取的皆为yield表达式值,它们是通过f.send(x)传递进来的,而类似

    yield a0 + ‘myadd’,则是函数挂起时的值。

  • 相关阅读:
    wpf button的mouse(leftbutton)down/up,click事件不响应解决办法
    多线程引发OutOfMemoryException
    WINDBUG常用命令
    有关OEP脱壳
    reversing.kr easykeygen 之wp
    reversing.kr easy crack 之write up
    pwnable.kr leg之write up
    pwnable input2 之 write up
    pwnable.kr random 之 write up
    pwnable.kr 之 passcode write up
  • 原文地址:https://www.cnblogs.com/luhouxiang/p/2429780.html
Copyright © 2011-2022 走看看