Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一起打印函数调用函数_Python_Python 3.x - Fatal编程技术网

Python 一起打印函数调用函数

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 我期望函数调用一个接一个地执行 事实

我用一些东西进行了测试,并编写了这段代码作为示例。我觉得我得到的输出很奇怪。我希望函数调用会一个接一个地执行,但根据这段代码,两个print语句都会一个接一个地执行,然后返回值会一起打印。这意味着什么这种情况下的代码流

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版本对其他人有帮助。