5. 生成器函数示例
range函数
作用
调用后,返回一个能够得到一系列整数的可迭代对象。
调用格式
range(stop) # stop 停止整数
range(start, stop) # start 开始整数
range(start, stop, step) # step 步长
说明
- 省略 step 参数,则默认为 1。
- 省略 start 参数,则默认为 0。
生成器函数示例
仿照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个斐波那契数列。
- 斐波那契数列的第一个数是0,第二个数是1,后续每一项都是前两项的和。
- 数列的前几项为:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
填写代码:
def fibonacci_generator(n):
... # 填写次数的代码
fibonacci_list = list(fibonacci_generator(20))
print('前20个斐波那契数列:', fibonacci_list)