qin_yin 发表于 2020-9-28 14:53:49

关于函数的执行顺序


假设这是个函数 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)                                                       

疾风怪盗 发表于 2020-9-28 15:07:03

应该是这样的顺序啊,有什么问题么?

kogawananari 发表于 2020-9-28 15:16:15

print不是即时执行的 有一个stdout缓冲区

suchocolate 发表于 2020-9-28 16:55:04

if缩进不正确,直接报错。

Stubborn 发表于 2020-9-28 19:14:24

本帖最后由 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()

linke.zhanghu 发表于 2020-9-28 19:37:51

函数分为定义阶段和调用阶段。
定义阶段先定义函数,只要语法不错就不会报错。
你的代码共九行,前八行都在定义函数。而且他们的语法都没错误。所以定义可以完美的运行。
真正的调用发生在最后一行。
但是在这个调用发生前已经定义了两个函数了。
然后调用A函数,传参。打印参数。这时候才调用F函数,给F传参,获取返回值赋值给y。剩下的一步步做就行了。
重点就只有两个,第一个是函数定义阶段。语法没错就能过。
第二个就是函数的调用是在函数定义完以后才会去调用。而不是在定义阶段就调用好了。也就是说你在定义A的时候即使是代码写了要调F,它也不会去调。只有调A的时候才会去调F。

linke.zhanghu 发表于 2020-9-28 19:42:39

也就是说顺序是
先定义A函数 语法不错 过
在定义F函数 语法不错 过
调用A函数 执行A的代码 打印 调用F函数这时候才调用F。执行F里面的代码 将F的返回值给y 执行if 打印y

qin_yin 发表于 2020-9-29 00:58:25

suchocolate 发表于 2020-9-28 16:55
if缩进不正确,直接报错。

没注意,因为是随便举个的例子{:10_297:}

qin_yin 发表于 2020-9-29 01:01:17

Stubborn 发表于 2020-9-28 19:14
顺序没有毛病,遇到函数执行,就往函数钻,直到函数返回结果。

脑补一下,这个运行过程

class Async:是定义什么,我还没学到这里,以及@in_lined_async

qin_yin 发表于 2020-9-29 01:03:16

linke.zhanghu 发表于 2020-9-28 19:37
函数分为定义阶段和调用阶段。
定义阶段先定义函数,只要语法不错就不会报错。
你的代码共九行,前八行都 ...

忘写了
页: [1]
查看完整版本: 关于函数的执行顺序