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)