整合范围:Lecture 15 至 Lecture 17。内容以课堂笔记为主,并进行了 Markdown 格式整理。

目录


Lecture 15: Mutability

可变性(Mutability)

描述对象能不能被原地修改的性质:

  • 可变(Mutable)对象包括 listdict(dictionary)等。
  • 不可变(Immutable)对象包括 intfloattuple 等。

原地修改与重新绑定

原地修改指对象身份不变,而对象的内容发生变化。例如,执行 a = 1 后再执行 a = 2,事实上是让 a 指向另一个对象,前后对象的 id 不同;而对 list 进行原地操作时,列表对象的 id 不变。

Python 中的直接赋值不会复制对象。执行 a = b 后,ab 会绑定到同一个对象;对于可变(Mutable)对象尤其需要注意:

  • 若对这个共享对象进行原地修改,通过 ab 都能观察到变化。
  • 若只是让 b 重新绑定到另一个对象,则不会影响 a

元组(Tuple)

与列表类似,区别在于元组本身不可变(Immutable)。只有当元组中的所有元素都可哈希(hashable)时,元组才可作为字典的键。

一个元组即使包含可变对象,其本身仍然不可变,但其中的可变对象可以被原地修改。例如,([1, 2], 3) 是包含列表的元组,因此不可哈希,不能作为字典的键。

同一性运算符(Identity Operator)

判断 表达式 含义
同一(Identity) <exp0> is <exp1> 二者是否指向同一个对象(object)
相等(Equality) <exp0> == <exp1> 二者的值(value)是否相同

Lecture 16: Iterators

迭代器(Iterators)

一个容器(Container)可以生成一个按顺序访问其元素的迭代器。

  • iter(iterable):返回一个迭代器。
  • next(iterator):返回迭代器的下一个元素。

用于迭代的内置函数(Built-in Functions for Iteration)

函数 迭代内容
map(func, iterable) 依次产生 func(x)
filter(func, iterable) 依次产生使 func(x) 为真的 x
zip(first_iter, second_iter) 依次产生 (x, y)
reversed(sequence) 反向迭代 sequence

以上函数均返回迭代器。


Lecture 17: Generators

生成器和生成器函数(Generators and Generator Functions)

一个函数的函数体中只要包含 yield 语句,它就是生成器函数(Generator Function)。调用生成器函数会返回一个生成器(Generator),且不会立即执行函数主体。

生成器的执行

  • 首次调用 next(generator) 时,函数从开头执行,直到遇到下一条 yield 语句并返回该值。
  • 后续调用 next(generator) 时,函数从上一次 yield 暂停之后的位置继续执行,直到遇到下一条 yield
  • 生成器结束后,再调用 next(generator) 会抛出 StopIteration
  • yield from iterator_or_iterable:依次产出迭代器或可迭代对象中的所有元素。