简明Python教程 14)标准库 15)更多内容 16)GUI
来源:互联网 发布:java下载不了 编辑:程序博客网 时间:2024/05/16 16:14
第14章 Python标准库
Python标准库是随py附带安装的, 熟悉py库能帮助你快速解决问题;
在安装的py文档中Library Reference' section, 可以找到标准库的所有模块的完整细节;
sys模块
sys模块包含系统特定的功能, sys.argv列表包含命令行参数;
$ 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则是将所有版本内容打印出来]
import
sys, warnings
if
sys.version_info.major <
3
:
warnings.warn(
"程序需要在 Python 3.0 以上版本上运行"
,
RuntimeWarning)
else
:
print
(
'按正常情况处理'
)
>warnings模块用来向用户显示警告;
e.g.
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(): 返回路径的目录名和文件名;
>>> os.path.split(
"C:\TSLOG"
)
(
'C:\\', '
TSLOG')
os.path.isfile()和os.path.isdir(): 检验给定的路径是文件还是目录; os.path.exists()检验是否存在; [Windows下分隔符要使用 \\]
Note 利用python标准文档和help()来学习更多库函数和变量的详细知识;
logging 日志模块
如果想把调试信息或重要信息存储在某个地方, 用来检查程序是否正常运行, 可以使用logging模块实现;
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()函数使用时调用;
单语句块
每个块语句以自己的缩进级别与其他部分区分开; 但如果语句块只包含一句语句, 可以在条件语句或循环语句的同一行指明;
>>> flag
=
True
>>>
if
flag:
print
'Yes'
...
Yes
Note 单语句块可以让代码行较少, 但是除了错误检查之外不建议这种简化; 因为使用适当缩进有利于代码改动;
在使用交互模式的py解释器时, 它会通过恰当地改变提示符来帮助用户输入语句; 上例中解释器会把提示符改变为...以表示语句未结束; 用户要输入回车来确认语句已经完整; 然后py完成语句执行, 返回提示符等待下个指令;
Lambda表达式
lambda语句是用来创建新的函数对象; 本质上lambda取得一个参数, 后面跟函数主体的表达式, 而表达式的值由新函数返回;
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. 运行时返回新的函数对象;
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;
listone
=
[
2
,
3
,
4
]
listtwo
=
[
2
*
i
for
i
in
listone
if
i >
2
]
print
(listtwo)
>为满足条件(if i > 2)的数指定一个操作(2*i), 导出一个新列表; 原来的列表没有发生变化; 大多时候, 都是使用循环来处理列表中的每一个元素, 列表解析可以用更加精确, 简洁, 清晰的方法完成工作;
在函数中接受元组和字典
函数中有一种特殊的方式接受参数--分别使用*和**前缀表示元组或字典; 这种方法在函数需要获取可变数量的参数的时候很有用;
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
使用:
>>> powersum(
2
,
3
,
4
)
# 25
>>> powersum(
2
,
10
)
# 100
>在args变量前有*前缀, 所有其他的函数参数都会作为一个元组存储在args中, 如果使用的是**前缀, 其他的参数会被认为是一个字典的键/值对;
exec和eval
exec用来执行存储在字符串或文件中的py语句;
e.g. 在运行中生成一个包含py代码的字符串, 使用exec语句执行语句/命令;
>>>
exec
(
'print("Hello")'
)
# Hello 注意单引号和双引号
eval语句用来计算存储在字符串中的有效py表达式;
>>>
eval
(
'2*3'
)
# 6
assert断言
assert语句用来声明某个条件是真;
e.g. 确定列表中至少有一个元素, 当条件为非真的时候会引发一个错误; assert失败的时候会引发一个AssertionError;
mylist
=
[
'条款'
]
assert
len
(mylist) >
=
1
print
(mylist.pop())
# 条款
print
(mylist)
# []
assert
len
(mylist) >
=
1
# AssertionError
>assert语句应该谨慎使用; 大多数时候它能很好地捕捉异常, 用来处理问题或向用户显示错误信息, 然后退出;
repr函数
repr函数用来取得对象的规范字符串表示; 反引号/转换符可以完成相同的功能;
Note eval(repr(object)) == object
>>> 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
个句子。"
'这是第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
- 简明Python教程 14)标准库 15)更多内容 16)GUI
- 简明pyton教程学习笔记 7-10 对象+输入输出+异常+标准库+更多内容
- 简明Python教程 --- 15.更多Python的内容
- 《简明Python教程》之更多
- 简明Python教程 --- 14.Python标准库
- 简明Python3教程 17.更多
- 简明Python3教程 17.更多
- 「学习笔记——Python」Python标准库简明教程
- 「学习笔记——Python」Python标准库简明教程II
- 简明Python3教程 16.标准库
- 简明Python3教程 16.标准库
- 简明python教程 --C++程序员的视角(八):标准库
- Git,Git Gui简明教程
- python 的更多内容
- Python Requests库简明使用教程
- Python Requests库简明使用教程
- 简明 Python 教程
- 简明 Python 教程
- 数组的反转 columList.reverse();
- 银行密码
- 简明Python教程 12)输入输出 13)异常
- WLAN工作频段, MLME, PLME
- C#打包应用程序
- 简明Python教程 14)标准库 15)更多内容 16)GUI
- paip.哈米架构CAO.txt
- uva 993 Product of digits
- ACE_Message_Block简单功能
- 玩手机助手——android应用
- 第一章 Django环境配置
- Mysql 慢查询日志
- 面向对象的设计思想
- java-----螺旋矩阵