1 模块
使用import 语句从外部导入模块信息,python提供了很大内置模块。当你导入模块时,你会发现其所在目录中,除源代码文件外,还新建了一个名为__pycache__的子目录(在较旧的Python版本中,是扩展名为.pyc 的文件)。这个目录包含处理后的文件,Python能够更高效地处理它们。以后再导入这个模块时,如果.py文件未发生变化,Python将导入处理后的文件,否则将重新生成处理后的文件。删除目录__pycache__不会有任何害处,因为必要时会自动创建它。
2 包
为组织模块,可将其编组为包(package)。包其实就是另一种模块,但它可以包含其他模块。模块存储在扩展名为 .py 的文件中,而包则是一个目录。要被Python视为包,目录必须包含文件__init__.py。如果像普通模块一样导入包,文件__init__.py的内容就将是包的内容。
如:包com.xxx.package_name下包含了person.py、bird.py等,并且包含了__init__.py,__init__.py中的内容为:import person import bird,辣么要在其他py文件中使用该包的所有内容,只需使用from com.xxx.package_name import * 即可。
3 获取模块信息
3.1 获取模块包含的信息
3.1.1 dir
要查明模块包含哪些东西,可以使用函数dir,它列出对象的所有属性(对于模块,它列出所有的函数、类、变量等)。如:dir(copy)
3.1.2 获取模块位置
使用模块的特性__file__获取模块的绝对地址。
4 常用模块
本小结只列举了一些常用模块的一些常用功能,如果小伙伴们想知道完整的模块方法,请参考自己Python安装后的目录中的module Docs,如下图:
4.1 sys
模块sys让你能够访问与Python解释器紧密相关的变量和函数。
- 变量 sys.argv 包含传递给Python解释器的参数,其中包括脚本名。
- 函数 sys.exit 退出当前程序。
- 映射 sys.modules 将模块名映射到模块(仅限于当前已导入的模块)。
- 变量 sys.path 一个列表,包含要在其中查找模块的目录的名称。
- 变量 sys.platform 一个字符串,返回运行解释器的“平台”名。这可能是表示操作系统的名称(如win32),也可能是表示其他平台类型(如java虚拟机)。
4.2 os
模块os能够让你访问多个操作系统服务。
- 映射 os.envirom 包含本地系统的环境变量。
- 函数 os.system(command) 用于在子shell中执行操作系统命令。
- 变量 os.sep 用于路径名中的分隔符。如在windos中,文件路径使用 \\ 。UNIX系统中,文件路径使用 / 等。
- 变量 os.pathsep 用于组合多条路径,就像操作系统中的环境变量一样。pathsep用于分隔不同的路径名:如在window中为 ; ,为在UNIX中为 : 。
- 变量 os.linesep 用于文本中的行分隔符('\n' , '\r' 或 '\r\n')
- 函数 os.urandom(n) 使用随系统而异的强加密随机数据。
4.3 fileinput
模块fileinput让你能够对文件进行操作。
- 函数 fileinput.input([fies[, inplace[, backup]]]) 帮助迭代多个输入流中的行,返回一个可以在for循环中进行迭代的对象。参数inplace=True时,可以对文件进行处理操作。参数backup用于给原始文件创建的备份文件指定扩展名。
- 函数 fileinput.filename() 返回当前文件的名称。
- 函数 fileinput.lineno() 返回(累计的)当前行号。
- 函数 fileinput.filelineno() 返回在当前文件的行号。
- 函数 fileinput.isfirstline() 检查当前行是否是文件中的第一行。
- 函数 fileinput.isstdin() 检查最后一行是否来自 sys.stdin。
- 函数 fileinput.nextfile() 关闭当前文件并移到下一个文件。
- 函数 fileinput.close() 关闭整个文件链并结束迭代。
4.4 集合、堆和双端队列
4.4.1 集合
很久以前集合是由模块sets中的Set类实现的。虽然在既有代码中可能遇到Set实例,但除非要像后兼容,否则没必要使用它。在较新的版本中,集合是由内置类set实现的,无需导入模块sets。如:set1 = set(rang(10))。
注意:集合是可变的,因此不能用作字典中的键。但是frozenset集合类型是不可变的,能够用于键。
4.4.2 堆
堆,是一种优先队列,能够以任意顺序添加对象,并随时找出(并删除)最小的元素。相比于列表的方法min,效率高很多。
实际上,Python没有独立的堆类型,而只有一个包含一些堆操作的模块。这个模块名为heapq(其中q表示队列),它包含6个函数(如下列所示),前4个与堆操作直接相关。必须使用列表来表示堆对象本身。
函数 描述
heappush(heap, x) 将x压入堆中
heappop(heap) 从堆中弹出最小的元素
heapify(heap) 让列表具备推特征
heapraplace(heap, x) 弹出最小元素,并将x压入堆中
nlargest(n, iter) 返回iter中n个最大的元素
nsmallest(n, iter) 返回iter中n个最小的元素
堆特征:位置 i 出的元素总是大于位置 i // 2 处的元素( 反过来说就是小于位置 i * 2 和 i * 2 + 1处的元素 )。
函数heappop弹出最小的元素总是位于索引0处,并确保剩余元素中最小的那个位于索引0处(保持堆特征)。
4.4.3 双端队列
在需要按添加元素的顺序进行删除时,双端队列很有用。模块collections中,包含类型deque已经其他几个集合(collection)类型。
与集合(set)一样,双端队列也是可迭代对象创建的,它包含很多有用的方法。
from collections import deque
q = deque(range(10)) #创建双端队列
q.append(11) #在队列末尾添加
q.appendleft(12) #在队列left上添加
q.appendright(13) #在队列right上添加
q.popleft() #获取并删除left顶端的元素
q.popright() #获取并删除right顶端的元素
q.rotate(-1) #逆时针旋转1位
q.rotate(1) #顺时针旋转1位
4.5 time
模块time包含用于获取当前时间、操作时间和日期、从字符串中读取日期、将日期格式化为字符串的函数。日期可表示为实数(从‘新纪元’1月1日0时起过去的秒数。不同平台新纪元可能不同。),也可表示为包含9个整数的元祖。如元祖(2019, 3, 18, 12, 12, 45, 0, 76, 0)表示2019年3月18号12时12分45秒 星期一 2019年的第76天(不考虑夏令时)。
上述元祖这些都表示年、月(1~12)、日(1~31)、时(0~23)、分(0~59)、秒(0~61)、星期(0~6)、一年的第多少天、夏令时(0,1或 -1)。
模块time中一些常用的函数如下:
- 函数 time.asctime([tuple]) 将当前时间(时间元祖)转换为字符串。
- 函数 time.localtime([secs]) 将秒数转换为表示当地时间的日期元祖。
- 函数 time.gmtime([secs]) 将秒数转换为国际标准时间。
- 函数 time.mktime(tuple) 将时间元祖转换为当地时间。
- 函数 time.sleep(secs) 休眠secs秒。
- 函数 time.strptime(string[, format]) 将字符串转为时间元祖,并能进行格式化。
- 函数 time.time() 当前的国际标准时间,以从新纪元开始的秒数表示。
4.6 random
模块random包含生成伪随机数的函数。为啥叫伪随机数呢?是因为这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果你想真正的随机,应考虑使用前面os模块中的函数urandom。模块random中的SystemRandom类基于的功能与urandom类似,可提供接近于真正随机的数据。
模块random中一些常用函数如下:
- 函数 random.random() 返回一个 0~1(含)的随机实数。
- 函数 random.getrandbits(n) 以长整数方式返回 n 个随机的二进制位(长整数表示为二进制后,位数等于n)。
- 函数 random.uniform(a, b) 返回一个 a~b (含)的随机(均匀分布)实数。
- 函数 random.choice(seq) 从序列seq中随机的选择一个元素。
- 函数 random.randrange([start], stop, [step]) 从rang(start, stop, step)中随机的选择一个数。step表示步长。
- 函数 random.shuffle(seq[, random]) 就地打乱可变序列seq,并确保每种可能的排序顺序出现的概率相同。
- 函数 random.sample(seq, n) 从序列seq中随机的选择 n 个序列值不同的元素。
4.7 shelve
在实际工作中,如果只需要简单的对文件存取,可以使用模块shelve。对于模块shelve,最重要的函数就是open(filename, flag, protocol, writeback)。返回一个Shelf对象,供你用来存储数据。
使用shelve,如果想保证从Shelf对象读取或赋值的所有数据结构都将保存到内存(缓存)中,并等到你关闭Shelf对象时才将它们写入磁盘,可以将writeback参数设置为True。在这种情况下,你必须保证在处理完毕后将Shelf对象关闭。
参数:flag 默认为‘c’,如果数据文件不存在,就创建,允许读写;可以是: ‘r’: 只读;’w’: 可读写; ‘n’: 每次调用open()都重新创建一个空的文件,可读写。
4.8 re
模块re为正则表达式。关于正则表达式的概率大家可以自行去了解一下,只能说,这个东西很强大,并且高大上。
4.8.1 通配符
句点( . )表示通配符,只能匹配一个字符。
4.8.2 对特殊字符进行转义
使用两个反斜杠( \\ )对特殊字符进行转义。
4.8.3 字符集
使用 [str] 或 [^str] 来表示字符集匹配,前者表示匹配字符集中的字符,后者表示匹配除字符集中的字符。
4.8.4 二选一和子模式
使用管道字符( | ) 表示二选一,如'python|java'。子模式,使用圆括号()。如'(python|java)',注意,当个字符也可称为子模式。
4.8.5 可选模式和重复模式
通过在子模式后面加上问好( ? ),可将其指定为可选的,即可包含可不包含,如'(java)?(python)?'。
重复模式,(pattern)*:pattern可重复 0/1/n 次;(pattern)+:pattern可重复 1/n 次;(pattern){m, n}:pattern可重复 m~n 次。
4.8.6 字符串的开头和末尾
指定字符串开头使用脱字符( ^ ),如'^a'。指定字符串结尾使用美元符号( $ ),如'a$'。
4.8.7 模块re中一些常用函数
函数 描述
compile(pattern[, flags]) 根据包含正则表达式的字符串创建模式对象,能提高匹配效率
search(pattern, string[, flags]) 在字符串中查找模式,如果存在,返回MatchObject对象,不存在返回None
match(pattern, string[, flags]) 在字符串开头匹配模式,如果存在,返回MatchObject对象,不存在返回None
split(pattern, string[, maxsplit=0]) 根据模式来分隔字符串,maxsplit表示最多分隔多少次
findall(pattern, string) 返回一个列表,其中包含字符串中所有与模式匹配的子串
sub(pat, replace, string[, count=0]) 将字符串中与模式pat匹配的子串都替换为replace
escape(string) 对字符串中所有的正则表达式特殊字符都进行转义
re.escape是一个工具函数,用于对字符串中所有可能被视为正则表达式运算符的字符进行转义。使用这个函数的情况有:字符串很长,其中包含大量特殊字符,而你不想输入大量的反斜杠进行转义;你从用户那里获取了一个字符串,想将其用于正则表达式中。
4.8.8 匹配对象和编组
在模块re中,查找与模式匹配的子串的函数都在找到时返回MatchObject对象。这些对象包含于模式匹配的子串的信息,还包含模式的哪部分与子串的哪部分匹配的信息。这些子串部分称为编组(group)。
编组就是放在圆括号内的子模式,他们是根据左边的括号数编号的,其中 0 编组指的是整个模式。如下面模式中:
'There (a (aa) cc (dd))'
包含如下编组:
0 There a aa cc dd
1 a aa cc dd
2 aa
3 dd
通常,编组包含诸如通配符和重复运算符等特殊字符,因此你可能想知道与给定编组匹配的内容。如模式:
r'www\.(.+)\.com$'
编组 0 包含整个字符串,而编组1包含www. 和 .com之间的内容。
re中匹配对象的重要方法有:
group([group1,...]):获取与给定模式(编组)匹配的子串。
start([group]):返回与给定编组匹配的子串的起始位置。
end([group]):返回与给定编组匹配的子串的终止位置。(与切片一样,不包含终止位置)
span([group]):返回与给定编组匹配的子串的起始和终止位置。
注意:出了整个模式(编组0)外,最多还可以有99个编组,编号为1~99.
在实际开发中,正则表达式时很难理解的,我们可以调用模块re中的函数是使用标志VERBOSE。这样能够让你在模式中添加空白(空白、制表符、换行符等)。如下
pattern1 = re.compile(r'''
...\* #其实标志
...( #...
''', re.VERBOSE)
这里列举了一些比较常用的模块,还有很多有趣的模块,比如datetime、cmd、logging等,如果想了解更多,可以自行去查看API文档。