Python标准库
模块
现在已经知道了通过
import从外部模块获取函数:
比如
import math
那么如何编写自己的模块呢
模块是程序
任何Python程序都可以作为模块导入
假设在/root目录下编写hello.py,内容为:
# hello.py print 'Hello'
进入python解释器:
>>> import sys >>> sys.path.append('/root') >>> import hello Hello
在导入模块后,会有新文件出现:
-rw-r--r-- 1 root root 24 Jul 16 17:29 hello.py -rw-r--r-- 1 root root 110 Jul 16 17:30 hello.pyc
这个以
.pyc为扩展名的文件是经过编译的,如果再次导入同一个模块,Python会导入
.pyc文件而不是
.py文件。
导入模块主要用于定义,比如导入变量、函数和类。只需要定义这些东西一次,因此多次导入和导入一次的效果一样。
模块用于定义
1.在模块中定义函数
#hello2.py def hello(): print "Hello2"
运行:
>>> import hello2 >>> hello2.hello() Hello2
2.在模块中增加测试代码
如果想要确保hello函数正常工作,可能会将hello2重写为新的模块(还是叫hello2):
#hello2.py def hello(): print "Hello2"#test hello()
运行:
>>> import hello2 Hello2 >>> hello2.hello() Hello2
这可能不是想要的结果。我们得区分模块作为程序运行还是导入其他程序。为了实现这一点,需要使用
__name__变量:
>>> __name__ '__main__' >>> hello2.__name__ 'hello2'
在主程序(包括解释器的交互提示符中),变量
__name__是
__main__而在导入的模块中,就是模块的名字。因此,我这样修改hello2:
#hello2.py def hello(): print "Hello2"#test def test(): hello() if __name__ == '__main__': test()
运行:
[root@instance-54lh4cfv ~]# python hello2.py Hello2 [root@instance-54lh4cfv ~]# python Python 2.7.5 (default, Apr 9 2019, 14:30:50) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import hello2 >>> hello
如果作为程序运行,
hello函数会执行。而作为模块导入时,就不会执行。
让你的模块可用
前面的例子中,通过修改
sys.path来告知解释器去哪里查找模块。正常情况你不会每次都想这么做,那么有两种方法可以做到这一点:
将模块放到合适的位置;告诉解释器去哪里查找需要的模块。
1.将模块放在正确位置:
>>> import sys,pprint >>> pprint.pprint(sys.path) #提供更加智能的打印输出 ['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib64/python2.7/site-packages/gtk-2.0', '/usr/lib/python2.7/site-packages']
解释器可以从这些路径中查找模块,其中
site-packages目录是最佳选择。将hello2.py放入该目录即可。
2.告诉编译器去哪里找
如果我们想将模块放在其他地方时可以采用这种方案。
通常是在
PYTHONPATH环境变量中包含模块所在的目录。
3.命名模块
包含模块代码的文件的名称要和模块名一样。
包
为了更好的组织模块,可以将它们分组为包。包就是另一类模块,它们能包含其他模块。其实就是模块的目录。
为了让python将其作为包对待,必须包含一个命名为
__init__py的文件。
例如有个名为
drawing的包,其中包含名为
shapes和
colors的模块。
引用代码:
import drawing # 此时drawing中__init__模块的内容是可用的 import drawing.colors #此时colors模块是可用的,但是只能通过全名drawing.colors来使用 from drawing import shapes#此时shapes模块可用,可以仅使用shapes来使用
标准库
标准库会随着Python解释器,一起安装在你的电脑中的。它是Python的一个组成部分。这些标准库是Python为你准备好的利器,可以让编程事半功倍。
下面介绍一些常见的标准库
sys
能通过该模块访问与python解释器关联紧密的变量和函数:
函数/变量 | 描述 |
---|---|
argv | 命令行参数,包括脚本名称 |
exit([arg]) | 退出当前程序 |
modules | 映射模块名字到载入模块的字典 |
path | 查找模块所在目录的目录名列表 |
platform | 平台标识符 |
stdin | 标准输入流 |
stdout | 标准输出流 |
stderr | 标准错误流 |
我们实现一个范旭打印命令行参数的脚本:
import sys args = sys.argv[1:] #argv[0] is the file name args.reverse() print ' '.join(args)
执行并加入一些参数:
[root@root~]# python reverseargs.py this is a test test a is this
os
提供了访问多个操作系统服务的功能。
函数/变量 | 描述 |
---|---|
environ | 对环境变量进行映射 |
system(command) | 在子shell中执行操作系统命令 |
sep | 路径中的分隔符 |
pathsep | 分隔路径的分隔符 |
linesep | 行分隔符 |
urandom(n) | 返回n字节的加密强随机数据 |
fileinput
该模块能让你轻松地遍历文件的所有行。
函数 | 描述 |
---|---|
input([files[,inplace[,backup]] | 遍历多个输入流中的行 |
filename() | 返回当前文件的名称 |
lineno() | 返回当前累计的行数 |
close() | 关闭文件链 |
通过一个为代码编号的脚本来演示这个模块的使用:
import fileinput for line in fileinput.input(inplace=True): # True原地处理,即直接修改原文件 line = line.rstrip()#去除行尾空白符 num = fileinput.lineno()#得到行号 print '%-40s # %2i' % (line,num) #重写格式 内容 + #行号
如果你运行:
python numberlines.py numberlines.py
import fileinput # 1 for line in fileinput.input(inplace=True): # 2 line = line.rstrip() # 3 num = fileinput.lineno() # 4 print '%-40s # %2i' % (line,num) # 5 # 6
上面脚本中的中文注释是我后来加的。
谨慎的将inplace设为True,因为它很容易破坏文件。
堆和双端队列
堆
它是优先队列的一种。python中没有独立的堆类型,只有一个包含一些堆操作函数的模块——
heapq,包含6个函数:
函数 | 描述 |
---|---|
heappush(heap,x) | x入堆 |
heappop(heap) | 将堆中最小的元素弹出(原来这是一小顶堆) |
heapify(heap) | 通过列表构建堆 |
heapreplace(heap,x) | 将堆中最小元素弹出,同时将x入堆 |
nlargest(n,iter) | 返回iter中第n大的元素 |
nsmallest(n,iter) | 返回iter中第n小的元素 |
前4个直接和堆操作相关,必须将列表作为堆对象本身(可以通过数组来实现堆,这里可以理解为是通过列表来实现的)。
>>> from heapq import * >>> from random import shuffle >>> data = range(10) >>> shuffle(data) >>> data [9, 8, 1, 0, 3, 4, 7, 6, 5, 2] >>> heapify(data) #可以直接通过列表构建堆 >>> data [0, 2, 1, 5, 3, 4, 7, 6, 8, 9] >>> heappush(data,0.5) #将0.5如堆 >>> data [0, 0.5, 1, 5, 2, 4, 7, 6, 8, 9, 3] >>> heappop(data) #弹出三个最小元素 0 >>> heappop(data) 0.5 >>> heappop(data) 1
关于堆的性质可参考Java二叉堆,虽然是用Java语言描述的,但是应该也不妨碍理解。
双端队列
双端队列(deque)也可通过可迭代对象创建:
>>> from collections import deque >>> q = deque(range(5)) >>> q deque([0, 1, 2, 3, 4]) >>> q.append(5) >>> q.appendleft(6) >>> q deque([6, 0, 1, 2, 3, 4, 5]) >>> q.pop() 5 >>> q.popleft() 6 >>> q.rotate(3) >>> q deque([2, 3, 4, 0, 1]) >>> q.rotate(-1) >>> q deque([3, 4, 0, 1, 2])
所谓双端是指可以在两端新增和删除元素。
rotate(n = 1)是将它们左移或右移,使头尾相连,当n是正数时,表示从左往右循环移n位,当n是负数时,表示从右往左循环移n位,比如deq.rotate(1)相当于deq.appendleft(deq.pop())
time
该模块可以获取当前时间、操作时间和日期、从字符串读取时间以及格式化时间为字符串。
很多Python函数用一个元组装起来的9组数字处理时间:
>>> import time >>> localtime = time.localtime(time.time()) >>> print "本地时间为 :", localtime 本地时间为 : time.struct_time(tm_year=2019, tm_mon=7, tm_mday=17, tm_hour=17, tm_min=43, tm_sec=34, tm_wday=2, tm_yday=198, tm_isdst=0) >>> localtime = time.asctime( time.localtime(time.time()) ) >>> localtime 'Wed Jul 17 17:44:13 2019'
random
包括返回随机数的函数
函数 | 描述 |
---|---|
random() | 返回0<n<=1之间的随机实数n |
uniform(a,b) | 返回随机数n,其中a<=n<b |
randrange([start],stop,[step]) | 返回range(start,stop,step)中的随机数 |
choice(seq) | 从序列seq中返回随机元素 |
shuffle(seq[,random]) | 原地对序列seq进行洗牌(打乱)操作 |
- 点赞
- 收藏
- 分享
- 文章举报
- Python 标准库 —— urllib
- Python 标准库 csv —— csv 文件的读写
- Python标准库13 循环器 (itertools)
- Python标准库---子进程 (subprocess包)
- Python标准库:内置函数isinstance(object, classinfo)
- Python标准库(非常经典的各种模块介绍)
- python标准库介绍——8 operator 模块详解
- python标准库学习4-time
- python 标准库
- Python标准库之functools,itertools,operator
- [Python]标准库--inspect
- Python 标准库 —— os 模块
- Python标准库之随机数 (math包、random包)介绍
- Python标准库的主要功能
- Python标准库:内置函数classmethod(function)
- [Python标准库]contextlib——上下文管理器工具
- Python标准库——走马观花
- Python标准库:内置函数slice(stop) slice(start, stop[, step])
- 11、python标准库概览
- 第十四章 python标准库