Python 一起打印函数调用函数
我用一些东西进行了测试,并编写了这段代码作为示例。我觉得我得到的输出很奇怪。我希望函数调用会一个接一个地执行,但根据这段代码,两个print语句都会一个接一个地执行,然后返回值会一起打印。这意味着什么这种情况下的代码流Python 一起打印函数调用函数,python,python-3.x,Python,Python 3.x,我用一些东西进行了测试,并编写了这段代码作为示例。我觉得我得到的输出很奇怪。我希望函数调用会一个接一个地执行,但根据这段代码,两个print语句都会一个接一个地执行,然后返回值会一起打印。这意味着什么这种情况下的代码流 global num num=5 def demo(num): num+=1 print("hi") return(num) print(demo(num),demo(num)) 输出- hi hi 6 6 我期望函数调用一个接一个地执行 事实
global num
num=5
def demo(num):
num+=1
print("hi")
return(num)
print(demo(num),demo(num))
输出-
hi
hi
6 6
我期望函数调用一个接一个地执行
事实就是这样
但是在demo调用之前不可能进行打印,因为它试图打印出这些调用返回的值。你可以粗略地把它看作是一个特殊的例子:2*3+4不能乘以2,除非加上3+4,而printdemonum,demonum不能打印demonum和demonum的结果,除非调用它们。但不要把它看得太字面
因此,这些演示调用从左到右进行,然后进行打印调用
更详细地说,让我们逐步了解它是如何评估这一行的:
print(demo(num),demo(num))
…Python必须做到这一点:
通过将其作为内置名称查找来评估print,该名称将查找内置打印函数。
评估第一个参数。
通过将demo作为全局名称查找来评估它,全局名称将查找您定义的全局demo函数。
通过将num作为全局名称查找来计算num,全局名称将查找全局5值。
对参数调用函数。
参数num获取传入的值5。
num+=1将局部变量参数从局部变量num更新为6。
打印hi打印输出hi。
returnnum返回局部变量6的值。
评估第二个参数。
…同上,它打印出hi并返回6。
调用通过对两个调用返回的两个参数求值print而返回的函数,因此它将输出6。
如果您需要严格的定义,参考文档中将包含详细信息。特别是剥离不相关的位
调用::=主[参数列表]
主对象必须计算为可调用对象…。在尝试调用之前,将对所有参数表达式求值
根据这段代码,两个print语句都是先执行后执行,然后返回值一起打印
对。这两个函数调用必须按顺序执行,以便它可以获得传递给print函数的值。执行它们会打印两次Hi。然后它有所有的值,所以它可以打印它们,打印出6,因为两个值都是6
我期望函数调用一个接一个地执行
事实就是这样
但是在demo调用之前不可能进行打印,因为它试图打印出这些调用返回的值。你可以粗略地把它看作是一个特殊的例子:2*3+4不能乘以2,除非加上3+4,而printdemonum,demonum不能打印demonum和demonum的结果,除非调用它们。但不要把它看得太字面
因此,这些演示调用从左到右进行,然后进行打印调用
更详细地说,让我们逐步了解它是如何评估这一行的:
print(demo(num),demo(num))
…Python必须做到这一点:
通过将其作为内置名称查找来评估print,该名称将查找内置打印函数。
评估第一个参数。
通过将demo作为全局名称查找来评估它,全局名称将查找您定义的全局demo函数。
通过将num作为全局名称查找来计算num,全局名称将查找全局5值。
对参数调用函数。
参数num获取传入的值5。
num+=1将局部变量参数从局部变量num更新为6。
打印hi打印输出hi。
returnnum返回局部变量6的值。
评估第二个参数。
…同上,它打印出hi并返回6。
调用通过对两个调用返回的两个参数求值print而返回的函数,因此它将输出6。
如果您需要严格的定义,参考文档中将包含详细信息。特别是剥离不相关的位
调用::=主[参数列表]
主对象必须计算为可调用对象…。在尝试调用之前,将对所有参数表达式求值
根据这段代码,两个print语句都是先执行后执行,然后返回值一起打印
对。这两个函数调用必须按顺序执行,以便它可以获得传递给print函数的值。执行它们会打印两次Hi。然后它有所有的值,所以它可以打印它们,打印出6,因为两个值都是6。程序计算有一个操作顺序,就像算术一样。同样地,它也不总是直观的,特别是当我们在阅读时从左到右,从上到下地消费东西时 那么,什么 t给出了什么?让我们成为python解释器,看看为什么操作顺序很重要 我需要评估第一个演示,默认情况下,我将在远离globals的封闭房间中进行
# evaluating demo(num=5) - num here is a new local variable, it has no relation to the global one defined above
num+=1 # num = 6
print("hi") # [[[PRINT hi]]] ~> to console
return 6 # returns the value 6 filling in another piece of the puzzle
我们现在在哪里?几乎准备好调用此打印,只需再次执行此演示
print(6, demo(num))
# What is num though?
# Well, the only num I know of out here in global space is 5
print(6, demo(5))
# evaluate: demo(5)
这似乎很熟悉
# evaluating: demo(num=5) - again, a NEW local variable is created just for this function call
num+=1 # num = 6
print("hi") # [[[PRINT hi]]] ~> to console
return 6
最后,print拥有它所需要的所有参数
打印不是魔术,它只是另一种功能!和你写的演示一样
函数在提供其所有参数之前不会求值
printa,b需要a&b的值才能执行它的操作。程序评估与算术一样有一个操作顺序。同样地,它也不总是直观的,特别是当我们在阅读时从左到右,从上到下地消费东西时 那么,有什么好处呢?让我们成为python解释器,看看为什么操作顺序很重要 我需要评估第一个演示,默认情况下,我将在远离globals的封闭房间中进行
# evaluating demo(num=5) - num here is a new local variable, it has no relation to the global one defined above
num+=1 # num = 6
print("hi") # [[[PRINT hi]]] ~> to console
return 6 # returns the value 6 filling in another piece of the puzzle
我们现在在哪里?几乎准备好调用此打印,只需再次执行此演示
print(6, demo(num))
# What is num though?
# Well, the only num I know of out here in global space is 5
print(6, demo(5))
# evaluate: demo(5)
这似乎很熟悉
# evaluating: demo(num=5) - again, a NEW local variable is created just for this function call
num+=1 # num = 6
print("hi") # [[[PRINT hi]]] ~> to console
return 6
最后,print拥有它所需要的所有参数
打印不是魔术,它只是另一种功能!和你写的演示一样
函数在提供其所有参数之前不会求值
printa,b需要a&b的值才能完成它的任务。@Patrick Haugh这不是你标记的问题的重复。在这个问题上,这仅仅是因为最后一个print函数在输出任何内容之前需要对其所有参数进行求值,因此,对demo的两个调用都必须首先完成,因此两个HI都会在数字之前打印出来。@blhsing函数调用的计算方法是从左到右吗?函数中的num不是全局num。它是具有相同名称的局部参数。您正在修改全局num的本地副本。若要查看您想要查看的内容,请从函数定义中删除形式参数,然后将全局num移动到函数定义中。您希望得到什么输出?我想我已经猜到了你的困惑所在,并写了一个答案来解释,但我可能错了。@Patrick Haugh这不是你标记的问题的副本。在这个问题上,这仅仅是因为最后一个print函数在输出任何内容之前需要对其所有参数进行求值,因此,对demo的两个调用都必须首先完成,因此两个HI都会在数字之前打印出来。@blhsing函数调用的计算方法是从左到右吗?函数中的num不是全局num。它是具有相同名称的局部参数。您正在修改全局num的本地副本。若要查看您想要查看的内容,请从函数定义中删除形式参数,然后将全局num移动到函数定义中。您希望得到什么输出?我想我已经猜到了你的困惑所在,并写了一个答案来解释它,但我可能错了。我希望我有更多的时间编辑下来,制作一个漂亮的树形图,用更少的文字来显示这一点,但现在必须结束!希望这个ELI5版本对其他人有帮助。希望我有更多的时间编辑下来,制作一个漂亮的树形图,用更少的文字来显示这个,但是现在我必须结束了!希望这个ELI5版本对其他人有帮助。