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识别