繁体   English   中英

将打印功能分配给变量

[英]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)

并获得相同的准确结果。 至于lambdafunctools.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM