鱼C论坛

 找回密码
 立即注册
查看: 1926|回复: 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)                                                       

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-28 15:07:03 | 显示全部楼层
应该是这样的顺序啊,有什么问题么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 15:16:15 | 显示全部楼层
print不是即时执行的 有一个stdout缓冲区
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 16:55:04 | 显示全部楼层
if缩进不正确,直接报错。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

脑补一下,这个运行过程

  1. def apply_async(function, args, *, callback):
  2.     result = function(*args)
  3.     callback(result)

  4. from queue import Queue
  5. from functools import wraps

  6. class Async:

  7.     def __init__(self, function, args):
  8.         self.function = function
  9.         self.args = args

  10. def in_lined_async(function):
  11.     @wraps(function)
  12.     def wrapper(*args):
  13.         f = function(*args)
  14.         result_queue = Queue()
  15.         result_queue.put(None)
  16.         while True:
  17.             result = result_queue.get()
  18.             try:
  19.                 a = f.send(result)
  20.                 apply_async(a.function, a.args, callback=result_queue.put)
  21.             except StopIteration:
  22.                 break
  23.     return wrapper


  24. def add(x, y):
  25.     return x+y

  26. @in_lined_async
  27. def test():
  28.     y = yield Async(add, (2, 3))
  29.     print(y)
  30.     y = yield Async(add, ("Hello ", "World"))
  31.     print(y)
  32.     for n in range(5):
  33.         y = yield Async(add, (n, n))
  34.         print(y)
  35.     print("Goodbye")


  36. test()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

没注意,因为是随便举个的例子
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

脑补一下,这个运行过程

class Async:是定义什么,我还没学到这里,以及@in_lined_async
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

忘写了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-27 20:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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