• 第二天 Python3.4.2 函数的调用过程 生成器 yield


    1.函数的调用过程:

    In [40]: def add(x,y):
       ....:     return x+y
       ....: 
    
    In [41]: def inc(x):
       ....:     return x+1
    
    In [43]: def main():
       ....:     x = 1
       ....:     y = 2
       ....:     ret = add(x,y)
       ....:     ret = inc(ret)
       ....:     print (ret)
       ....:     
    
    In [44]: main()
    4

     假设程序是单进程,单执行流,在某一个时刻,能运行的程序流只有一个,但函数调用会打开新的执行上下文。因此,为了确保main函数可以恢复现场,在main函数调用其它函数时候,需要

    先把main现场保存下来,放一边,即栈中。这时候,被调用函数可执行,且完成后,可加懂啊调用者main。

    “回到“ 调用者main。main就可以继续向后执行。

    函数调用可嵌套运行,例如,X --> Y --> Z, 在Z返回后,Y方可继续,并直到返回,接着X才能继续, 并直到结束。此场景中,X先入栈,接着是Y;于是,Z返回,Y出栈;Y返回,X出栈;

    2.生成器: iterator

    In [55]: def iterator(x):
       ....:     return list(range(x))
       ....: 
    
    In [56]: iterator(5)
    Out[56]: [0, 1, 2, 3, 4]
    
    In [58]: def iterator(x):
        i =0
        while i<5:
            yield i
            i += 1 
       ....:         
    
    In [59]: iterator(5)
    Out[59]: <generator object iterator at 0x7faec402a3a8>

     yield 异步,实现线程。

    当调用yield语句的函数的时候,函数内部的代码不立即执行,而是只返回一个生成器对象。

    In [83]: def iterator():
       ....:     lst=[1,2,3,4,5]
       ....:     yield from lst
       ....:     
    
    In [84]: for x in iterator():
       ....:     print (x)
       ....:     
    1
    2
    3
    4
    5

         每个函数的生命周期是从被调用开始,到返回结束,下一次再进入此函数就得重新开始。但是一添加yield就并非如此,他会返回一个值给调用者,而后当前函数就暂停了(而非退出),接着把控制权交还

    给调用者。

      yield就相当于return,只不过,return而结束当前函数,但是yield会暂停,即保存现场。

      于是,下一次调用这个函数,是从上一次保存的状态继续进行,而非开头。

    In [85]: def fn(x):
       ....:     ret = 1
       ....:     for i in range(1,x+1):
       ....:         ret *=i
       ....:         yield ret        #暂停,保存现场返回键给ret
       ....:         
    
    In [86]: for x in fn(5):        #返回每一次一个阶乘
       ....:     print (x)
       ....:     
    1
    2
    6
    24
    120
    
    In [87]: fn(5)
    Out[87]: <generator object fn at 0x7f75f7b07b88>
    
    In [88]: it=fn(5)
    
    In [89]: it
    Out[89]: <generator object fn at 0x7f75f7b075e8>
    
    In [90]: next(it)
    Out[90]: 1
    
    In [91]: next(it)
    Out[91]: 2
    
    In [92]: next(it)
    Out[92]: 6
    
    In [93]: next(it)
    Out[93]: 24
    
    In [94]: next(it)
    Out[94]: 120
    
    In [95]: next(it)
    ---------------------------------------------------------------------------
    StopIteration                             Traceback (most recent call last)
    <ipython-input-95-2cdb14c0d4d6> in <module>()
    ----> 1 next(it)
    
    StopIteration: 
    
    In [96]: help(next)
    Help on built-in function next in module builtins:
    
    next(...)
        next(iterator[, default])
        
        Return the next item from the iterator. If default is given and the iterator
        is exhausted, it is returned instead of raising StopIteration.
    (END) 
  • 相关阅读:
    leetcode——448.找到所有数组中消失的数字
    leetcode——268.缺失数字
    leetcode——680.验证回文字符串2
    leetcode——125.验证回文串
    leetcode——217.存在重复元素
    leetcode——189.旋转数组
    02-04 线性回归
    02-03 感知机对偶形式(鸢尾花分类)
    02-02 感知机原始形式(鸢尾花分类)
    02-01 感知机
  • 原文地址:https://www.cnblogs.com/tom-li/p/5225803.html
Copyright © 2020-2023  润新知