5. 生成器函数示例

range函数

作用

调用后,返回一个能够得到一系列整数的可迭代对象。

调用格式

range(stop)               # stop 停止整数
range(start, stop)        # start 开始整数
range(start, stop, step)  # step 步长

说明

生成器函数示例

仿照range()函数,写一个生成器函数my_range,替代 range函数的功能。

def my_range(start, stop=None, step=None):
    ... # 实现此处的代码


print(list(my_range(5)))  # [0, 1, 2, 3, 4]
print(list(my_range(5, 10)))  # [5, 6, 7, 8, 9]
print(list(my_range(1, 10, 2)))  # [1, 3, 5, 7, 9]

实现方式

# 生成器函数示例

# 仿照range()函数,写一个生成器函数my_range,替代 range函数的功能

def my_range(start, stop=None, step=None):
    # 1. 校正参数,得到开始值,结束值和步长
    if stop is None:
        stop = start
        start = 0
    if step is None:
        step = 1
    # 2. 判断开始值,结束值和步长是否都是整数,如果不是整数,则抛出TypeError异常
    if type(start) is not int:
        raise TypeError('start 不是整数!')
    if not isinstance(stop, int):
        raise TypeError('stop 不是整数!')
    if not isinstance(step, int):
        raise TypeError('step 不是整数!')
    # 3. 生成整数并用yield送回个迭代器的next()函数
    if step > 0:
        cur_value = start
        while cur_value < stop:
            yield cur_value
            cur_value += step
    elif step < 0:
        cur_value = start
        while cur_value > stop:
            yield cur_value
            cur_value += step

print(list(my_range(5)))  # [0, 1, 2, 3, 4]
print(list(my_range(5, 10)))  # [5, 6, 7, 8, 9]
print(list(my_range(1, 10, 2)))  # [1, 3, 5, 7, 9]

练习

写一个生成器函数 fibonacci_generator(n) 生成前n个斐波那契数列。

填写代码:

def fibonacci_generator(n):
    ...  # 填写次数的代码

fibonacci_list = list(fibonacci_generator(20))
print('前20个斐波那契数列:', fibonacci_list)