您的位置:首页 > 编程语言 > Python开发

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

2016-02-28 22:17 645 查看
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: