天天看点

斐波那契数列

1 案例1:斐波那契数列

1.1 问题

编写fib.py脚本,主要要求如下:

1.2 方案

斐波那契数列就是某一个数,总是前两个数之和,比如0,1,1,2,3,5,8。由于输出是一串数字,可以用列表的结构存储。开始时,列表中有两个值,即0,1。然后通过循环向列表中追加元素,追加元素总是列表中最后两个元素值之和。

本例使用的是列表,不能使用元组,因为列表是一个可变类型,而元组是不可变类型。各种数据类型的比较如下:

按存储模型分类

标量类型:数值、字符串

容器类型:列表、元组、字典

按更新模型分类:

可变类型:列表、字典

不可变类型:数字、字符串、元组

按访问模型分类

直接访问:数字

顺序访问:字符串、列表、元组

映射访问:字典

由于循环次数是确定的,可以使用for循环。python中的for循环与传统的for循环(计数器循环)不太一样,它更象shell脚本里的foreach迭代。python中的for接受可迭代对象(例如序列或迭代器)作为其参数,每次迭代其中一个元素。

for循环经常与range()函数一起使用。range函数语法如下:

range函数将返回一个列表,如果列表没有给定起始值,那么起始值从0开始,结束值是给定的结束值的前一个值,另外还可以设置步长值。例:

当将脚本改成交互式运行时,需要注意,用户输入的数字,python仍然将其视为字符而不是整型数字,需要使用int()将用户输入做类型转换。

在进行运算时,应使得参与运算的对象属于同一类型,否则如果python无法进行隐匿类型转换将会出现异常。

上面的代码之所以出现错误,是因为不能将字符串与数字进行加法或拼接运算。如果希望将其拼接,可以使用下面的方式:

如果希望将其全作为数字进行相加,可以使用下面的方式:

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:编写固定输出的斐波那契数列

执行结果如下:

步骤二:将脚本改为交互式执行

如果希望生成用户指定个数的数列,需要与用户进行交互,通过raw_input()函数读取用户指定的长度。因为raw_input()函数读入的数据均为字符串,所以需要对其进行类型转换,通过int()函数将字符串类型的数值转换成数字类型。

为了能够进行加法计算,需要提前拥有两个数值。既然已经存在两个值,那么用户指定数列个数后,在循环时,应该少循环两次。

修改后的代码如下:

脚本运行结果如下:

2 案例2:模拟cp操作

2.1 问题

编写cp.py脚本,实现以下目标:

2.2 方案

“拷贝”一个文件,可以想像成谅是先在目标位置创建一个空文件,然后再将源文件读出,写入到新文件中。

在python中打开文件的方法是open(),或者使用file(),两个函数完全一样可以进行相互替换。open的语法如下:

open的第一个参数是文件名,可以是相对路径,也可以是绝路径。最后的一个参数是缓冲设置,默认情况下使用缓冲区。硬盘是计算机系统中最慢的一个组件,如果每产生一个字符都立即写入磁盘,那么这种方式的工作效率将极其低下,可以先把数据放在内存的缓冲区中,当缓冲区的数据比较多的时候,再批量写入磁盘文件。当文件关闭的时候,缓冲区的数据也会写入磁盘。第二个模式参数的含义如下:

打开文件时并不消耗太多内存,但是将文件内容读到变量中,会根据读入的数据大小消耗相应的内存。例:

为了防止一次性读入大文件消耗太多的内存,可以采用循环的方式,多次少量读取数据。一般情况下可以设置每次读取4096字节即可。

2.3 步骤

步骤一:编写脚本

注意,通常文件操作有三个步骤:打开文件,处理文件,关闭文件。往往被忽略的是关闭文件,如果文件没有正常关闭,有可能造成数据丢失。

步骤二:通过md5值判断新老文件是否完全一致

md5值是文件的指纹信息,如果两个文件的内容完全一样,那么其md5值一定相同,如果两个文件有微小的不同,其md5值也一定完全不一样。不过文件的权限不会影响md5值的判定。将拷贝后的目标文件加上执行权限,就可以像原始文件一样的工作了。

3 案例3:生成8位随机密码

3.1 问题

编写randpass.py脚本,实现以下目标:

3.2 方案

假定只使用大小写字母和数字作为密码,这些字符可以自己定义,不过string模块中已有这些属性。通过导入string模块可以减少代码量,同时提高效率。

这个程序的主要思路是,首先创建一个空字符串变量用于存储密码,然后每次在可用字符中随机选择一个字符,再把该字符与变量中的字符进行拼接。

3.3 步骤

步骤一:编写脚本,生成8位随机密码

步骤二:改进脚本,生成指定位数的随机密码

上面程序的主要问题是,第一,生成的密码倍数是固定的,如果希望生成其他倍数的密码,还需要重新改写代码;第二,如果生成密码这个功能在其他地方也需要使用,那么代码的重用性得不到体现。

改进的代码可以解以上两个问题,具体如下:

代码执行结果如下:

继续阅读