Python 命令需要()与不需要()的区别是什么?
我最近花了太长时间调试一段代码,结果发现问题在于我没有在命令后包含()命令。哪些命令需要()而哪些命令不需要()的逻辑是什么 例如:Python 命令需要()与不需要()的区别是什么?,python,pandas,function,methods,Python,Pandas,Function,Methods,我最近花了太长时间调试一段代码,结果发现问题在于我没有在命令后包含()命令。哪些命令需要()而哪些命令不需要()的逻辑是什么 例如: 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 按预期返回索引(['col1','col2'],dtype='object')。如果
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
按预期返回索引(['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()
,但它是list.items
如果调用不带括号的函数,如list.append
返回的是函数的描述,不是函数的功能描述,而是的功能描述
对于类,对带有括号的类的调用将启动该类的对象,而对不带括号的类的调用则指向该类本身,这意味着如果要执行print(SomeClass)
,您将得到
,这是对该类的的描述,如果你调用一个没有括号的函数,你会得到同样的响应
哪些命令使用()而哪些命令不使用()的逻辑是什么
对象需要有一个与之关联的方法,才能使用()
将其作为函数调用:
因此,不同之处在于,
列
没有定义调用
方法,而索引
和数据帧
都有;博士,你必须知道
名义上,paren需要调用函数,而不仅仅是返回一个对象
foo.bar # get the bar object
foo.bar() # call the bar object
可调用对象有一个\u调用\u
方法。当python看到()时,它知道调用\uuuuuu调用
。这是在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]
时,它将调用对象的\uuu getitem\uuuuuuu
或\uuuuuu setitem\uuuuuuu
方法,并且对象可以以其认为合适的任何方式自由重载该调用
最后,对象本身可以使用\uuuuu getattr\uuuuu
、\uuuu getattribute\uuuuu
和\uuuuu setattr\uuuuu
方法拦截属性访问,让一切都悬而未决。事实上,python并不真正知道获取和设置属性意味着什么。它正在调用这些方法。大多数对象只使用从对象继承的默认版本。如果这个类是用C实现的,那么在后台发生的事情就没有尽头了
Python是一种动态语言,许多软件包都添加了抽象,以便于(?)使用其服务。缺点是,您可能会花更多的时间处理帮助文本和文档。对象方法与对象属性
对象具有方法和属性。
方法需要一个括号来调用它们——即使该方法不需要参数。
其中as属性类似于变量,随着程序的进行,变量指向对象。您只需按名称调用这些属性(不带括号)。当然,您可能需要根据需要使用对象名来限定方法和属性。您也可以对类进行注释吗?它们的行为方式是否与函数相同?对于类,如果您使用括号调用一个类,您是在实例化该类中的一个对象,但是如果您调用一个不使用括号的类,它将以与函数相同的方式返回该类的描述,例如print(TestClass)
将打印类似于
,而TestClass()
返回该类的对象,该对象包含该类的所有函数和变量,并根据该类的构造函数进行初始化,等等。
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