杨辉三角定义如下:

          1/ \1   1/ \ / \1   2   1/ \ / \ / \1   3   3   1/ \ / \ / \ / \1   4   6   4   1/ \ / \ / \ / \ / \
1   5   10  10  5   1

把每一行看做一个list,试写一个generator,不断输出下一行的list。

该题目考查生成器的应用。一般的思路是,首先在每一行输出一个1,随后通过循环,位置i(从2开始)的数是上一行i与i-1位置的数之和,当i与上一行数字个数相同时,循环终止,最后再添加进一个1,形成新的一行。

基于这个基本思路,将python的生成器运用到里面,有两种常见的写法:

一种写法如下:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def triangles():#杨辉三角的一种生成方法l = [1]while True : yield lfor i in range ( 1,len (l) ) :l [i] =  h [i] + h [i-1] l.append (1)h = l[:]

另外一种写法如下,运用了list的生成式:

 def triangles():l = [1]    while True :yield ll = [1] + [ l[i] + l[i+1] for i in range ( len (l) - 1)] + [1]

可以看到,以上两种写法都是相当简洁的。一开始这两个代码看不太懂,比如说为啥第一种写法里一开始h里面没有数,却也能够正常执行?主要是对于生成器的yield机制不明白,以及对于range的用法不是特别清楚。以下就这两点分别解释。

首先,当函数中出现了yield之后,该函数就不再被视为函数,而视为一个生成器。此时,整个函数被使用的语句流程会发生改变,一般的函数都是调用的时候从函数入口进,发现return或函数执行完毕后返回,而生成器函数则是每次调用函数执行,执行到yield返回,下次再调用函数的时候从上次yield返回处继续执行。

其次,range的用法中是,如果是【range(x,x) 其中x是常量】的形式,range依然返回空。故在上述代码的for循环中,由于在第一次试图循环的时候,后面的range要么是range(1,1)要么是range(0),故都会成功避开i或者h没有实际值的循环,执行接下来的部分。当第二次试图循环开始时,i和h内的内容都已经满足条件了,所以就能正常运行了。

还有一种我看到的最简单的写法:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''def triangles():L = [1]while True:yield LL= [(L + [0])[i] + ([0] + L)[i] for i in range(len(L)+1)]

这一种写法直接去掉了第二种写法里每次L两边额外插入的[1],使其变为了一个完整的一个list生成式,可以说是相当精妙。

那么,这种写法为什么也可以呢?我们再来分析一下杨辉三角的性质,这样,为了直观理解,我们先利用上面的代码,举一个运行中的过程例子。

比如,L此时为[1,1](杨辉三角第二行),现在需要求第三行。根据第五行的生成式,将按照以下步骤进行计算:

  1. L尾部加0,得到[1,1,0],我们称之为tempL1

  2. L首部加0,得到[0,1,1],我们称之为tempL2

  3. 现在,根据之后的for循环,L最终要被赋值成由tempL1与tempL2对应的每个相同位置数字之和所组成的列表,经过计算,这个新的L应该为[1,2,1]。居然确实是杨辉三角的第三行!

相信聪明的观众已经明白了,这个最简单的写法是利用了杨辉三角本身的对称性质,让同一行错开一位竖式相加,得到的就是下一行的结果。

同时,利用python里面本身就极为方便的列表扩展写法和列表生成式,才有了第三种如此简洁的写法~

