【问题标题】:Differentiating between built-in functions vs built-in methods in Python [duplicate]区分Python中的内置函数与内置方法[重复]
【发布时间】:2020-12-11 08:36:27
【问题描述】:

我在理解 Python 的内置函数和方法时遇到了一些困难。据我了解,函数返回有关某事的信息,而方法会改变某事。这是正确的吗?

我也不清楚为什么有些函数和方法需要参数,而有些则不需要。这种要求参数质量是否特定于函数或方法?

最后,为什么这些内置函数/参数中的一些只是简单地说明它们的名称后跟参数(例如sorted(list))而其他(例如list.sort())在其语法中使用句点?

【问题讨论】:

  • 方法是通过类调用的类属性。普通方法是通过类实例调用的,而类方法是通过类本身调用的。方法是函数的特例。函数可以独立于任何类而存在。
  • “据我了解,函数返回有关某事的信息,而方法会改变某事。”不,这不是正确的区别。

标签: python built-in


【解决方案1】:

方法是适用于某个类的函数,而函数可以在任何有效的类中使用。就像list 类的sort 方法对列表进行排序一样。可变类型的方法主要改变项目,所以list.sort 会将list 的值设置为list 的排序值并返回None。但是字符串等不可变类型的方法将返回该事物的新实例,如下所示。

question = "How is this?"
question.replace("How", "What")        # Returns "What is this", but does not change question.
print(question)                        # Prints "How is this?"
print(question.replace("How", "What")) # Prints "What is this"

sorted 这样的内置函数不会更改项目,它们会返回项目的新版本或实例。

list1 = [4,3,6,2]
sorted(list1)    # Returns [2,3,4,6], but does not modify list.
print(list1)     # Prints [4,3,6,2]
list1.sort()     # Returns None, but changes list.
print(list1)     # Prints [2,3,4,6]

当你使用一个方法时,你在变量后面加上一个句点来表明它只能用于那个特定的类。为什么有些函数需要参数而有些方法不需要——比如sorted(list) 需要list,而list.sort() 不需要参数,是因为当你在类上使用方法时,Python 默认会传入一个名为self,这是实际变量,在本例中为 list。如果您使用过 JavaScript,self 类似于 JS 中的 this 关键字。

所以当你输入list.sort() 时,Python 实际上是在list 类中运行函数sort,并传递了self 的参数。

【讨论】:

  • 我不会说“大多数方法实际上都会改变项目”;规则只是逻辑上的变异方法要么返回一个新的变异实例(保持原始实例不变)返回None并变异原始实例。显然,不可变类型(strbytestupleint 等)上的所有方法都不会更改它们被调用的实例,这本身就是足够的非变异方法来放置“大多数方法都会改变项目”的谎言。
  • self 参数作为参数是一个有用的说明。这带来了另一个困惑:内置函数和方法不是完全不同于作为数据结构的函数和作为类数据结构一部分的方法吗?在上面带有list1 的示例中,没有定义函数或类,代码只是以列表开头...
  • @ShadowRanger,你说得对,我有点赶上了列表类......我已经编辑了答案。
  • @2OL1,对于列表和字符串等一些内置类,您不必像我们没有自己的类那样实际说出类并声明它。当您编写list1 = [...] 时,您实际上是在将list1 分配给具有list 类的项目。 Python 为您定义了所有这些类及其函数。
猜你喜欢
  • 2016-01-06
  • 2012-11-10
  • 1970-01-01
  • 2023-03-27
  • 2012-04-30
  • 2021-06-12
  • 2021-07-22
  • 1970-01-01
  • 2018-04-21
相关资源
最近更新 更多