debugging 传递不带参数的Python函数[重复]

k3fezbri  于 2023-01-05  发布在  Python
关注(0)|答案(4)|浏览(125)
    • 此问题在此处已有答案**:

In Python, what does '<function at ...>' mean?(4个答案)
2天前关闭。
我试着在谷歌上搜索,但没有找到一个明确的答案:
为什么,当你运行下面的代码:

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

您将得到以下响应:

<function string_function at 0x7f5111010938>
None

我当然知道这个函数没有参数,但是这个响应具体是什么呢?这个字母和数字的字符串("0x7f5111010938")是什么意思?
感谢您的任何信息!

ogq8wdun

ogq8wdun1#

输出是函数对象本身。单词function是您打印的函数对象的type。部分string_function是对象的名称。数字是函数对象在内存中的地址。
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))

这显然是一个相当做作的例子,但是能够以这种方式传递函数是非常有用的。装饰器是一个很好的例子,说明了你可以用这种能力做一些有用的事情。谷歌一下“python装饰器”,找到关于它们的更多信息。
你可以对对象做的另一件事是给予它们属性!你甚至可以这样做:

increment.a = 1

你可以对一个对象做的任何事情,你都可以对一个函数做(包括print,就像你的例子一样);它们是对象。

tkqqtvp1

tkqqtvp12#

你得到的都是函数对象。它可以在程序中的任何地方使用。列表是函数在内存中的地址。因此

f = string_function #is a function object

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

t5zmwmid

t5zmwmid3#

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()),您将看到一个错误,因为函数中缺少参数

5vf7fwbs

5vf7fwbs4#

当你执行print string_function时,你实际上并没有调用函数,这个命令只是打印函数对象本身的表示,这是执行print repr(string_function)的捷径;在解释器中,简单地执行string_function将打印相同的内容。
表示中的0x7f5111010938是函数对象的id;这个数字在每次运行脚本时都会改变,在标准Python(aka CPython)中,id是对象的内存地址,但这只是CPython的实现细节,在其他风格的Python中不一定如此,也请参见https://docs.python.org/2/reference/datamodel.html
...
不过,我不明白为什么在最后打印None

相关问题