Python中由生成杨辉三角代码所思考的一些问题相关推荐

  1. 用python中函数输出杨辉三角_用Python输出一个杨辉三角的例子

    这篇文章主要介绍了用Python和erlang输出一个杨辉三角的例子,同时还提供了一个erlang版杨辉三角,需要的朋友可以参考下 关于杨辉三角是什么东西,右转维基百科:杨辉三角 稍微看一下直观一点的 ...

  2. python生成器杨辉三角_python 生成器生成杨辉三角的方法(必看)

    用Python写趣味程序感觉屌屌的,停不下来 #生成器生成展示杨辉三角 #原理是在一个2维数组里展示杨辉三角,空的地方用0,输出时,转化为' ' def yang(line): n,leng=0,2* ...

  3. Python程序:输出杨辉三角的几种办法

    文章目录 一.问题描述 二.问题分析 三.第一种方法 1.具体代码 2.运行结果 3.程序的改进 四.第二种方法 1.具体代码 2.运行结果 五.总结分析 一.问题描述 给定一个非负整数 n,生成「杨 ...

  4. python杨辉三角代码,python实现杨辉三角的几种方法代码实例

    方法一:迭代 def triangle_1(x): """ :param x: 需要生成的杨辉三角行数 :return: """ trian ...

  5. 曾经vb,c ,c++,python,写过的杨辉三角,致敬杨老前辈

    // 杨辉三角形,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列.杨辉三角形同时对应于二项式定理的系数. 直角三角形杨辉三角 //c语言,求直角的 #include<stdi ...

  6. 用linux编译打印杨辉三角形,C语言打印杨辉三角代码及解析

    杨辉三角是我们从初中就知道的,现在,让我们用C语言将它在计算机上显示出来. 在初中,我们就知道,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和.这就是我们用C语言写杨辉三角的关键之一. ...

  7. C语言杨辉三角代码详解(超级详细,真的不进来看看吗?)

    杨辉三角:是二项式系数在三角形中的一种几何排列.它的两条斜边都是1,中间数字等于它肩上数字之和. 就像这样: 那么,如何用C语言写出杨辉三角呢? 思路 1.定义一个二维数组,赋初值为1,这里以四行四列 ...

  8. python杨辉三角函数公式大全,Python使用函数实现杨辉三角

    运行效果: 可在函数中指定阶层数,输出对应的杨辉三角 源代码如下: 1 # -*-coding:utf-8 -*- 2 ''' 3 chapter4_do.py 4 函数yanghui(n)用于输出n ...

  9. Java 杨辉三角代码

    1 1  1 1  2  1 1  3   3   1 1  4   6   4   1 1  5   10   10   5   1 ..... public class Yanghui{publi ...

最新文章

  1. linux负载很高是什么原因导致的?
  2. WeChall_PHP-0817
  3. SharePoint【学习笔记】-- SharePoint 2010 技术参数整理
  4. 内存工作原理及发展历程
  5. [Audio processing] Harmonic change detection function (HCDF)
  6. ArcGIS For Flex学习之Mapping---Map Extent and Mouse Coordinates
  7. ROS的学习(二十一)使用时间和TF
  8. 订阅机票时要注意的几个教训
  9. OpenCasCade中一个V3d_Viewer对应多个AIS_InteractiveContext的使用
  10. 计算机图形学 之 中点画线算法
  11. 互联网进入网盘新时代
  12. MySQL-多表操作
  13. 【Windows】安装openslide遇到的问题及解决办法
  14. PyTorch模型训练实战技巧,突破速度瓶颈
  15. 数据分析36计(23):长期转化率 A/B 实验的问题,用边际结构模型纠正后结论反转...
  16. 产品定位--如何进行互联网产品定位/制定产品目标?
  17. 世联行董事长、财务总监等辞职:大横琴“上位”,业绩暴雷持续
  18. linux 中的指令
  19. arduino编乐谱_【Arduino】用Arduino编首小曲子吧
  20. Pad居然可以写代码了?研究完我惊了,居然是中国创业公司的产品

热门文章

  1. IBM收购Clearleap,提供云视频服务
  2. H3C 路由器配置console密码登录[学习]
  3. C#interface定义及使用浅析
  4. HDUOJ 2089
  5. 【转载】SAP参数文件简介
  6. 【QM-03】Dynamic Modification Rule (动态修改规则)
  7. 【推荐】会开发和懂开发的区别
  8. 【SAP干货】创建Search Helps (Elementary and Secondary)
  9. 释疑の手工凭证界面不显示页数
  10. 生产订单修改记录的跟踪方法!