题目

翻转链表,如 1 -> 2 -> 3 -> 4 ,翻转为 4 -> 3 -> 2 -> 1

思路

对于空节点(head is None)或者单节点(head.next is None),翻转后还是一样的,所以直接返回。

用途

定义一个对象的长度或者大小。 该方法能够像内建的系列类型一样,使用 len(object)获取对象的长度/大小。

示例

 1class MyList:
 2    def __init__(self, items):
 3        self.items = items
 4
 5    def __len__(self):
 6        return len(self.items)
 7
 8
 9# 使用示例
10my_list = MyList([1, 2, 3, 4, 5])
11print(len(my_list)) # 输出: 5

目的是为了声明这些元素不应该被修改/重写,表明代码设计意图。

@final 装饰器

  • 声明不应该被子类继承
  • 声明不能重写该方法
 1from typing import final
 2
 3@final
 4class FinalClass:
 5    """这个类不能被继承"""
 6
 7class SomeClass:
 8    @final
 9    def final_method(self):
10        """子类不能定义不同的final_method实现"""

Final注解

  • 声明变量/属性 不应该被重新赋值,即初始化后不再改变
1from typing import Final
2
3GLOBAL_CONSTANT: Final[str] = "这是一个常量值,因为它是final"

在 Python 中,当你导入一个模块时,解释器会根据一定的顺序搜索模块所在的位置。这个搜索路径被称为包搜索路径(Package Search Path)。下面是 Python 包搜索路径的一般顺序:

用途

不需要调用实例方法,像操作 python 原生对象一样去 getset

示例

 1class MyList:
 2   def __init__(self, data):
 3      self.data = data
 4
 5   def __getitem__(self, index):
 6      return self.data[index]
 7
 8   def __setitem__(self, index, value):
 9      self.data[index] = value
10
11my_list = MyList([1, 2, 3, 4, 5])
12print(my_list[1]) # 输出: 2
13
14my_list[1] = 42
15print(my_list[1]) # 输出: 42

迭代器

定义

迭代器是实现了__iter__()__next__()方法的对象。它允许用户逐个访问集合中的元素,而不需要知道集合的底层结构。

工作原理

  • __iter__():返回迭代器对象自身。
  • __next__():返回集合中的下一个元素。如果没有更多元素可供返回,则抛出StopIteration异常。

示例

 1class MyIterator:
 2    def __init__(self, data):
 3        self.data = data
 4        self.index = 0
 5
 6    def __iter__(self):
 7        return self
 8
 9    def __next__(self):
10        if self.index < len(self.data):
11            result = self.data[self.index]
12            self.index += 1
13            return result
14        else:
15            raise StopIteration
16
17# 使用迭代器
18my_iter = MyIterator([1, 2, 3])
19for item in my_iter:
20    print(item)  # 输出: 1 2 3

生成器

定义

生成器是使用yield关键字定义的特殊类型的迭代器。与普通函数不同,生成器函数在执行时会暂停,并在下一次调用时继续执行。

用途

repr:用于将对象转换为可打印的字符串形式。

repr,全称是 representation(表示)。

示例

 1class Person:
 2    def __init__(self, name, age):
 3        self.name = name
 4        self.age = age
 5
 6    def __repr__(self):
 7        return f"Person({self.name}, {self.age})"
 8
 9# 创建一个Person对象
10person = Person("John", 20)
11
12# 使用repr()函数打印对象的__repr__方法返回的字符串
13print(person)

__str____repr__区别

在Python中,__str____repr__都是特殊方法,用于返回对象的字符串表示。它们的主要区别在于它们的目的和使用场景。

用途

Python 为每个对象实例创建一个 __dict__ 属性。这个字典用于存储实例的所有属性和方法。这种方式灵活但会消耗较多内存,因为每个实例都拥有一个独立的字典。

__slots__ 是 Python 类中用于定义类实例的固定属性的特殊属性。 如果使用 __slots__ 定义的属性,python 将使用一个固定大小的数组来存储属性,从而较少内存占用,提高属性访问速度。