命令需要()与不需要()的区别是什么?

2024-05-23 16:29:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近花了太长时间调试一段代码,结果发现问题在于我没有在命令后包含()命令。哪些命令需要()而哪些命令不需要()的逻辑是什么

例如:

import pandas as pd

col1=['a','b','c','d','e']
col2=[1,2,3,4,5]

df=pd.DataFrame(list(zip(col1,col2)),columns=['col1','col2'])

df.columns

按预期返回Index(['col1', 'col2'], dtype='object')。如果我们使用.columns(),我们会得到一个错误

其他命令则相反:

df.isna()

返回:

    col1    col2
0   False   False
1   False   False
2   False   False
3   False   False
4   False   False

但是df.isna返回:

<bound method DataFrame.isna of   col1  col2
0    a     1
1    b     2
2    c     3
3    d     4
4    e     5>

虽然没有抛出错误,但这显然不是我们要寻找的

命令使用()和不使用()的逻辑是什么?

这里我使用pandas作为一个例子,但我认为这与python更普遍地相关


Tags: columns代码import命令falsedataframepandasdf
3条回答

因为函数的参数需要括号,而变量不需要括号,这就是为什么它是list.append(<item>)而它是list.items

如果调用不带括号的函数,如list.append,返回的是函数的描述,不是函数的功能描述,而是函数的功能描述

至于类,调用带有括号的类会启动该类的对象,而调用不带括号的类则指向类本身,这意味着如果要执行print(SomeClass),您将得到<class '__main__.SomeClass'>,这是对它的描述,如果你调用一个没有括号的函数,你会得到同样的响应

What's the logic behind which commands use a () and which do not?

一个对象需要有一个与之关联的^{}方法,以便使用()将其作为函数调用:

class Test:
    def __call__(self, arg):
        print("Called with", arg)

t = Test()  # The Test class object uses __call__ to create instances
t(5)  # Then this line prints "Called with 5"

因此,区别在于columns没有定义__call__方法,而IndexDataFrame

TL;博士,你必须知道

名义上,paren需要调用函数,而不仅仅是返回一个对象

foo.bar    # get the bar object
foo.bar()  # call the bar object 

可调用对象有一个__call__方法。当python看到()时,它知道调用__call__。这是在C级完成的

此外,python还有属性的概念。它是一个看起来像常规数据对象的可调用数据对象

class Foo:
    def __init__(self):
        self._foo = "foo"

    @property
    def foo(self):
        return "I am " + self._foo

    @foo.setter
    def foo(self, val):
        assert isinstance(val, str)
        self._foo = val + " you bet"

f = Foo()
f.foo = "Hello"     # calls setter
print(f.foo)        # calls getter

类似地,当python看到数组表示法foo[1]时,它将调用对象的__getitem____setitem__方法,并且对象可以自由地以它认为合适的任何方式重载该调用

最后,对象本身可以使用__getattr____getattribute____setattr__方法拦截属性访问,让一切都悬而未决。事实上,python并不真正知道获取和设置属性意味着什么。它正在调用这些方法。大多数对象只使用从object继承的默认版本。如果这个类是用C实现的,那么在后台发生的事情就没有尽头了

Python是一种动态语言,许多软件包都添加了抽象,以便于(?)使用其服务。不利的一面是,你可能会花更多的时间在帮助文本和文档上

相关问题 更多 >