关于函数的执行顺序
假设这是个函数 def A(n):
print(n)
y = F(x)
if 条件:
print(y)
def F(x):
脑补代码块{:10_277:}
return 1
A(n)
疑惑if条件是什么时候执行,我的想法(A(n)→def A(n)→print(n)→y=F(x)→def F(x)→脑补代码块→return 1 → if 条件(不管条件是什么反正是成立了)→print(y) y = 1)
应该是这样的顺序啊,有什么问题么? print不是即时执行的 有一个stdout缓冲区 if缩进不正确,直接报错。
本帖最后由 Stubborn 于 2020-9-28 19:16 编辑
顺序没有毛病,遇到函数执行,就往函数钻,直到函数返回结果。
脑补一下,这个运行过程{:10_315:}
def apply_async(function, args, *, callback):
result = function(*args)
callback(result)
from queue import Queue
from functools import wraps
class Async:
def __init__(self, function, args):
self.function = function
self.args = args
def in_lined_async(function):
@wraps(function)
def wrapper(*args):
f = function(*args)
result_queue = Queue()
result_queue.put(None)
while True:
result = result_queue.get()
try:
a = f.send(result)
apply_async(a.function, a.args, callback=result_queue.put)
except StopIteration:
break
return wrapper
def add(x, y):
return x+y
@in_lined_async
def test():
y = yield Async(add, (2, 3))
print(y)
y = yield Async(add, ("Hello ", "World"))
print(y)
for n in range(5):
y = yield Async(add, (n, n))
print(y)
print("Goodbye")
test() 函数分为定义阶段和调用阶段。
定义阶段先定义函数,只要语法不错就不会报错。
你的代码共九行,前八行都在定义函数。而且他们的语法都没错误。所以定义可以完美的运行。
真正的调用发生在最后一行。
但是在这个调用发生前已经定义了两个函数了。
然后调用A函数,传参。打印参数。这时候才调用F函数,给F传参,获取返回值赋值给y。剩下的一步步做就行了。
重点就只有两个,第一个是函数定义阶段。语法没错就能过。
第二个就是函数的调用是在函数定义完以后才会去调用。而不是在定义阶段就调用好了。也就是说你在定义A的时候即使是代码写了要调F,它也不会去调。只有调A的时候才会去调F。
也就是说顺序是
先定义A函数 语法不错 过
在定义F函数 语法不错 过
调用A函数 执行A的代码 打印 调用F函数这时候才调用F。执行F里面的代码 将F的返回值给y 执行if 打印y suchocolate 发表于 2020-9-28 16:55
if缩进不正确,直接报错。
没注意,因为是随便举个的例子{:10_297:} Stubborn 发表于 2020-9-28 19:14
顺序没有毛病,遇到函数执行,就往函数钻,直到函数返回结果。
脑补一下,这个运行过程
class Async:是定义什么,我还没学到这里,以及@in_lined_async linke.zhanghu 发表于 2020-9-28 19:37
函数分为定义阶段和调用阶段。
定义阶段先定义函数,只要语法不错就不会报错。
你的代码共九行,前八行都 ...
忘写了
页:
[1]