不带参数传递 Python 函数

Passing Python function with no argument

我试过用谷歌搜索这个,但没有找到明确的答案:

为什么,当您 运行 以下代码时:

n = "Hello"
# Your function here!
def string_function(n):
    return (n) + 'world'
print string_function

您收到以下回复:

<function string_function at 0x7f5111010938>
None 

我当然知道这个函数没有参数,但是这个响应具体是什么?那一串字母和数字是什么意思(“0x7f5111010938”)?

感谢您提供任何信息!

无论你得到什么,都是一个函数对象。它可以在您的程序中的任何地方进一步使用。该列表是函数在内存中的地址。因此

f = string_function #is a function object

f现在可以用作函数变量,可以用作f('hi')

Python 保存所有具有唯一 ID 的对象。这是该函数的内存地址,每个对象实际上是一个 class 你可以检查它;

print (type(string_function))

>>> 
<class 'function'>
>>>

或;

>>> a="hello"
>>> print (type(a))
<class 'str'>
>>> x=26
>>> print (type(x))
<class 'int'>
>>>  

如你所见class,显然如果你用这个调用你的函数print(string_function())你会看到一个错误,因为函数

中缺少参数

输出是函数对象本身。单词 function 是您打印的函数对象的 typestring_function 部分是对象的名称。数字是函数对象在内存中的地址。

Python 中的所有内容 是第一个 class 对象,包括函数和 classes。函数甚至在 Python 中有自己的 function 类型(您可以通过 type(myfunction) 发现)- 就像 100int'Hello World' 是一个 strTrue 是一个 bool,或者 myfancyobject 是一个 MyFancyClass 实例。

例如,您可以将函数(甚至 classes 本身,属于 type 类型)传递给其他函数:

def increment(x): return x + 1
def sayHiBefore(func, *args, **kwargs):
    print('Hi')
    return func(*args, **kwargs)

print(sayHiBefore(increment, 1))

这显然是一个非常人为的插图,但事实证明能够以这种方式传递函数非常有用。装饰器是您可以使用此功能做的有用事情的一个很好的例子。 Google "python decorators" 了解更多关于他们的信息。

您可以对对象做的另一件事是赋予它们属性!你甚至可以这样做:

increment.a = 1

几乎所有你能对一个对象做的事情,你都可以对一个函数做(包括 print 它们,就像你的例子一样);它们 对象。

当您执行 print string_function 时,您实际上并没有调用该函数。该命令只是打印函数对象本身的表示。这是做 print repr(string_function) 的捷径;在解释器中简单地做 string_function 会打印同样的东西。

表示中的0x7f5111010938id of the function object; that number will change every time you run the script. In standard Python (aka CPython) the id is the memory address of the object, but that's just an implementation detail of CPython, it's not necessarily the case in other flavours of Python. Also see https://docs.python.org/2/reference/datamodel.html

...

不过,我不明白为什么最后会打印 None