[英]assigning print function to variable
对于以下代码,在我看来,我们正在将打印功能分配给变量spam。
spam = print('Hello!')
我想知道为什么不打电话给垃圾邮件,打印出来“你好!”?
因为spam
不是函数,所以它是使用参数'Hello!'
调用函数print
的结果'Hello!'
,这是None
类型的, NoneType
。
如果要将该表达式分配给变量,则可以使用lambda:
l = lambda: print('Hello!') # Doesn't actually call print
l() # 1. Prints 'Hello!'
l() # 2. Prints 'Hello!'
l() # 3. Prints 'Hello!'
spam = print('Hello!')
计算右侧的表达式并将其值绑定到spam
。 (Python 3) print()
函数的返回值为None
,因此spam
指的是None
:
>>> spam = print('Hello!')
Hello!
>>> spam is None
True
处理此问题的一种方法是使用functools.partial()
创建部分函数:
>>> from functools import partial
>>> spam = partial(print, 'Hello!')
>>> spam
functools.partial(<built-in function print>, 'Hello!')
>>> spam()
Hello!
或lambda
表达式:
>>> spam = lambda : print('Hello!')
>>> spam
<function <lambda> at 0x7f619cabf9d8>
>>> spam()
Hello!
从本质上讲,以上两种方法都在类似这样的函数周围使用了闭包:
def printer(s):
def f():
print(s)
return f
>>> spam = printer('Hello!')
>>> spam
<function printer.<locals>.f at 0x7f619cabfb70>
>>> spam()
Hello!
一个函数,取决于该函数的编写方式,可能有也可能没有显式的返回值。 函数的作者决定如何实现他的函数。 具有显式返回值的函数中必须包含return
语句。 return
语句使函数结束,并将return
语句之后的值“返回”到调用代码。 当函数到达其代码末尾而没有实际的return
语句时,就像在末尾隐式return None
。 所以...
def is_5(num):
if num is 5:
return True
上面会发生什么? 如果num为5,则该函数返回布尔值True。 但是,如果num不为5,则没有最终的return
语句,因此返回隐式None
。
关于您的问题,函数的“名称”和调用函数之间也有区别。 在上面的示例中,函数的“名称”是is_5
,我们通过在函数名称后加上括号来调用它。 如果函数名称后没有括号,则该函数名称与其他任何变量一样,只是碰巧保留了对函数的引用。 当在其后加上括号时,将导致该函数被调用。 这就是为什么我们可以打电话
is_5(2+3)
但我们也可以说:
myfunc = is_5
myfunc(2+3)
并获得相同的准确结果。 至于lambda
和functools.partial
,它们都用于创建所谓的“无名”函数-它们返回对函数的引用,但该函数没有名称。 您可以捕获其中任何一种的收益并将其存储在变量中。 然后,您可以通过在变量名称后加上括号来调用函数,就像上面一样。 请记住,只有使用括号调用该函数后,该函数才能运行。 因此,例如:
mylambda = lambda x: True if x is 5 else None
mylambda(1+4)
说完所有这些,关于您的问题,变量spam
得到print()
函数返回的返回值(如果有print()
。 print()
没有返回值,因此spam
被分配了值None
。 如果您想将对打印功能的引用分配给spam
,则可以说:
spam = print
然后你可以说
spam("Hello!")
然后您会收到“你好!” 字符串打印到屏幕上。
同样,具有返回值和在屏幕或终端上打印字符串是两件事。 函数可以完成这两项操作,或者既不能执行任何操作,也仍然是有用的功能。 这完全取决于编码人员要完成的工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.