本节介绍常用的模块和函数
包含一些与解释器关系紧密的变量和函数
#argv变量的使用——反序打印命令行参数
import sys
args = sys.argv[1:]
#此处跳过了第一个元素,那是脚本的名字
#这里对sys.argv进行了复制,当然我们也可以在原始列表上操作,但是不安全
args.reverse() #反序排列,不返回值
print ' '.join(args) #因为是用ipython notebook打开,会有很多参数
提供了访问多个操作系统服务的功能
os和它的子模块os.path还包括一些检查、构造、删除目录和文件的函数,以及一些处理路径的函数
#environ映射可以访问环境变量,也可以更改(但不是所有系统都能支持)
import os
#查看LANG环境变量
os.environ['LANG']
#sep是当前系统的路径名分隔符
os.sep
#UNIX好像没有可选的分隔符????
os.altsep
#pathsep是当前系统的多个路径名的分隔符
os.pathsep
用于遍历文本文件的所有行
#fileinput使用——为python脚本添加行号(在行末作为注释)
import fileinput
for line in fileinput.input('/home/zk/桌面/chap10 自带电池/hello2.py',inplace=True): #inplace为真,文本内容可修改
line = line.rstrip() #rstrip方法删除字符串末尾的指定字符(默认为空格)并返回结果
num = fileinput.lineno()
print '%-40s # %2i' % (line, num)
#inplace参数的使用很容易破坏程序,要十分小心
Set类位于sets模块中,一般不需要创建Set类的实例,除非为了兼容python2.3以前的版本
集合是由序列或者其他可迭代对象构建的,主要用于成员资格检查,副本会被忽略(集合的互异性)
#集合的互异性
set([0,0,0,0,0,0,0,1,1,1,1,2,3,])
a = set([1,2,3])
b = set([2,3,4])
#求并集——union方法
a.union(b)
#求并集——按位或(OR)运算符“|”
a | b
#求交集
a & b
c = a & b #c是a和b的交集
#判断c是否为a的子集——issubset方法
c.issubset(a)
#判断c是否为a的子集——运算符“<=”
c <= a
#判断c是否为a的超集——issuperset
c.issuperset(a)
#判断c是否为a的超集——运算符“>=”
c >= a
#求交集——intersection方法
a.intersection(b)
#求交集——按位与(AND)运算符“&”
a & b
#求b关于a的补集(属于a而不属于b)——difference方法
a.difference(b)
#求b关于a的补集(属于a而不属于b)——运算符“-”
a -b
#求对称差(两个集合中不共有的所有元素)——symmetric_difference方法
a.symmetric_difference(b)
#求对称差(两个集合中不共有的所有元素)——运算符“^”
a ^ b
#复制集合——copy方法
a.copy()
a.copy() is a
a
#添加元素——(原位操作)add方法
a.add(4)
a
#删除元素——(原位操作)remove方法
a.remove(4)
a
集合(set)是可变(不可作为字典的键)、可散列的,不能包含其他集合
但是有一个frozenset类型,是不可变、可散列的集合
#set不能包含其他set
a.add(b)
#但是set可以包含frozenset
a.add( frozenset(b) )
a
heap为堆,q是queue的缩写即队列
优先队列的一种
使用优先队列能够以任意顺序添加对象,并且能在任何时间找到最小的元素
python没有独立的堆类型,但是有一些堆操作的函数
nlargest函数和nsmallst函数的操作其实可以用分片和排序来完成
但是使用堆算法效率更高,又更易用
from heapq import *
#heappush函数使用
from random import shuffle
heap = [] #先创建一个空列表,供堆函数操作
data = range(10)
shuffle(data) #使按顺序排列的列表乱序(原位操作)
for n in data:
heappush(heap, n)
heap #看起来是一个普通的列表,但是它有特定的排序规则,是一个堆
#heappop函数的使用
heappop(heap)
heap #部分元素的位置进行了调整
#heapify函数的使用
data #一个普通的列表
heapify(data) #将data列表调整为堆
data #元素顺序按照堆的规则发生了改变
用于需要按照元素添加的顺序移除的情况
相关模块——collections模块,包含deque类型(通过列表等可迭代对象创建)
是一种特殊的列表,元素的弹出pop可以指定方向,而且元素可以左移或者右移,溢出的元素自动补充到另一端(相当于环形队列)
from collections import deque
q = deque([1,2,3,4,5]) #利用deque把列表转换为双端队列
q.append(6)
q.appendleft(0)
q
q.pop()
q.popleft()
q
q.rotate(3) #队列右移三步
q
q.rotate(-3) #队列左移三步
q
#extendleft方法类似,此处省略
与日期时间有关的模块
日期表示方法有三种
import time
#以字符串格式显示当前时间
time.asctime()
#以元组形式显示当前时间
time.localtime()
#如果要以元组形式显示当前的全球统一时间
time.gmtime()
#将元组形式转换为“新纪元“至今秒数
time.mktime(time.localtime())
#如果想以”新纪元“至今秒数的形式显示当前时间(和上面等价)
time.time()
#休眠若干秒
time.sleep(2)
#将时间字符串转换为元组
time.strptime('Fri Mar 6 15:09:03 2015')
此外,python还支持datetim和timeit两个时间模块
前者支持日期和时间的算法
后者帮助开发人员对代码段的执行时间进行计时
包含返回随机值的函数,用于模拟或者用于任何产生随机输出的程序
产生的是伪随机数,可以满足一般的需要,但不适合用于加密
加密可以采用强随机数,更加接近真正随机数,如os.urandom函数和random.SystemRandom类
import random
#例子:随机打牌
values = range(1,11) + "J Q K".split() #创建牌面大小列表
suits = 'diamons clubs hearts spades'.split() #创建牌面花色列表
deck = ['%s of %s' % (v, s) for v in values for s in suits] #创建牌面列表,一整副牌,除了大小王
random.shuffle(deck) #打乱这副牌
#牌数太多,假设只剩5张牌
del deck[5:]
print deck
#随机(已乱序)打牌,直到打完
while deck:
print deck.pop()
简单的文件存储方案
import shelve
#潜在的陷阱
s = shelve.open('test.dat')
s['x'] = ['a', 'b', 'c'] #给字典添加一个列表数据
s['x'].append('d') #企图给字典中的一个列表添加数据
s['x'] #失败了
#解决方法一,通过绑定到这个副本上的临时变量
temp = s['x']
temp.append('d')
s['x'] = temp #把修改了的副本赋回来
s['x']
#解决方法二,借助open函数的wrtieback参数
#开启这个参数后数据的修改是异步写入的,直到close这个对象才把修改写入磁盘
s.close() #先关闭原来的对象
s = shelve.open('test.dat', writeback = True) #打开writeback
s['x']
s['x'].append('e')
s['x']
s.close() #要记得关闭这个对象,才能把修改写入磁盘