软工计算一 20240422

1. python中的iter()函数 迭代子
Python 中的 iter() 函数是内置函数,它负责创建一个迭代器。这个函数接受两个参数:
- 第一个参数是准备转换为迭代器的对象。
- 第二个参数是一个可选的 sentinel 对象,它用于迭代器中的
next()方法,当迭代器到达 sentinel 值时会停止迭代。
基本用法
当 iter() 函数只有一个参数时,它将该对象作为迭代器。这个对象必须有自己的 __iter__() 方法,该方法返回一个迭代器对象。
示例:
my_list = [1, 2, 3, 4, 5]
my_iter = iter(my_list)
print(next(my_iter)) # 输出: 1
print(next(my_iter)) # 输出: 2
在这个例子中,my_list 是一个列表,它有一个 __iter__() 方法,返回一个迭代器,可以迭代列表中的元素。
使用 sentinel 参数
当 iter() 函数有两个参数时,它创建一个迭代器,该迭代器会无限迭代,直到 next() 方法返回的值与 sentinel 值相等。
示例:
def infinite_sequence():
count = 0
while True:
yield count
count += 1
# 使用 iter() 函数和 sentinel 来控制迭代
it = iter(infinite_sequence())
try:
while True:
value = next(it)
if value == 10: # Sentinel value
break
print(value)
except StopIteration:
print("Iteration stopped.")
在这个例子中,infinite_sequence 函数生成一个无限的迭代器。我们使用 iter() 函数将其转换为迭代器 it,并通过设置一个 sentinel 值(在这个例子中是数字 10)来控制迭代,这样当迭代到数字 10 时迭代就会停止。
iter() 函数是实现自定义迭代器和生成器时的一个有用工具,它允许你以统一的方式处理可迭代对象和无限序列。
2.迭代器



还有reversed



3.生成器
生成器
生成器最明显的特点就是不同return返回值,而是使用yield返回值。生成器不使用对象的属性在序列中跟踪其进度。相反,它们控制生成器函数的执行,每次调用生成器上的next时,该函数将一直运行,直到执行下一个yield语句。
def letters_generator():
current = 'a'
while current <= 'd':
yield current
current = chr(ord(current)+1)
for letter in letters_generator():
print(letter)
a
b
c
d
yield声明标识函数是一个生成器函数。每次调用生成器函数时,不返回特定的值,而是返回一个生成器。next函数调用生成器得到下一个值,只有当next函数调用时,生成器函数的函数体才会被执行。
letters = letters_generator()
type(letters)
<class 'generator'>
next(letters)
'a'
next(letters)
'b'
next(letters)
'c'
next(letters)
'd'
next(letters)
Traceback (most recent call last):
File "", line 1, in
StopIteration


生成器加递归
当然,这里有一个使用生成器和递归来生成斐波那契数列的例子。斐波那契数列是一个每一项都是前两项和的数列,通常定义为 F(0) = 0, F(1) = 1, 且对于 n > 1, 有 F(n) = F(n-1) + F(n-2)。
def fibonacci(n, a=0, b=1):
""“生成器函数,产生斐波那契数列的前 n 项。”
如果 n 是 0,则不产生任何值。
如果 n 是 1,则只产生 a(通常是 0)。
从第二次迭代开始,产生 a 和 b,然后递归地产生剩余的数列项。
"""
if n > 0:
yield a
if n > 1:
yield b
yield from fibonacci(n-1, b, a+b)
# 使用生成器
fib = fibonacci(10) # 生成前 10 项斐波那契数列
for val in fib:
print(val, end=' ') # 输出: 0 1 1 2 3 5 8 13 21 34
在这个例子中,fibonacci 函数是一个生成器,它使用递归来产生斐波那契数列的项。函数接受三个参数:
n:要生成的斐波那契数列的项数。a:数列的第一项,默认为 0。b:数列的第二项,默认为 1。
当 n 大于 0 时,函数首先 yield 第一项 a。如果 n 大于 1,它接着 yield 第二项 b,然后递归地调用自己来生成剩余的数列项,同时使用 yield from 将递归调用的结果集成到当前生成器中。
使用 yield from,fibonacci 函数可以递归地调用自身,同时保持一个统一的视图,对外表现为一个单一的生成器。
最后,我们通过一个 for 循环来迭代 fibonacci(10) 生成器,它会按顺序打印出前 10 项斐波那契数列的值。

浙公网安备 33010602011771号