函数和方法都是在Python中可调用的代码块,但它们的操作方式不同。函数是独立的代码块,而方法是绑定到对象上的函数。
定义:函数和方法
函数是一个独立的可重用代码块,用于执行特定任务。函数可以直接调用,而不需要引用对象:
any([False, False, True])
len("Hello")
sum([1, 2, 3])
方法是属于某个对象的函数。方法通过在该特定对象上使用点表示法来调用:
my_list = [1, 2, 3]
my_list.pop()
my_string = "hello"
my_string.upper()
点(.
)是我们访问附加到对象的方法的指示符。
方法是在类定义中定义的。当我们从该类创建一个对象(实例)时,该对象可以访问其类中定义的所有方法。这个原则适用于内置类型和我们编写的自定义类。例如,list
类型在 Python 的源代码中被定义为一个类,像 .pop()
和 .append()
这样的 методы 就是在该类中定义的。当我们创建一个列表对象时,我们创建了 list
类的一个实例,并访问其方法。字符串、字典和所有其他内置类型也是如此。
关键区别:对象附加
函数和方法之间的主要区别在于它们与对象的附加关系。方法是在类中定义的,并且作用于该类的实例。函数则独立存在于命名空间中。
方法属于特定数据类型
Python中的每种数据类型都有专门为该类型设计的方法:
字符串方法:
text = "hello"
text.upper() # 返回 "HELLO"
text.lower() # 返回 "hello"
text.replace("l", "x") # 返回 "hexxo"
列表方法:
my_list = [1, 2, 3]
my_list.append(4) # 将4添加到列表中
my_list.remove(2) # 从列表中移除2
my_list.pop() # 移除并返回最后一个项目
字典方法:
my_dict = {"name": "Alice", "age": 30}
my_dict.keys() # 返回字典的键
my_dict.values() # 返回字典的值
函数跨多种数据类型工作
函数被设计为通用工具,可以操作多种类型的数据:
len([1, 2, 3]) # 适用于列表
len("hello") # 适用于字符串
len((1, 2, 3)) # 适用于元组
sum([1, 2, 3]) # 适用于列表
sum((1, 2, 3)) # 适用于元组
any([False, False, True]) # 适用于列表
any((False, True)) # 适用于元组
可变和不可变操作
修改数据的方法和函数与不修改数据的方法和函数之间存在重要区别。
变异方法
某些方法会改变被调用对象的状态。原始对象会被修改:
my_list = [3, 1, 2]
my_list.sort() # 修改了 my_list
print(my_list) # 输出: [1, 2, 3]
my_list = [1, 2, 3]
my_list.pop() # 移除最后一个项目
print(my_list) # 输出: [1, 2]
非变更方法和函数
其他方法和大多数函数返回一个值或创建一个新对象,而不修改原始对象:
my_list = [1, 2, 3]
result = my_list.count(2) # 不会修改 my_list
print(my_list) # 输出: [1, 2, 3]
my_list = [3, 1, 2]
sorted_list = sorted(my_list) # 返回一个新列表
print(my_list) # 输出: [3, 1, 2] - 未改变
print(sorted_list) # 输出: [1, 2, 3] - 新列表
length = len([1, 2, 3]) # 返回一个值
关键要点
- 函数 是独立的代码块,可以直接调用而不需要引用对象
- 方法 是绑定到特定对象的函数,通过点符号访问
- 函数通常可以处理多种数据类型,而方法则特定于其数据类型
- 变异操作 修改原始对象,而 非变异操作 返回一个新值或对象,而不改变原始对象
- 点符号 (
.
) 表示我们正在对一个对象调用方法 - 在选择方法和函数时,请考虑操作是否应该修改原始数据