概念
一边循环一边计算的机制,称为生成器:generator。
题目
杨辉三角定义如下:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
把每一行看做一个list,试写一个generator,不断输出下一行的list:
# -*- coding: utf-8 -*-
def triangles():
# 期待输出:
# [1]
# [1, 1]
# [1, 2, 1]
# [1, 3, 3, 1]
# [1, 4, 6, 4, 1]
# [1, 5, 10, 10, 5, 1]
# [1, 6, 15, 20, 15, 6, 1]
# [1, 7, 21, 35, 35, 21, 7, 1]
# [1, 8, 28, 56, 70, 56, 28, 8, 1]
# [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
n = 0
for t in triangles():
print(t)
n = n + 1
if n == 10:
break
答案
def triangles():
L=[1]
while True:
yield L
L=[1]+[L[i]+L[i+1]for i in range(len(L)-1)]+[1]
n=0
for t in triangles():
print(t)
n+=1
if n ==10:
break
思路
杨辉三角的规律:
1、第n行有n个数字
2、每行的前后,都是“1”
3、第n行的第L[i]的值,等于第n-1行第L[i]+L[i+1]的值
解法
定义函数,求杨辉三角
定义第一个数组,初始化是[1],也就是杨辉三角的第一个值。
随后建一个生成器,使用yield函数来声明这是一个生成器并循环打印L(该行数组)为:[1]+[L[i]+L[i+1]for i in range(len(L)-1)]+[1]
下面开始不懂:
首末两位是1,中间是一个循环,循环内容:[L[i]+L[i+1]for i in range(len(L)-1)],代表中间的那些数字,这其中:
求得的值:L[i]+L[i+1]
形参:i
实参:range(len(L)-1)] #这里不懂,range是一个序列,代表从0到len(L)-1,L是一个序列,它的长度是什么呢?