第二天 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) 

 

posted @ 2016-02-28 22:17  Tom-Li  阅读(312)  评论(0编辑  收藏  举报