简明Python教程 14)标准库 15)更多内容 16)GUI

来源:互联网 发布:java下载不了 编辑:程序博客网 时间:2024/05/16 16:14

第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:
        = 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 = [234]
listtwo = [2*for 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 in args:
        total += pow(i, power)
    return total

使用:

1
2
>>> powersum(234# 25
>>> powersum(210# 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

原创粉丝点击