think python学习笔记(16)

选择数据结构时还需要考虑运行时间
例如,in运算符对于字典比列表要快,至少当元素的数目很大的时候
但是通常事先不知道哪个实现更快,一种选择是两个都实现,然后看哪个更快,这种方法被称作基准测试。
另一种是选择更容易实现的数据结构,然后看它对于拟定的应用是否足够快。如果是的话,就不需要继续了。如果不是,就可以使用一些工具,例如profile模块,识别程序中哪处最耗时
另一个需要考虑的因素是存储空间。例如,使用直方图表示后缀集合可能会用更少的空间,因为无论一个单词在文本中出现多少次,也只需要储存一次。对于很多应用,空间是运行时间之后的第二位考虑
最后,在此例中使用了一种数据结构同时进行分析和生成。但是它们这些是独立的步骤,使用一种数据结构进行分析,然后使用另一种数据结构进行生成也是可能的。如果生成节省的时间超过了转化花费的时间,也会提高程序的性能。

调试
在调试一个程序时,应该做到以下五点
细读:
检查代码,是否实现了预期功能
运行:
通过修改和运行不同的版本来不断试验。
思考:
思考错误的类型
小黄鸭调试法:
假设对别人解释
回退:
有时候,最好的做法是回退,撤销最近的修改,直到回到上个能运行的程序,开始重建

文件
介绍持久程序的概念
持久化
目前我们见到的大多数程序都是临时的,因为它们只运行一段时间并输出一些结果,但当它们结束时,数据也就消失了。如果再次运行程序,就将以全新的状态开始。
另一种程序是持久的,它们长时间运行(或者一直在运行),它们至少将一部分数据记录在永久存储(如一个硬盘中),如果关闭程序然后重新启动时,它们将从上次中断的地方开始继续
持久程序的一个例子是操作系统,在一台电脑开机后的绝大多数时间系统都在运行。另一个例子是网络服务器,不停地在运行,等待来自网络的请求
程序保存其数据的一个最简单方法,就是读写文本文件。
另一种方法是使用数据库保存程序的状态。

读取和写入
文本文件是储存在类似硬盘,闪存,或者CD-ROM等永久介质上的字符序列。我们在读取单词列表一节中接触了如何打开和读取文件。
要写入一个文件,你必须在打开文件时设置,第二个参数来为‘w’模式:

>>>fout = open('output.txt','w')

如果该文件已经存在,那么用写入模式打开它将会清空原来的数据并从新开始,所以重点。如果文件不存在,那么将创建一个新的文件。
open会返回一个文件对象,该对象提供了操作文件的方法。
write方法将数据写入文件。

line1 = "this here's the wattle,\n"
fout.write(line1)

返回值是被写入字符的个数。文件对象是跟踪自身的位置,所以下次调用write的时候,会在文件末尾添加新的数据。

line2 = "the emblem of our land.\n"
fout.write(line2)

完成文件写入后,应该关闭文件

fout.close()

如果你不关系这个文件,程序结束时它才会关闭。

格式化字符串
write的参数必须是字符串,所以如果想要在文件中写入其他值,我们需要先将它们转换为字符串。最简单的法是使用str

x = 52
fout.write(str(x))

另一个方法是使用格式化运算符,即%。作用于整数时,%是取模运算符,而当第一个运算符是字符串时,%则是格式化运算符。
第一个运算数是格式化字符串,它包含一个或多个格式化序列。格式化序列指定了第二个运算符是如何格式化的。运算结果是第一个字符串。
例如,格式化xulie‘%d’意味着第二个运算符应该被格式化为一个十进制整数

camels = 42
'%d'%camels

结果是字符串‘42’,需要和整数值42区分开来
一个格式化序列可以出现在字符串中的任何位置,所以可以将一个值嵌入到语句中:

'i have spotted %d camels'%camels

如果字符串中有多个格式化序列,那么第二个参数必须是一个元组。每个格式化序列按顺序和元组中的元素响应。
下面的例子中使用’%d’来格式化一个整数,‘%g’来格式化一个浮点数,以及‘%s’来格式化一个字符串

'in %d years i have spotted %g %s'%(3,0.1,camels)

元组中元素的个数必须等于字符串中格式化序列的个数。同时,元素的类型也必须符合对应的格式化序列:

'%d %d %d'%(1,2)
'%d'%'dollars'

在第一个例子中,元组中没有足够的元素
在第二个例子中,元素的类型错误

文件名和路径
文件以目录(也称为文件夹)的形式组织起来。每个正在运行的程序都有一个“当前目录”作为大多数操作的默认目录。
例如,当你打开一个文件来读取时,python会在当前目录下寻找这个文件、
os模块提供了操作文件和目录的函数。os.getcwd返回当前目录的名称

import os
cwd = os.getcwd()

cwd代表“current working directory”,即当前工作目录。在本例中,返回的结果是/home/dinsdale,即用户名为dinsdale的主目录
类似’/home/dinsdale’这样的字符串指明一个文件或者目录,叫做路径。
一个简单的文件名,如‘memo.txt’,同样被看做是一个路径,只不过是相对路径,因为它是相对于当前目录而言的。如果当前目录是/home/dinsdale,那么文件名memo.txt就代表/home/dinsdale/memo.txt。
一个以/开头的路径和当前目录无关,叫做绝对路径。要获得一个文件的绝对路径,可以使用os.path.abspath:

os.path.abspath('memo.txt')

os.path还提供了其它函数来对文件名和路径进行操作。例如,os.path.exists检查一个文件或者目录是否存在

os.path.exists('memo.txt')

如果存在,可以通过os.path.isdir检查它是否是一个目录:

os.path,isdir('memo.txt')
>True

类似,os.path.isfile检查它是否是一个文件。
os.listdir返回给定目录下的文件列表(以及其它目录)

os.listdir(cwd)

下例“遍历”一个目录,打印所有文件的名字,并且针对其中所有的目录递归的调用自身。

def walk(dirname):
	for name in os.listdir(dirname):
		path = os.path.join(dirname,name)
		if os.path.isfile(path):
			print(path)
		else:
			walk(path)

os.path.join接受一个目录和一个文件名,并把它们合并成一个完整的路径。
os模块提供了一个叫做walk的函数,和我们上面写的类似,但是功能更加丰富。作为练习,阅读文档并且使用walk打印出给定目录下的文件名和子目录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值