传递没有参数的Python函数

时间:2015-01-11 05:18:22

标签: python function python-2.7 debugging python-3.x

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

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

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

您收到以下回复:

<function string_function at 0x7f5111010938>
None 

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

感谢您的任何信息!

4 个答案:

答案 0 :(得分:1)

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

Python中的

Everything 是一个第一类对象,包括函数和类。函数甚至在Python中都有自己的function类型(只需type(myfunction)即可发现) - 就像100int一样,'Hello World'是一个strTruebool,或myfancyobjectMyFancyClass个实例。

例如,您可以将函数(甚至是类本身为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它们,如你的例子中所示);他们对象。

答案 1 :(得分:0)

无论你拥有什么,都是一个功能对象。它可以在您的程序中的任何位置使用。该列表是内存中函数的地址。因此

f = string_function #is a function object

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

答案 2 :(得分:0)

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

print (type(string_function))

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

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

如您所见class,显然如果您使用此函数调用函数print(string_function()),您将看到错误,因为函数中缺少参数

答案 3 :(得分:0)

执行print string_function时,实际上并没有调用该函数。该命令只是打印函数对象本身的表示。这是做print repr(string_function)的捷径;在解释器中,只需执行string_function即可打印相同的内容。

表示中的0x7f5111010938是函数对象的id;每次运行脚本时,该数字都会更改。在标准Python(又名CPython)中,id是对象的内存地址,但这只是CPython的一个实现细节,在其他版本的Python中并不一定如此。另请参阅https://docs.python.org/2/reference/datamodel.html

...

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