软工计算一 20240422

1. python中的iter()函数 迭代子

Python 中的 iter() 函数是内置函数,它负责创建一个迭代器。这个函数接受两个参数:

  1. 第一个参数是准备转换为迭代器的对象。
  2. 第二个参数是一个可选的 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 函数是一个生成器,它使用递归来产生斐波那契数列的项。函数接受三个参数:

  1. n:要生成的斐波那契数列的项数。
  2. a:数列的第一项,默认为 0。
  3. b:数列的第二项,默认为 1。

n 大于 0 时,函数首先 yield 第一项 a。如果 n 大于 1,它接着 yield 第二项 b,然后递归地调用自己来生成剩余的数列项,同时使用 yield from 将递归调用的结果集成到当前生成器中。

使用 yield fromfibonacci 函数可以递归地调用自身,同时保持一个统一的视图,对外表现为一个单一的生成器。

最后,我们通过一个 for 循环来迭代 fibonacci(10) 生成器,它会按顺序打印出前 10 项斐波那契数列的值。

posted @ 2024-04-22 09:13  陆舟LandBoat  阅读(18)  评论(0)    收藏  举报