📜  用Python编写自己的 len()(1)

📅  最后修改于: 2023-12-03 14:56:18.337000             🧑  作者: Mango

用Python编写自己的 len()

在 Python 中,len() 函数是一个内置函数,用于返回序列或集合中元素的数量。例如,可以使用 len() 函数获取字符串中字符的数量、列表中元素的数量、字典中键值对的数量等。

在本文中,我们将深入探讨 len() 函数的实现原理,并使用 Python 编写自己的 len() 函数。

实现原理

在 Python 中,我们可以使用 __len__() 方法来自定义对象的长度。这个方法应该返回对象的长度(即元素的数量),并且必须是整数。

例如,如果我们要自定义一个类,可以在其中实现 __len__() 方法来返回对象的长度。以下是一个简单的示例:

class MyClass:
    def __init__(self, items):
        self.items = items
    
    def __len__(self):
        return len(self.items)

my_obj = MyClass([1, 2, 3])
print(len(my_obj))  # 输出 3

上面的代码定义了一个名为 MyClass 的类,其中包含一个名为 items 的属性,它包含了一些元素。类中实现了 __len__() 方法,它返回了 items 属性的长度。然后我们创建了一个 MyClass 的实例对象,并使用 len() 函数获取对象的长度。

编写自己的 len() 函数

接下来,让我们使用 Python 编写自己的 len() 函数。我们可以根据对象的类型选择不同的处理方式,以获取对象的长度。

以下是一个简单的示例代码,演示了如何根据对象的类型获取对象的长度:

def my_len(obj):
    if isinstance(obj, (str, list, tuple)):
        return len(obj)
    elif isinstance(obj, dict):
        return len(obj.keys())
    elif hasattr(obj, '__len__'):
        return obj.__len__()
    else:
        raise TypeError('object of type {} has no len()'.format(type(obj).__name__))

上述函数中,我们首先使用 isinstance() 函数判断传入的对象是否为字符串、列表或元组。如果是,直接返回对象的长度。接着,我们判断对象是否为字典,并通过 len() 函数获取它的键值对数量。最后,如果对象没有实现 __len__() 方法,将会抛出一个 TypeError 异常。

下面是一些示例代码,演示了如何使用上述 my_len() 函数:

>>> my_len('hello, world!')
13

>>> my_len([1, 2, 3])
3

>>> my_len((1, 2, 3, 4))
4

>>> my_len({'a': 1, 'b': 2, 'c': 3})
3

>>> class MyObj:
...     def __init__(self):
...         self.items = [1, 2, 3, 4, 5]
...     def __len__(self):
...         return len(self.items)
...
>>> my_obj = MyObj()
>>> my_len(my_obj)
5

>>> my_len(100)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in my_len
TypeError: object of type int has no len()
结论

在本文中,我们介绍了 len() 函数的实现原理,并使用 Python 编写了一个自定义的 len() 函数。通过上述代码,我们可以看到 Python 中的 __len__() 方法是如何用于获取对象的长度的,并且可以自定义对象的长度。