第14章 Python标准库
Python标准库是随py附带安装的, 熟悉py库能帮助你快速解决问题;
在安装的py文档中Library Reference' section, 可以找到标准库的所有模块的完整细节;
sys模块
sys模块包含系统特定的功能, sys.argv列表包含命令行参数;
1
2
3
4
5
6
|
$ python3
>>> import sys
>>> sys.version_info
sys.version_info(major = 3 , minor = 3 , micro = 0 , releaselevel = 'final' , serial = 0 )
>>> sys.version_info.major > = 3
True
|
>sys模块提供version_info元组表示版本信息; major主版本号; [version则是将所有版本内容打印出来]
1
2
3
4
5
6
|
import sys, warnings
if sys.version_info.major < 3 :
warnings.warn( "程序需要在 Python 3.0 以上版本上运行" ,
RuntimeWarning)
else :
print ( '按正常情况处理' )
|
>warnings模块用来向用户显示警告;
e.g.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
import sys
def readfile(filename):
'''Print a file to the standard output.'''
try :
f = open (filename)
except FileNotFoundError as e:
print ( "file is not exist" )
return
else :
while True :
line = f.readline()
if len (line) = = 0 :
break
print ( line, end = "") # notice comma
f.close()
# Script starts from here
if len (sys.argv) < 2 :
print ( 'No action specified.' )
sys.exit()
if sys.argv[ 1 ].startswith( '--' ):
option = sys.argv[ 1 ][ 2 :]
# fetch sys.argv[1] but without the first two characters
if option = = 'version' :
print ( 'Version 1.2' )
elif option = = 'help' :
print ( '''\
This program print (s files to the standard output.
Any number of files can be specified.
Options include:
--version : Print (s the version number
--help : Display this help''' )
else :
print ( 'Unknown option.' )
sys.exit()
else :
for filename in sys.argv[ 1 :]:
readfile(filename)
|
>模仿Linux的cat(concatenate)命令, 打印文本文件内容(可以将多个文件级连在一起打印);
在py程序运行的时候, sys.argv列表只有一个项目--运行的程序的名称, 作为sys.argv[0], 其他命令行参数在这个项目之后;
>使用第1个参数来检验程序是否指定了选项: --version, --help; sys.exit将退出在运行的程序; 指定文件名则逐行打印内容;
其他
标准输入, 输出, 错误流: sys.stdin, sys.stdout, sys.stderr;
os模块
包含常用的操作系统功能, 如果你希望程序能跨平台的话, 这个模块是重要的; 它可以让程序在编写后, 不用修改就可以在Linux和Windows下运行; os.sep可以取代操作系统特定的路径分隔符;
os.name: Windows-'nt' Linux-'posix';
os.getcwd(): 得到当前工作目录;
os.getenv()和os.putenv(): 读取和设置环境变量;
os.listdir(): 返回指定目录下的所有文件和目录名;
os.remove(): 删除指定文件; os.remove('filename')
os.system(): 运行shell命令; os.system('mkdir newFolder')
os.linesep: 给出当前平台使用的行终止符: Windows使用 '\r\n' Linux使用'\n' Mac使用'\r' ;
os.path.split(): 返回路径的目录名和文件名;
1
2
|
>>> os.path.split( "C:\TSLOG" )
( 'C:\\', ' TSLOG')
|
os.path.isfile()和os.path.isdir(): 检验给定的路径是文件还是目录; os.path.exists()检验是否存在; [Windows下分隔符要使用 \\]
Note 利用python标准文档和help()来学习更多库函数和变量的详细知识;
logging 日志模块
如果想把调试信息或重要信息存储在某个地方, 用来检查程序是否正常运行, 可以使用logging模块实现;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import os, platform, logging
if platform.platform().startswith( 'Windows' ):
logging_file = os.path.join(os.getenv( 'HOMEDRIVE' ), os.getenv( 'HOMEPATH' ), 'test.log' )
else :
logging_file = os.path.join(os.getenv( 'HOME' ), 'test.log' )
print ( "记录到" , logging_file)
logging.basicConfig(
level = logging.DEBUG,
format = '%(asctime)s : %(levelname)s : %(message)s' ,
filename = logging_file,
filemode = 'w' ,
)
logging.debug( "程序开始" )
logging.info( "做些事情" )
logging.warning( "现在结束" )
|
test.log的内容:
2013-11-03 03:55:26,075 : DEBUG : 程序开始
2013-11-03 03:55:26,075 : INFO : 做些事情
2013-11-03 03:55:26,076 : WARNING : 现在结束
>os操作系统模块-与系统交互, platform平台模块-平台信息, logging日志模块-记录信息;
>根据platform.platform()返回当前系统信息, 得到主盘, 目录, 使用os.path.join()将文件名和他们组装起来得到完整路径, 使用join代替字符串连接以确保路径格式与操作系统期望的匹配(分隔符等);
>配置logging模块, 设置了调试, 信息, 警告, 三条不同的信息;
Week 周系列
标准库中有很多需要学习: debugging(调试),handling command line options(处理命令行选项),regular expressions(正则表达式)...
进一步探索的方法是阅读Doug Hellmann的系列文档: Python Module of the Week 或py文档 http://docs.python.org/py3k/;
第15章 更多Py内容
其他方面的python知识;
特殊的方法
特殊的方法用于模拟内置类型的某些行为, 如果想要对类使用x[key]索引操作(就像列表和元组), 那么就要实现__getitem__()方法; 其实这就是python为list类本身所做的;
<refer to> http://docs.python.org/3/reference/datamodel.html#specialnames
__init__(self, ...) 在新创建对象返回之前被调用;
__del__(self) 在对象被销毁前调用;
__str__(self) 在使用print函数或str()函数时调用;
__It__(self, other) 使用<操作符的时候调用, 所有的操作符 + > 等都有特别的方法;
__getitem__(self,key) 当使用x[key]索引操作时调用;
__len__(self) 当序列对象的内建len()函数使用时调用;
单语句块
每个块语句以自己的缩进级别与其他部分区分开; 但如果语句块只包含一句语句, 可以在条件语句或循环语句的同一行指明;
1
2
3
4
|
>>> flag = True
>>> if flag: print 'Yes'
...
Yes
|
Note 单语句块可以让代码行较少, 但是除了错误检查之外不建议这种简化; 因为使用适当缩进有利于代码改动;
在使用交互模式的py解释器时, 它会通过恰当地改变提示符来帮助用户输入语句; 上例中解释器会把提示符改变为...以表示语句未结束; 用户要输入回车来确认语句已经完整; 然后py完成语句执行, 返回提示符等待下个指令;
Lambda表达式
lambda语句是用来创建新的函数对象; 本质上lambda取得一个参数, 后面跟函数主体的表达式, 而表达式的值由新函数返回;
1
2
3
|
points = [ { 'x' : 2 , 'y' : 3 }, { 'x' : 4 , 'y' : 1 } ]
points.sort(key = lambda i : i[ 'y' ])
print (points)
|
输出: [{'x': 4, 'y': 1}, {'x': 2, 'y': 3}]
>list的sort方法可以取一个key, 用于确定列表如何排序(升序或降序); 例子中做了自定义排序, 使用lambda表达式创建新的函数, 而不是为只在这一个地方使用的函数写一个单独的def块;
e.g. 运行时返回新的函数对象;
1
2
3
4
5
6
|
def make_repeater(n):
return lambda s: s * n
twice = make_repeater( 2 )
print (twice( 'word' ))
print (twice( 5 ))
|
>make_repeater在运行时创建新的函数对象; lambda语句用来创建函数对象; lambda需要一个参数, 后面跟单个表达式作为函数体, 表达式的值被这个新建的函数返回;
Note 即使是print语句也不能用在lambda形式中, 只能使用表达式;
列表解析
列表解析用于从现有的列表派生一个新列表;
e.g. 假设有一个数字列表, 想取得一个相应列表: 只有当数字本身大于2时所有的数字乘以2;
1
2
3
|
listone = [ 2 , 3 , 4 ]
listtwo = [ 2 * i for i in listone if i > 2 ]
print (listtwo)
|
>为满足条件(if i > 2)的数指定一个操作(2*i), 导出一个新列表; 原来的列表没有发生变化; 大多时候, 都是使用循环来处理列表中的每一个元素, 列表解析可以用更加精确, 简洁, 清晰的方法完成工作;
在函数中接受元组和字典
函数中有一种特殊的方式接受参数--分别使用*和**前缀表示元组或字典; 这种方法在函数需要获取可变数量的参数的时候很有用;
1
2
3
4
5
6
|
def powersum(power, * args):
'''Return the sum of each argument raised to specified power.'''
total = 0
for i in args:
total + = pow (i, power)
return total
|
使用:
1
2
|
>>> powersum( 2 , 3 , 4 ) # 25
>>> powersum( 2 , 10 ) # 100
|
>在args变量前有*前缀, 所有其他的函数参数都会作为一个元组存储在args中, 如果使用的是**前缀, 其他的参数会被认为是一个字典的键/值对;
exec和eval
exec用来执行存储在字符串或文件中的py语句;
e.g. 在运行中生成一个包含py代码的字符串, 使用exec语句执行语句/命令;
1
|
>>> exec ( 'print("Hello")' ) # Hello 注意单引号和双引号
|
eval语句用来计算存储在字符串中的有效py表达式;
1
|
>>> eval ( '2*3' ) # 6
|
assert断言
assert语句用来声明某个条件是真;
e.g. 确定列表中至少有一个元素, 当条件为非真的时候会引发一个错误; assert失败的时候会引发一个AssertionError;
1
2
3
4
5
|
mylist = [ '条款' ]
assert len (mylist) > = 1
print (mylist.pop()) # 条款
print (mylist) # []
assert len (mylist) > = 1 # AssertionError
|
>assert语句应该谨慎使用; 大多数时候它能很好地捕捉异常, 用来处理问题或向用户显示错误信息, 然后退出;
repr函数
repr函数用来取得对象的规范字符串表示; 反引号/转换符可以完成相同的功能;
Note eval(repr(object)) == object
1
2
3
4
|
>>> i = []
>>> i.append( 'item' )
>>> `i` # "['item']" #only for py2
>>> repr (i) # "['item']"
|
[反引号``只有在py2中可用, py3中必须使用repr()]
>基本上repr函数用来获取对象的可打印的表达形式; 可以通过定义类的__repr__方法来控制对象在被repr函数调用时返回的内容;
转义字符
假设想要一个包含单引号 ' 的字符串, 该如何指定字符串? 例如字符串是What's ur name? 不能指定为'What's ur name?' 因为py会对在哪里开始和结束字符串感到困惑[单引号有3个]; 所以必须指定这个单引号不表示字符串的末尾; 在转义字符的帮助下可以实现: 使用转义符/反斜线: \' -- 'What\'s ur name?'
指定特定字符串的另一种方式是使用双引号: "What's ur name?" ; 同样的, 在一个双引号的字符串中必须为双引号使用转义字符; 另外, 对反斜杠本身要使用转义字符 \\ ;
指定一个两行字符串的做法 1)使用三重引号 ''' ; 2)使用新行转义字符 \n ; 还有一个制表符 \t 等等;
Note 在字符串中, 一行结束处的反斜杠表明字符串在下一行仍旧继续, 没有换行;
1
2
3
|
>>> "这是第 1 个句子。\
这是第 2 个句子。"
'这是第1个句子。这是第2个句子。'
|
原始字符串
如果需要指定没有经过像转义字符一样进行处理的字符串, 需要通过对字符串加前缀r或R来指定原始字符串; e.g. print(r"\n表明新行"), 输出原始字符, 不会换行;
Note To正则表达式: 处理正则表达式的时候要使用原始字符, 否则需要大量的转义字符--反斜杠; e.g. 反向引用: '\\1' 或 r'\1' ;
练习: 创建命令行地址簿程序, 可以添加 删除 搜索联系人信息;
tip: 创建个人类, 使用字典存储每个人的对象, 以名字为key; 使用pickle模块把对象存储在硬盘上;
<refer to>
Code: Python Cookbook Python Module of the Week
Q&A Official Python Dos and Don'ts(Python官方的注意事项) Official Python FAQ(Python官方的问题解答) Norvig's list of Infrequently Asked Questions(不太问到的问题) Python Interview Q & A(Python问题解答访谈)
Learn more: Awaretek's comprehensive list of Python tutorials(Awaretek的Python学习指南的综合列表)
Video: PyVideo News http://planet.python.org
Discussion: python-tutor list(Python辅导列表)
Library pip http://pypi.python.org/pypi
第16章 图形软件
如果想要使用python创建图形程序, 可以通过使用图形用户接口GUI库与python绑定; 绑定后可以用py编写程序和使用C/C++或其他语言的库;
-Kivy 一款跨平台UI框架 http://kivy.org
-PyGTK 绑定GTK+工具包(GNOME) Glade设计器; GTK+在Linux上工作得很好, 但是对Windows支持不完整; http://www.pygtk.org/tutorial.html
-PyQt 绑定Qt工具包(KDE) 文档强大, Qt设计器简易; 教程 http://zetcode.com/gui/pyqt4/ 书籍 http://www.qtrac.eu/pyqtbook.html
-wxPython 绑定wxWidgets工具包; 构建器 http://wxglade.sourceforge.net/; 教程 http://zetcode.com/wxpython/
<refer to> https://wiki.python.org/moin/GuiProgramming
概况
眼下没有单一标准的python GUI工具; 根据情况选择一个, 首先考虑的因素是是否愿意为GUI工具付费; 其次是是否要跨平台; 第三是Linux下的KDE还是GNOME;
更多内容
一个编程语通常有两部分: 语言和软件; 语言是你怎样写, 软件是程序运行什么;
通常py是用CPython来运行程序的, 因为它是C语言编写的, Classic的py解释器;
其他软件来运行python:
Jython IronPython PyPy Stackless Python CLPython IronMonkey
函数程序设计
-
Functional Programming Howto by A.M. Kuchling(A.M. Kuchling编写的如何进行函数编程)
-
Functional programming chapter in 'Dive Into Python' book('Dive Into Python' 书中函数编程一章)
-
Functional Programming with Python presentation(使用Python描述的函数编程)
<refer to> http://woodpecker.org.cn/abyteofpython_cn/chinese/
FLOSS Free/Libre and Open Source Software
Other
Python shell 快捷键
F1: 参考手册/帮助文档; Alt-p/Alt-n: 上一条/下一条历史命令;
彩蛋
import this; python : 设计原则; from __future__ import braces : 大括号去死;
在命令行到pydoc所在的目录python的安装目录lib下运行python pydoc.py -p 8877 (随便能用的端口) 然后用浏览器输入http://127.0.0.1:8877/ --~~
---End---YC