说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在 Python 中,鸭子类型(Duck Typing) 是一种动态类型系统中的编程概念。其核心思想是:“如果它像鸭子,叫声也像鸭子,那它就是鸭子。” 在实践中,这意味着我们关注对象的行为(方法和属性),而不是它的具体类型。
List-like 的对象指的是那些在行为上类似于 Python 的 list
类型的对象,即使它们不直接继承自 list
,只要它们提供类似 list
的接口和行为(如支持索引、迭代、切片等),它们就可以被视为 list-like。
一个对象被认为是 list-like,通常满足以下几个条件:
list
一样,能够存储多个元素,并且这些元素具有确定的顺序。obj[i]
)访问元素。obj[start:stop]
)获取子对象。for
循环或其他需要迭代的场景。append()
、extend()
等操作,尽管某些 list-like 对象是不可变的(如元组)。list
的接口一致,例如访问索引超出范围会引发 IndexError
。list
:list
类型显然是 list-like。my_list = [1, 2, 3]
print(my_list[0]) # 输出: 1
for item in my_list:
print(item) # 输出: 1 2 3
tuple
:tuple
是不可变的,但它支持索引、切片和迭代,因此也是 list-like。my_tuple = (1, 2, 3)
print(my_tuple[0]) # 输出: 1
for item in my_tuple:
print(item) # 输出: 1 2 3
str
:my_str = "hello"
print(my_str[1]) # 输出: e
for char in my_str:
print(char) # 输出: h e l l o
通过实现 __getitem__()
和 __iter__()
等方法,可以创建自定义的 list-like 类。
class MyListLike:
def __init__(self, data):
self.data = data
def __getitem__(self, index):
return self.data[index]
def __iter__(self):
return iter(self.data)
# 自定义对象行为像 list
my_list_like = MyListLike([1, 2, 3])
print(my_list_like[1]) # 输出: 2
for item in my_list_like:
print(item) # 输出: 1 2 3
numpy
的数组numpy.ndarray
是 list-like,因为它支持索引、切片和迭代。
import numpy as np
arr = np.array([1, 2, 3])
print(arr[1]) # 输出: 2
for item in arr:
print(item) # 输出: 1 2 3
pandas
的序列pandas.Series
也是 list-like,因为它支持类似列表的操作。
import pandas as pd
series = pd.Series([1, 2, 3])
print(series[1]) # 输出: 2
for item in series:
print(item) # 输出: 1 2 3
示例:支持多种 list-like 对象的函数
以下函数接受任何 list-like 对象:
def sum_list_like(obj):
total = 0
for item in obj:
total += item
return total
# 适用于多种 list-like 对象
print(sum_list_like([1, 2, 3])) # 输出: 6 (list)
print(sum_list_like((1, 2, 3))) # 输出: 6 (tuple)
print(sum_list_like(np.array([1, 2, 3]))) # 输出: 6 (numpy array)
在鸭子类型中,我们通常不使用类型检查(isinstance()
),而是通过尝试调用其接口(如 __getitem__
、__iter__
)来确定它是否 list-like。
示例:检查 list-like 对象
def is_list_like(obj):
try:
iter(obj) # 检查是否可迭代
obj[0] # 检查是否支持索引
return True
except (TypeError, IndexError):
return False
# 测试
print(is_list_like([1, 2, 3])) # 输出: True
print(is_list_like("hello")) # 输出: True
print(is_list_like(123)) # 输出: False
list
、tuple
、numpy.ndarray
、pandas.Series
等都可以视为 list-like 对象,只要它们满足索引、迭代等行为特性。如果有具体问题或想深入某些实现,欢迎提问!
更新时间:2024-12-02 20:54:13 标签:python 鸭子类型 list