Python 为什么在调用标识符时需要将函数分配给标识符?
我想举一个代码示例:Python 为什么在调用标识符时需要将函数分配给标识符?,python,function,python-3.x,Python,Function,Python 3.x,我想举一个代码示例: def coun(n): count = 0 def counter(): nonlocal count if count < n: count += 1 return count return counter cntrl = coun(4) print(cntrl()) def con(n): 计数=0 def计数器(): 非局部计数 如果计数3。这个打字错误作为
def coun(n):
count = 0
def counter():
nonlocal count
if count < n:
count += 1
return count
return counter
cntrl = coun(4)
print(cntrl())
def con(n):
计数=0
def计数器():
非局部计数
如果计数
为什么我们必须将函数分配给标识符,更进一步,在print语句中,cntrl是使用括号调用的,而在函数conn的return语句中,计数器不是使用括号返回的。这是什么?(我只是python的新手)调用标识符并不需要将函数分配给标识符 考虑一个简单的例子:
def function_factory():
def f(x):
return x
return f
您可以将工厂返回的函数分配给标识符,并将其用作任何其他命名函数:
my_f = function_factory()
assert my_f(1) == 1
或者,您可以删除中间赋值并在一行中完成:
assert function_factory()(1) == 1
不是 因为您正在执行
return counter
而不是return counter()。您可以通过将其分配给变量来完成此操作,也可以使用通常的函数调用约定立即调用它:
print(coun(4)())
通过在函数后添加()
来调用函数,如果不想调用函数(或任何其他东西),则不添加括号,在这种情况下,返回的是函数本身,而不是函数的返回值,其中ascntrl=coun(4)
您正在调用con
并获取它的返回值。返回计数器()
立即调用该函数完全没有问题,完全无法在另一个函数中定义它,或者您可以执行打印(cntrl)
要查看函数本身的表示,而不实际调用它。。。但我认为这里的标准是“当你想调用某个东西时,你可以调用它”,而不是其他任何地方。这实际上是一个包装函数。通过将外部函数分配给标识符调用外部函数,然后通过调用内部函数调用标识符。另一种方法是在另一个函数上方执行@count
来包装它。从中了解有关包装器/装饰器的更多信息。名称绝对不是必需的<代码>(lambda x:x+1)(2)
->3
。这个打字错误作为一个注释是有意义的,我不确定它是否真的属于你的答案。@杰克·艾德利,你的答案正好击中了我问题的头部,但是为什么在con(4)后面需要括号作为:print(con(4)()而不是作为:print(con(4))?因为coun
返回一个函数coun(4)
是一个函数,您需要调用一个函数来获得它的结果。调用函数的方式是在函数后面加括号。这与您需要将(4)
放在con
之后的位置完全相同。哇,谢谢!尽管如此,您能否解释一下为什么要使用assert语句以及为什么必须使用assert语句(如果在某些程序的特定代码中不使用assert语句的话)