鱼C论坛

 找回密码
 立即注册
查看: 1641|回复: 9

关于函数的执行顺序

[复制链接]
发表于 2020-9-28 14:53:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

假设这是个函数 def A(n):
                                print(n)
                                y = F(x)
                                if 条件:
                                print(y)
                               
                        def F(x):
                                脑补代码块
                                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)                                                       

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-28 15:07:03 | 显示全部楼层
应该是这样的顺序啊,有什么问题么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 15:16:15 | 显示全部楼层
print不是即时执行的 有一个stdout缓冲区
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 16:55:04 | 显示全部楼层
if缩进不正确,直接报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 19:14:24 | 显示全部楼层
本帖最后由 Stubborn 于 2020-9-28 19:16 编辑

顺序没有毛病,遇到函数执行,就往函数钻,直到函数返回结果。

脑补一下,这个运行过程
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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 19:37:51 From FishC Mobile | 显示全部楼层
函数分为定义阶段和调用阶段。
定义阶段先定义函数,只要语法不错就不会报错。
你的代码共九行,前八行都在定义函数。而且他们的语法都没错误。所以定义可以完美的运行。
真正的调用发生在最后一行。
但是在这个调用发生前已经定义了两个函数了。
然后调用A函数,传参。打印参数。这时候才调用F函数,给F传参,获取返回值赋值给y。剩下的一步步做就行了。
重点就只有两个,第一个是函数定义阶段。语法没错就能过。
第二个就是函数的调用是在函数定义完以后才会去调用。而不是在定义阶段就调用好了。也就是说你在定义A的时候即使是代码写了要调F,它也不会去调。只有调A的时候才会去调F。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 19:42:39 From FishC Mobile | 显示全部楼层
也就是说顺序是
先定义A函数 语法不错 过
在定义F函数 语法不错 过
调用A函数 执行A的代码 打印 调用F函数这时候才调用F。执行F里面的代码 将F的返回值给y 执行if 打印y
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-29 00:58:25 | 显示全部楼层
suchocolate 发表于 2020-9-28 16:55
if缩进不正确,直接报错。

没注意,因为是随便举个的例子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-29 01:01:17 | 显示全部楼层
Stubborn 发表于 2020-9-28 19:14
顺序没有毛病,遇到函数执行,就往函数钻,直到函数返回结果。

脑补一下,这个运行过程

class Async:是定义什么,我还没学到这里,以及@in_lined_async
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-29 01:03:16 | 显示全部楼层
linke.zhanghu 发表于 2020-9-28 19:37
函数分为定义阶段和调用阶段。
定义阶段先定义函数,只要语法不错就不会报错。
你的代码共九行,前八行都 ...

忘写了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 12:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表