53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
|
||
|
||
if __name__ == '__main__':
|
||
|
||
def fbb(start, stop, step):
|
||
x = start
|
||
while x <= stop:
|
||
yield x
|
||
x += step
|
||
# 上面是一个生成器函数,它只会在相应迭代时运行
|
||
|
||
# 在调用生成器函数的时候,因为直接生成了数字,所以有返回值
|
||
for i in fbb(0, 10, 1):
|
||
print(i)
|
||
|
||
# 尝试使用fbb生成金字塔
|
||
|
||
# 先用生成器整一个斐波那契数列生成函数
|
||
def fbb_arr(n):
|
||
index = 0
|
||
a0 = 1
|
||
a1 = 1
|
||
while index < n:
|
||
yield a0
|
||
a0, a1 = a1, a0 + a1
|
||
|
||
index += 1
|
||
|
||
# 按照n行打印出来
|
||
def print_num_delta(n):
|
||
# 计算需要生成多少个数字
|
||
fbb_number_num = sum(range(1, n + 1))
|
||
# 生成数字并保存
|
||
fbb_list = list(fbb_arr(fbb_number_num))
|
||
# 数字下标,用于遍历中保存位置
|
||
start_index = 0
|
||
|
||
# 每一行的数字数量
|
||
for number_num in range(1, n + 1):
|
||
# 切片用空格分隔后转成字符串
|
||
nums = ' '.join(str(item) for item in fbb_list[start_index: start_index + number_num])
|
||
# 格式化打印
|
||
print(format(nums, r' ^{}'.format(len(str(fbb_list[-1])) * n)))
|
||
# 更新下一行的数字下标
|
||
start_index = start_index + number_num
|
||
|
||
print_num_delta(5)
|
||
|
||
# 生成器里为什么没有return: 如果一个函数里包含yield语句,那就会被识别为生成器函数,
|
||
# 函数里的return此时自动失效被替换成生成器
|
||
# 生成器函数在识别到return时,意识到生成结束,返回的StopIteration,交给for识别
|
||
|