【问题标题】:Passing Python function with no argument不带参数传递 Python 函数
【发布时间】:2015-01-11 05:18:22
【问题描述】:

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

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

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

您会收到以下响应:

<function string_function at 0x7f5111010938>
None 

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

感谢您提供任何信息!

【问题讨论】:

  • 如果要调用该函数,需要string_function()

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


【解决方案1】:

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

Everything 在 Python 中是第一类对象,包括函数和类。函数甚至在 Python 中有自己的 function 类型(您可以通过执行 type(myfunction) 来发现) - 就像 100int'Hello World'strTrue 是 @ 987654331@ 或 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他们,就像你的例子一样);它们对象。

【讨论】:

  • 非常感谢,这是一个非常有启发性的回应。非常感谢!
【解决方案2】:

你所拥有的都是一个函数对象。它可以在您的程序中进一步使用。该列表是函数在内存中的地址。于是

f = string_function #is a function object

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

【讨论】:

    【解决方案3】:

    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()),你会看到函数中缺少参数的错误

    【讨论】:

      【解决方案4】:

      当您执行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

      【讨论】:

        猜你喜欢
        • 2016-06-29
        • 1970-01-01
        • 2011-03-11
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        • 2021-11-04
        • 2019-10-26
        • 2015-01-23
        相关资源
        最近更新 更多