Python中由生成杨辉三角代码所思考的一些问题
杨辉三角定义如下:
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](杨辉三角第二行),现在需要求第三行。根据第五行的生成式,将按照以下步骤进行计算:
L尾部加0,得到[1,1,0],我们称之为tempL1
L首部加0,得到[0,1,1],我们称之为tempL2
现在,根据之后的for循环,L最终要被赋值成由tempL1与tempL2对应的每个相同位置数字之和所组成的列表,经过计算,这个新的L应该为[1,2,1]。居然确实是杨辉三角的第三行!
相信聪明的观众已经明白了,这个最简单的写法是利用了杨辉三角本身的对称性质,让同一行错开一位竖式相加,得到的就是下一行的结果。
同时,利用python里面本身就极为方便的列表扩展写法和列表生成式,才有了第三种如此简洁的写法~
Python中由生成杨辉三角代码所思考的一些问题相关推荐
- 用python中函数输出杨辉三角_用Python输出一个杨辉三角的例子
这篇文章主要介绍了用Python和erlang输出一个杨辉三角的例子,同时还提供了一个erlang版杨辉三角,需要的朋友可以参考下 关于杨辉三角是什么东西,右转维基百科:杨辉三角 稍微看一下直观一点的 ...
- python生成器杨辉三角_python 生成器生成杨辉三角的方法(必看)
用Python写趣味程序感觉屌屌的,停不下来 #生成器生成展示杨辉三角 #原理是在一个2维数组里展示杨辉三角,空的地方用0,输出时,转化为' ' def yang(line): n,leng=0,2* ...
- Python程序:输出杨辉三角的几种办法
文章目录 一.问题描述 二.问题分析 三.第一种方法 1.具体代码 2.运行结果 3.程序的改进 四.第二种方法 1.具体代码 2.运行结果 五.总结分析 一.问题描述 给定一个非负整数 n,生成「杨 ...
- python杨辉三角代码,python实现杨辉三角的几种方法代码实例
方法一:迭代 def triangle_1(x): """ :param x: 需要生成的杨辉三角行数 :return: """ trian ...
- 曾经vb,c ,c++,python,写过的杨辉三角,致敬杨老前辈
// 杨辉三角形,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列.杨辉三角形同时对应于二项式定理的系数. 直角三角形杨辉三角 //c语言,求直角的 #include<stdi ...
- 用linux编译打印杨辉三角形,C语言打印杨辉三角代码及解析
杨辉三角是我们从初中就知道的,现在,让我们用C语言将它在计算机上显示出来. 在初中,我们就知道,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和.这就是我们用C语言写杨辉三角的关键之一. ...
- C语言杨辉三角代码详解(超级详细,真的不进来看看吗?)
杨辉三角:是二项式系数在三角形中的一种几何排列.它的两条斜边都是1,中间数字等于它肩上数字之和. 就像这样: 那么,如何用C语言写出杨辉三角呢? 思路 1.定义一个二维数组,赋初值为1,这里以四行四列 ...
- python杨辉三角函数公式大全,Python使用函数实现杨辉三角
运行效果: 可在函数中指定阶层数,输出对应的杨辉三角 源代码如下: 1 # -*-coding:utf-8 -*- 2 ''' 3 chapter4_do.py 4 函数yanghui(n)用于输出n ...
- 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 ...
最新文章
- linux负载很高是什么原因导致的?
- WeChall_PHP-0817
- SharePoint【学习笔记】-- SharePoint 2010 技术参数整理
- 内存工作原理及发展历程
- [Audio processing] Harmonic change detection function (HCDF)
- ArcGIS For Flex学习之Mapping---Map Extent and Mouse Coordinates
- ROS的学习(二十一)使用时间和TF
- 订阅机票时要注意的几个教训
- OpenCasCade中一个V3d_Viewer对应多个AIS_InteractiveContext的使用
- 计算机图形学 之 中点画线算法
- 互联网进入网盘新时代
- MySQL-多表操作
- 【Windows】安装openslide遇到的问题及解决办法
- PyTorch模型训练实战技巧,突破速度瓶颈
- 数据分析36计(23):长期转化率 A/B 实验的问题,用边际结构模型纠正后结论反转...
- 产品定位--如何进行互联网产品定位/制定产品目标?
- 世联行董事长、财务总监等辞职:大横琴“上位”,业绩暴雷持续
- linux 中的指令
- arduino编乐谱_【Arduino】用Arduino编首小曲子吧
- Pad居然可以写代码了?研究完我惊了,居然是中国创业公司的产品