我目前正在自学如何编码,我对Python(和其他所有语言(有一个非常广泛的问题。您如何知道何时将变量放在句点之前或函数的括号内?
例如 - 此表达式将检索数据集的相关性。
df.corr()
但是,为什么括号是封闭的,里面没有任何信息?为什么你不能像这样将变量放在表达式中 -
corr(df)
我知道第一个表达是正确的,我只是想在高层次上知道为什么。有没有人有任何视频或工具可以解释编码的这一基本原则?
我过去在过去几年的职位上经常使用 excel,这可能就是为什么我本能地将所有内容都放在括号内的原因。
谢谢你的帮助!
但是,为什么括号是封闭的,里面没有任何信息?
df.corr()
因为没有更多的东西可以传递给函数。或者,更准确地说(假设df
是类似于熊猫数据帧实例或其他类似对象的东西(,因为在这种情况下,唯一必需的参数(df
(会自动传递给函数。
为什么你不能像这样将变量放在表达式中 -
corr(df)
如果你真的愿意,你可以做一些类似type(df).corr(df)
的事情,但这有点没用。
好的,让我们更深入一点:Python是一种面向对象的语言。在 OO 中,对象具有"方法",即作用于调用它们的对象的函数。在大多数 OOPL 中,方法调用的语法是obj.method()
而不是method(obj)
。在后台,您的语言的编译器或解释器(或任何其他机制(实际上使obj
可用于该方法,因此无需显式传递它。
以这种方式(而不是使用标准函数(的要点是,不同的对象可以以自己的方式定义相同的方法,因此作为这些对象的"客户端",您不必检查确切的类型并自己调用特定于对象的版本,即:
没有对象:
def draw_rect(rect):
# code to draw a rect here
def draw_line(line):
# code to draw a line here
def draw_circle(circle):
# code to draw a circle here
def draw_all(drawables):
for obj in drawables:
if isinstance(obj, Rect):
draw_rect(obj)
elif isinstance(obj, Line):
draw_line(obj)
elif isinstance(obj, Circle):
draw_circle(obj)
def main():
# a list of various "drawable" objects
objects = [Rect(), Line(), Cicle()]
draw_all(objects)
带对象:
class Rect():
def draw(self):
# code to draw a rect here
class Line():
def draw(self):
# code to draw a line here
class Circle():
def draw(self):
# code to draw a circle here
def draw_all(drawables):
for obj in drawables:
obj.draw()
def main():
# a list of various "drawable" objects
objects = [Rect(), Line(), Cicle()]
draw_all(objects)
而在幕后,Python将把obj.draw()
变成type(obj).draw(obj)
。这被称为"基于类型的多态调度",实际上是 OOP 中最基本的概念。
现在 Python 不是一个"纯粹的"OOPL,因为它不会强迫你只使用对象和方法 - 你也可以编写和使用普通函数(例如上面的draw_all
和main
函数(,当然,这将按您的预期工作。