我最近花了太长时间调试一段代码,结果发现问题在于我没有在命令后包含()命令。哪些命令需要()而哪些命令不需要()的逻辑是什么
例如:
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更普遍地相关
因为函数的参数需要括号,而变量不需要括号,这就是为什么它是
list.append(<item>)
而它是list.items
如果调用不带括号的函数,如
list.append
,返回的是函数的描述,不是函数的功能描述,而是函数的功能描述至于类,调用带有括号的类会启动该类的对象,而调用不带括号的类则指向类本身,这意味着如果要执行
print(SomeClass)
,您将得到<class '__main__.SomeClass'>
,这是对它的描述,如果你调用一个没有括号的函数,你会得到同样的响应一个对象需要有一个与之关联的^{} 方法,以便使用
()
将其作为函数调用:因此,区别在于
columns
没有定义__call__
方法,而Index
和DataFrame
有TL;博士,你必须知道
名义上,paren需要调用函数,而不仅仅是返回一个对象
可调用对象有一个
__call__
方法。当python看到()时,它知道调用__call__
。这是在C级完成的此外,python还有属性的概念。它是一个看起来像常规数据对象的可调用数据对象
类似地,当python看到数组表示法
foo[1]
时,它将调用对象的__getitem__
或__setitem__
方法,并且对象可以自由地以它认为合适的任何方式重载该调用最后,对象本身可以使用
__getattr__
、__getattribute__
和__setattr__
方法拦截属性访问,让一切都悬而未决。事实上,python并不真正知道获取和设置属性意味着什么。它正在调用这些方法。大多数对象只使用从object
继承的默认版本。如果这个类是用C实现的,那么在后台发生的事情就没有尽头了Python是一种动态语言,许多软件包都添加了抽象,以便于(?)使用其服务。不利的一面是,你可能会花更多的时间在帮助文本和文档上
相关问题 更多 >
编程相关推荐