我尝试过谷歌搜索,但没有找到明确的答案:
为什么,当您运行以下代码时:
n = "Hello"
# Your function here!
def string_function(n):
return (n) + 'world'
print string_function
您收到以下回复:
<function string_function at 0x7f5111010938>
None
我当然意识到这个函数没有参数,但具体是什么?那串字母和数字是什么意思(“0x7f5111010938”)?
感谢您的任何信息!
答案 0 :(得分:1)
输出是函数对象本身。单词function
是您打印的函数对象的type
。部分string_function
是对象的名称。数字是内存中函数对象的地址。
Everything 是一个第一类对象,包括函数和类。函数甚至在Python中都有自己的function
类型(只需type(myfunction)
即可发现) - 就像100
是int
一样,'Hello World'
是一个str
,True
是bool
,或myfancyobject
是MyFancyClass
个实例。
例如,您可以将函数(甚至是类本身为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
。