迭代器(Iterator)
迭代器 是 Python 中的一个对象,它支持 __iter__()
和 __next__()
这两个魔法方法(也称为特殊方法或双下划线方法)。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器的一个典型用途是遍历容器(如列表、元组或字符串)中的元素,而无需在循环体内修改索引。此外,迭代器也是实现惰性求值(lazy evaluation)和节省内存空间的好工具,因为它们允许你在需要时
才生成值,而不是一次性生成所有值。
示例代码:
# 创建一个列表
my_list = [1, 2, 3, 4, 5]
# 获取迭代器
my_iter = iter(my_list)
# 使用 next() 函数获取迭代器中的元素
print(next(my_iter)) # 输出 1
print(next(my_iter)) # 输出 2
# ... 以此类推,直到 StopIteration 异常
# 也可以使用 for 循环遍历迭代器
for item in my_iter:
print(item) # 只会输出剩余的元素(从3开始),因为前面的元素已经被 next() 消耗了
切片器(Slicer)
在 Python 的语境中,切片器 通常不是指一个独立的对象或类型,而是指使用切片(slicing)语法从序列类型(如列表、元组、字符串)中获取子序列的能力。切片语法的基本形式为 sequence[start:stop:step]
,其中 start
是起始索引(包含),stop
是停止索引(不包含),step
是步长。
示例代码:
# 创建一个列表
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 使用切片语法获取子列表
sub_list = my_list[1:5:2] # 从索引1开始,到索引5(不包含),每隔一个元素取一个
print(sub_list) # 输出 [2, 4]
# 切片也可以省略某些参数,表示使用默认值
sub_list = my_list[:5] # 从开始到索引5(不包含)
print(sub_list) # 输出 [1, 2, 3, 4, 5]
sub_list = my_list[::-1] # 反转列表
print(sub_list) # 输出 [9, 8, 7, 6, 5, 4, 3, 2, 1]
请注意,虽然切片器不是一个独立的对象类型,但切片操作本身会返回一个新的序列对象,该对象包含原始序列中指定范围内的元素。
生成器(Generator)
生成器(Generator)是Python中一种特殊的迭代器,它允许你定义一个可迭代的函数,该函数可以记住上一次返回时在函数体中的位置。
对生成器函数的第二次(或第n次)调用将执行函数并从上次停止的yield
语句处继续执行,而函数的局部变量和其他状态将被保留。这与普通的函数不同,因为普通的函数在返回后就会丢失其局部变量和其他状态。
生成器的主要优势是它们提供了一种高效、简洁的方式来迭代数据,而无需在内存中创建完整的列表。这对于处理大量数据或无限序列时特别有用。
以下是关于生成器的详细描述和示例:
1. 生成器函数
生成器函数是一个返回生成器的函数。在函数定义中,你可以使用yield
语句来定义生成器的行为。每次调用yield
时,生成器都会“产生”一个值,并暂停执行,等待下一次迭代。
示例代码
一个简单的生成器函数,用于生成斐波那契数列:
def fibonacci(n):
a, b = 0, 1
while a < n:
yield a
a, b = b, a + b
# 使用for循环迭代生成器
for num in fibonacci(10):
print(num) # 输出: 0 1 1 2 3 5 8
在这个示例中,fibonacci
函数是一个生成器函数,它使用yield
语句来逐个产生斐波那契数列中的数字。当我们使用for
循环迭代这个生成器时,它会从上次停止的yield
语句处继续执行,并产生下一个斐波那契数。
2. 生成器表达式
生成器表达式是创建生成器的简洁方式,它类似于列表推导式,但使用圆括号()
而不是方括号[]
。生成器表达式在语法上更简洁,并且在处理大量数据时更节省内存。
示例代码
一个生成器表达式,用于生成0到9的平方:
squares = (x**2 for x in range(10))
# 使用for循环迭代生成器
for num in squares:
print(num) # 输出: 0 1 4 9 16 25 36 49 64 81
在这个示例中,squares
是一个生成器表达式,它使用for
循环和yield
表达式的简写形式来生成0到9的平方。当我们使用for
循环迭代这个生成器时,它会逐个计算并产生每个平方数。
生成器提供了一种在迭代时逐个产生值的方法,而无需在内存中创建完整的列表。它们通过yield
语句在函数体中的位置暂停和恢复执行,从而实现了“惰性计算”或“延时求值”的机制。生成器函数和生成器表达式是创建生成器的两种常见方式,它们在处理大量数据或无限序列时特别有用。