以杨辉三角形的三种实现体会python的编程特性

杨辉三角形因为其形式简单,又有一定的使用价值,因此是入门编程题中被用的最多的,也是很好的语言实例标的。

下面就杨辉三角形使用python的三种解法,来看看看python的编程特性。

第一种:传统编程思路

这种思路的特点是中规中矩,符合一般人的思考思路,特别适合初学编程的人员阅读。但缺点是传统命令式编程使得代码显得比较繁琐。这个解法显然也没怎么用python的语言特征,换成其他语言几乎可以逐行照搬。代码如下:

 1 # 传统的杨辉三角形实现
 2 def pascal(row):
 3     result_list = [0] * (row * 2 + 1)
 4
 5     for row_loc in range(row):
 6         base_loc = row - row_loc - 1
 7         if row_loc == 0:
 8             result_list[base_loc] = 1
 9         else:
10             result_list[base_loc] = result_list[base_loc + 1]
11             for line_loc in range(row_loc):
12                 now_loc = base_loc + (line_loc + 1) * 2
13                 result_list[now_loc] = result_list[now_loc - 1] + result_list[now_loc + 1]
14                 result_list[now_loc - 1] = 0
15
16         print str(result_list) 17             .replace("]", ",").replace(" 0,", "  ").replace(",", "").replace("[0", "  ").replace("[", " ")
18
19 pascal(15)

第二种:基于python的列表迭代的思路

这个实现利用python的列表处理特性来实现,代码比传统思路要简洁很多,也还算好懂。缺点是仍然不够简洁。代码如下(来自于毛豆子,原文链接:http://www.cnblogs.com/maodouzi/archive/2011/07/12/2104153.html):

 1 # 利用python列表迭代的实现
 2 def printLine(lineList,row):
 3     lineList = [str(tmpNum) for tmpNum in lineList]
 4     print("%s%s" % (" " * (row - len(lineList)), " ".join(lineList)))
 5
 6 def pascal(row):
 7     for i in range(row):
 8         if i < 2:
 9             yhList = [1] * (i + 1)
10         else:
11             yhList[1:-1] = [(tmpNum + yhList[j])  for j, tmpNum in enumerate(yhList[1:])]
12         printLine(yhList,row)
13
14 pascal(10)

第三种:函数式编程思路

这个实现大量利用了python这种现代语言的特征,函数式编程+map-reduce的实现方案使得代码极为简练。另外row函数完全无依赖地得到任意一行的数据行,这也很好地体现了函数式编程无依赖的特性。不过对于不熟悉这套解法的人员来说,显然代码的可读性不太好,看起来比较费劲。但随着大家都开始熟悉这种编程范式,其可读性问题应该可以得到缓解。另外一个缺点是由于过分追求函数式编程,使得为了居中的长度计算就使得每行的计算都附带了一次最后一行的计算,同时每行不能利用上一次的计算结果,因此计算复杂度显然提升了很多,这不能不说是函数式编程的一个问题。代码如下(来自于expl0rer,原链接为:http://www.oschina.net/code/snippet_103482_17210 ):

1 # 基于函数式编程思路的实现
2 def row(x):
3     return ‘ ‘.join(map(str, reduce(lambda x, y: map(  sum, zip([0] + x, x + [0])  ), range(x), [1] )))
4
5 def pascal(x):
6     return ‘\n‘.join(row(i).center(len(row(x - 1))) for i in range(x))
7
8 print pascal(10)

原文地址:https://www.cnblogs.com/kevins-yuan/p/9990449.html

时间: 2024-10-07 14:05:58

以杨辉三角形的三种实现体会python的编程特性的相关文章

初窥Python(四)——三种方法判断python变量类型

python 是动态语言,定义变量时不用指定变量类型,在代码执行过程中,会根据变量的值确定变量类型.python 中常用的变量类型有 int  float  long  bool  str  list  tuple set dict 等,常用的变量类型的有 types 库及内置的 type(object) 和 isinstance(object,class-or-type-or-tuple) 方法,下面分别来看一下如何通过这些方法进行变量类型的判断. 1.使用types库结合type(objec

命令行运行Python脚本时传入参数的三种方式

三种常用的方式如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. python script.py 0,1,2 10python script.py -gpus=0,1,2 --batch-size=10python script.py -gpus=0,1,2 --batch_size=10123这三种格式对应不同的参数解析方式,分别为sys.argv, argparse, tf.app.run, 前两者是python自带的功能,后者是ten

js(20140517)在JS方法中返回多个值的三种方法

在JS方法中返回多个值的三种方法 在使用JS编程中,有时需要在一个方法返回两个个或两个以上的数据,用下面的几种方法都可以实现: 1 使用数组的方式,如下: <html> <head> <title>JS函数返回多个值--oec2003</title> </head> <body> <input type="button" onclick="getNames()" value="t

Python核心编程2第一章课后练习

1-1 在windows下的安装方法在网上下载python2.7直接安装到C盘1)在系统变量中找到path. 2)编辑path值,添加你安装的python路径,C:\Python27. 3)检验python是否安装配置成功,打开cmd,输入python,如果出现以下界面,则说 明你的python安装成功了.   1-2 a.三种方法执行python 1)启动交互式解释器powershell python,每次输入一行python代码 2)运行python的脚本 3)集成开发环境图形界面(IDLE

【机器学习算法-python实现】协同过滤(cf)的三种方法实现

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 协同过滤(collaborative filtering)是推荐系统常用的一种方法.cf的主要思想就是找出物品相似度高的归为一类进行推荐.cf又分为icf和ucf.icf指的是item collaborative filtering,是将商品进行分析推荐.同理ucf的u指的是user,他是找出知趣相似的人,进行推荐.通常来讲icf的准确率可能会高一些,通过这次参加天猫大数据比赛,我觉得只有在数据量非

python下载文件的三种方法

Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件.此外Python还提供了另外一种方法requests. 下面来看看三种方法是如何来下载zip文件的:方法一: import urllib import urllib2 import requests print "downloading with urllib" url = 'http://***/test/demo.zip

python实现堆排序的三种方式

# -*- coding: utf-8 -*- """ Created on Fri May 16 14:57:50 2014 @author: lifeix """ import heapq #堆排序 #第一种实现 def Heapify(a, start, end): left = 0 right = 0 maxv = 0 left = start * 2 right = start * 2 + 1 while left <= end:

selenium中的三种等待方式(显示等待WebDriverWait()、隐式等待implicitly()、强制等待sleep())---基于python

我们在实际使用selenium或者appium时,等待下个等待定位的元素出现,特别是web端加载的过程,都需要用到等待,而等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,在selenium中(appium通用)常用的等待分为显示等待WebDriverWait().隐式等待implicitly_wait().强制等待sleep()三种,下面我们就分别介绍一下这三种等待的区别 在前面的博文中简单介绍了<强制等待和隐士等待的区别和理解>,本文再详细的结合案例进行理解. sleep(): 强

python编程(python开发的三种运行模式)【转】

转自:http://blog.csdn.net/feixiaoxing/article/details/53980886 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 单循环模式 多线程模式 reactor模式 [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] Python作为一门脚本语言,使用的范围很广.有的同学用来算法开发,有的用来验证逻辑,还有的作为胶水语言,用它来粘合整个系统的流程.不管怎么说,怎么使用pyt