扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
triangles里用到了yield,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 triangles(5) 不会执行 triangles函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield L 时,triangles函数就返回一个迭代值,下次迭代时,代码从 yield L 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
塔河网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联自2013年创立以来到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
1 那个2去哪了
你看else语句 L1 = [1,1]每次L都是基于这个L1生成的 比如L=[1,2,1] 那么下一个L1就是[1,3,3,1],下一句L = L1 所以每次都是新的L1生成
2 画红圈的地方应该是和L1.insert(i,L[i-1+i])意思一样
不一样,插入的值是两个数的和
def triangles(max):
L = [1]
n = 0
while(nmax):
n = n+1
if(n == 2):
L=[1,1]
yield L
else:
i = 1
L1 = [1,1]
while(i=n-2):
L1.insert(i,L[i-1]+L[i])
i=i+1
L = L1
yield L
for n in triangles(5):
print n
用Python输出一个杨辉三角的例子
这篇文章主要介绍了用Python和erlang输出一个杨辉三角的例子,同时还提供了一个erlang版杨辉三角,需要的朋友可以参考下
关于杨辉三角是什么东西,右转维基百科:杨辉三角
稍微看一下直观一点的图:
代码如下:
杨辉三角有以下几个特点:
每一项的值等于他左上角的数和右上角的数的和,如果左上角或者右上角没有数字,就按0计算。
第N层项数总比N-1层多1个
计算第N层的杨辉三角,必须知道N-1层的数字,然后将相邻2项的数字相加,就能得到下一层除了最边上2个1的所有数字。 听起来有点像递归的思想,我们不妨假设我们已经知道N-1层的数字,来计算一下N层的数字吧。
代码如下:
def _yanghui_trangle(n, result):
if n == 1:
return [1]
else:
return [sum(i) for i in zip([0] + result, result + [0])]
上面代码中,result表示N-1层杨辉三角的数字。实习上,我们在列表2端各补了一个0,然后计算相邻项的和,就可以直接得到结果。
稍微完善一下代码:
代码如下:
def yanghui_trangle(n):
def _yanghui_trangle(n, result):
if n == 1:
return [1]
else:
return [sum(i) for i in zip([0] + result, result + [0])]
pre_result = []
for i in xrange(n):
pre_result = _yanghui_trangle(i + 1, pre_result)
yield pre_result
if __name__ == "__main__":
for line in yanghui_trangle1(5):
print line
_yanghui_trangle可以用lambda的方式简写,但是可读性感觉会变差,所以还是保持现状好了。
tips: 上面的程序并没有考虑数据格式化的问题,也就是说输出不是完美的三角形。
鉴于最近在学习erlang,补上一个erlang版本的,性能上没有测试过,不过还是要惊叹于函数式语言的表达能力:
代码如下:
-module(yanghui).
-author(lfyzjck).
-export([triangle/1]).
triangle_next(P) -
lists:zipwith(fun(X, Y) - X+Y end, [0|P], P ++ [0]).
triangle(1) -
[[1]];
triangle(N) -
L = triangle(N - 1),
[H|_] = L,
[triangle_next(H)|L].
程序输出需要实现如下效果:
[1]
[1,1]
[1,2,1]
[1,3,3,1]
......
方法:迭代,生成器
123456789101112131415161718192021
def triangles() L = [1] while True: yiled 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.由于yield为生成器中断输出,所以有了第一个次输出为[1]
2.继续while下面的yield后的循环,此时list长度为1,将其代入L中的len(L),得出[L[i]+L[i+1] for i in range(1-1)]得出为空值,所以yield L输出为[1,1]
3.此时len(L)值为2,代入得出[L[i]+L[i+1] for i in range(2-1)]为[L[i]+L[i+1] for i in range(1)],i能取值为0,代入后为[L[0]+L[1]],而L[0]和L[1]的值均为1(有上面结果可知),所以输出结果为[1,2,1]
4.由第三条可知此时len(L)值为3,代入得出[L[i]+L[i+1] for i in range(2)],i取值为0和1,通过循环输出有两个值,均为3,分别由[L[0]+L[1]],[L[1]+L[2]]
以此类推即可
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
执行你那个生成器,并生成6行杨辉三角的数据
经过观察你就会发现这个列表推导式[L[i-1] + L[i] for i in range(len(L))]是产生每一行的杨辉三角数据的。
L[i-1]+L[i]是根据前一行指定索引位置的杨辉三角数据,产生新的一行的数据
杨辉三角,是二项式系数在三角形中的一种几何排列。
前提:每行端点与结尾的数为1.
每个数等于它上方两数之和。
每行数字左右对称,由1开始逐渐变大。
第n行的数字有n项。
第n行数字和为2n-1。
第n行的m个数可表示为
C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数。
第n行的第m个数和第n-m+1个数相等
,为组合数性质之一。
每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。即
C(n+1,i)=C(n,i)+C(n,i-1)。
(a+b)n的展开式中的各项系数依次对应杨辉三角的第(n+1)行中的每一项。
将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数……连成一线,这些数的和是第4n+1个斐波那契数;将第2n行第2个数(n1),跟第2n-1行第4个数、第2n-2行第6个数……这些数之和是第4n-2个斐波那契数。
将各行数字相排列,可得11的n-1(n为行数)次方:1=11^0;
11=11^1;
121=11^2……当n5时会不符合这一条性质,此时应把第n行的最右面的数字”1”放在个位,然后把左面的一个数字的个位对齐到十位…
…,以此类推,把空位用“0”补齐,然后把所有的数加起来,得到的数正好是11的n-1次方。以n=11为例,第十一行的数为:1,10,45,120,210,252,210,120,45,10,1,结果为
25937424601=1110。
完整代码:
#!/usr/bin/python
#coding=utf-8
#
__author__
=
'cy'
#输出杨辉三角数值表
def
triangle(num):
#初始表值为[1]
triangle=[[1]]
#添加i个值([1])至triangle表,eg:[1]*3,triangle=[[1],
[1],
[1]]
for
i
in
range(2,
num+1):
triangle.append([1]*i)
#改变triangle表的值,eg:
#当num=5时,i取5,j取3
#triangle[4][1]
=
triangle[3][1]+triangle[3][0]
#triangle[4][2]
=
triangle[3][2]+triangle[3][1]
#triangle[4][3]
=
triangle[3][3]+triangle[3][2]
#相当于triangle表的第4位的值(这里的值为一个表)的第1,2,3位值等于第3位的值(这里的值也是一个表)的第1,2,3位值和0,1,2的值分别相加(即错位相加)。
for
j
in
range(1,
i-1):
triangle[i-1][j]
=
triangle[i-2][j]+triangle[i-2][j-1]
return
triangle
#格式化输出(输出的是一个表)
def
printtriangle(triangle,
width):
#列宽
column
=
len(triangle[-1])*width
for
sublist
in
triangle:
result
=
[]
for
contents
in
sublist:
#控制间距
result.append('{0:^{1}}'.format(str(contents),
width))
#控制缩进,{0:^{1}}:空格在两边补齐空位‘^’居中对齐,‘:’号后面带填充的字符
print('{0:^{1}}'.format(''.join(result),
column))
#启动函数
if
__name__
==
'__main__':
#输入整数
num
=
int(input('How
many
rows
do
you
want:'))
#打印信息
"The
triangle
rows
as
follows:"
triangle
=
triangle(num)
#列宽
width
=
len(str(triangle[-1][len(triangle[-1])//2]))+3
printtriangle(triangle,
width)
使用python实现杨辉三角
python教程-生成器
杨辉三角的特点:
1.每行端点与结尾的数为1
2.每个数等于它上方两数之和
3.第n行的数字有n项。
知道这三个特点即可
比如 L = [1,3,3,1]
L.append(0) = [1,3,3,1,0]
range(len(L)) 生成的数组是: [0,1,2,3,4]
使用python列表生成式:
L = [L(n) + L(n-1) for n in [0,1,2,3,4]]
当 n=0 时, n-1=-1 ,这时候取倒数第一个元素 0 ,所以 1+0 = 1
剩下的元素就是 n + (n-1) = 新的元素
最后输出:
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流