`
friendsys
  • 浏览: 338287 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

dive into python中文版笔记

阅读更多
本文为dive into python中文版笔记--感谢翻译人员的工作

...

2.5 代码缩进,与Java不同,没有固定的{}表示代码块,Python使用缩进表示块的开始,取消缩进表示块的结束
一般使用4个空格表示,并不一定需要4个,只要一致即可

Python 使用硬回车来分割语句,冒号和缩进代码块。

2.6 模块测试: 主要指用于辨认当前模块的类型(注: 模块也是对象),使用内置的__name__属性,通常是模块的
文件名,不带扩展名,如果当前模块是被直接运行的,那将会使用特殊的默认名__main__
使用   if __name__ == "__main__":


Chapter 3 内置数据类型

3.1: Dictionary(dict) 字典--键值对,类似Java中的Hashtable的实现

定义: d = {"server":"mpilgrim", "database":"master"}
访问: d["server"]
操作: 直接d["server"]=3 进行赋值操作,如果key不存在则会创建,否则为覆盖,value的值可以是任意数据类型
      del d[42] 删除指定元素  d.clear()回收全部

3.2 List --Python中使用最频繁的数据类型--与Java中的ArrayList类似

定义: li=["a", "b", "mpilgrim", "z", "example"]
访问: 使用索引访问 li[0],也可以使用负索引进行访问
分片访问: li[1:3:1] 最多可以包含3个. 分别为 起始index,到底的index(不包含),步数
添加元素: 使用append insert extend(list)等方法
搜索元素: index---返回索引
  in ---返回boolean,判断元素是否在list中
删除元素:remove,移除一个
  pop,移除最后一个元素,并返回该元素
支持的运算符: +,+=,*, 对于大型List,extend的执行速度要快一些,但 + 是返回一个新结果,并
  不修改原结果


Python的True--由于2.2.1版本前没有Boolean类型,注意首字母大写 True False

0为false; 其它所有数值皆为 true。
空串 ("") 为 为 false; 其它所有字符串皆为 true。
空 list ([]) 为 为 false; 其它所有皆为 true。
空 tuple (()) 为 为 false; 其它所有 皆为 true。
空 dictionary ({}) 为 为 false; 其它所有皆为 true。

Tuple 元组,不可变的list,速度更快一些

定义: t = ("a", "b", "mpilgrim")  // 注意单元素时: (1,)  ,逗号是必须的
访问: 使用索引访问,也可以使用切片(分片)访问

元组可以作为Dict的key使用
可以使用list()和tuple(),进行tuple和list的相互类型转换

3.4: 变量的定义
不需要声明类型,和其他语言一样,有全局和局部变量之分,可以使用\(续行符)分割多行,用于
给一个变量赋值,引用未初始化的变量将会抛出错误: 注意 在使用[] {} 等符号内时不需要\

可以使用 = 进行一对多,多对多的赋值
如 a,v,c=1,3,4
   a=1,2,3  //将结果保存成一个元组tuple

可以使用内置range()生成连续的数字List,和切片一样的结果,默认从0开始,到指定位置-1

3.5 格式化字符串---类似C中sprintf的应用

格式如: "%s=%s" % (k, v)

3.6 映射List---链表推导式

如  li = [1, 9, 8, 4]
    [elem*2 for elem in li]

根据一个链表,生成一个新的链表,不仅在list上使用,在字典使用时
[k for k, v in params.items()]

常用的内置函数 dir type str

type用于返回对象的类型
str 用于将对象转换成字符串
dir 用于输出函数返回任意对象的属性和方法列表

内置函数均保存在__buildin__ 模块中,默认加载

可以使用内置的getattr(object,str)方法,使用字符串得到指定对象的方法,然后进行调用

如:
li=[1,3,5]
d=getattr(li, 'append')
d(9)
print li
注意返回的是一个method对象,需要使用()进行调用,也可以传入参数

同样getattr也可以作用与模块,调用指定的方法

getattr常见的使用模式是作为一个分发者,调用方法名类型的方法
def output(data, format="text"):
    output_function = getattr(statsout, "output_%s" % format) (2)
    return output_function(data)

注意进行传入参数的有效值判断,防止异常的出现,也可以传入第三个参数,作为默认值进行返回
output_function = getattr(statsout, "output_%s" % format, statsout.output_text)

4.5 过滤列表---通过链表推导式中加入条件
[mapping-expression for element in source-list if filter-expression]

li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]
[elem for elem in li if len(elem) > 1]

4.6 and和or的使用 ----类似Java中的 &&和||

因为Python中的boolean的特殊性,使用and 和 or时,会根据不同情况,将True的对象返回,
而不是直接返回一个boolean对象


4.7 使用lambda表达式,用于快速定义单行的最小函数(来源Lisp)

如: g = lambda x: x*2
    g(3)  //进行调用

也可以通过 (lambda x: x*2)(3) 进行调用

使用__doc__属性,可以获取指定对象内的docstring

5.2 使用 from module import--类似Java 5中的static 导入,将指定的模块方法导入到当前
模块的命名空间内,可以直接调用

注意防止命名冲突,尽量少用 from module import *

5.3 类的定义

class Loaf:
    pass
使用__init__作为构造函数,不是必须创建.使用类名(..)中表示继承,支持多继承

每个类方法都第一个参数,都是指向类当前实例的引用self, //self不是必须的名称,只是约定

类的实例化,相比Java,就少了一个new 关键字

与Java类型,变量超出作用域后,将会被自动回收

Python的方法 不存在重载,__init__也是唯一的

可以通过对__getattr__和__setattr__,监听对class实例的值进行修改: 只对动态值有效,classs
中定义的值无效

其他的内置方法
__cmp__ class实例在==比较的时候被调用

Python中的专有方法,不许需要用户直接调用,格式如__getitem__
私有方法,只使用两个__开头为约定,外部将无法进行调用

以上更多的是习惯问题,而不是强迫的


6.1 异常处理
Python使用try..except..finally...else 等组合进行捕获异常处理,使用raise抛出异常
Java使用try..catch..finally 捕获异常,使用throw抛出异常

else将会在没有异常抛出的情况下运行,except可以同时捕获多个异常,raise也可以抛出异常同时,传递
自定义信息

6.2文件对象操作
使用open()打开文件,可以接收三个参数:文件名、模式和缓冲区,同时返回一个对象
同时注意进行close(),保证资源的回收,以及使用try...except进行异常的捕获

close()方法,并不会抛出异常

模式: w  表示写入文件,不存在则创建,存在就覆盖
      r  读取文件
      a  将内容添加到文件尾
     其他 还有w+ 等...

可以使用 for k,v in d.items(): 遍历dict的元素,注意dict是无序的

module导入一次后,将会被缓存,下次下载将会很快

os模块提供与系统平台相关的操作
sys模块提供与Python环境相关的操作
glob模块提供文件的模糊搜索功能  //如:glob.glob('D:/download/*.rar')

Chapter 7 正则表达式---主要使用re 模块

需要import后才可以使用

常用方法 sub,findall,patten.search(str).group()等

例子一:
s='ad13adjl4jljl13h4g5j1jj13'
de=re.findall('\d+', s, re.MULTILINE)
print type(de),len(de),de

例子二:
s='dada'
c=re.compile('(.{1})')
print c.search(s).groups()  //注意()的使用

可以使用r'...'关闭转义要求,patten就是普通的字符串str, 模式也可以使用str直接表示,不过使用
re module的常量会更合适一些

使用re.compile(r'...') 可以创建指定正则的实例,关键在于增加了需要方法

其他:使用正则情况下,最后加上docstring或者#注释,提高可读性,本书介绍正则的篇幅还是很多的


Chapter 8 HTML处理

读取网页内容的方法,使用urllib模块  //还有个urllib2,使用上一样,具体区别未知

import urllib
sock = urllib.urlopen('http://www.baidu.com')
htmlsource=sock.read()
sock.close()
print htmlsource.decode('GB2312')  //注意进行转码

Python 2.6也提供了一些HTML的内置工具module,本书基于2.3,所以未见介绍.

Python中的变量: locals局部, globals全局

基于dict的字符串格式化, 也就在%()s 中加入(key)
params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
"%(pwd)s" % params

使用内置函数locals(),获取dict当前作用域中的局部变量

def d():
    k=1
    b=2
    print locals()
>>> {'k': 1, 'b': 2}

注意locals 存在性能问题,因为他创建了局部命名空间的一份拷贝


Chapter 9 . XML处理

与Java类似,同样拥有Sax和Dom两个模块用于处理xml,本书主要介绍DOM模块

Python可以选择从模块中导入函数,类或指定包内的所有模块,注意导入的命名空间,嵌套的对象
依旧需要使用模块名进行引用

对于包的直接导入内容,可以在__init__.py文件中进行设置,该文件也是每个包下必须拥有的,默认
情况下文件内容可以为空


可以使用xml.dom 下的minidom进行简单的dom解析
from xml.dom import minidom
xmi=minidom.parseString("<roots><root id='33'>orz</root></roots>")
print xmi.toxml()

使用 childNodes 属性获取所有节点的集合,链表对象,使用firstChild可以访问子集的元素,注意
文本内容也是一个单独的节点

注意在xml中避免换行,空格等符号,否则也会被解析成一个节点

只有text节点(文本内容),提供data属性

可以使用#coding:utf-8 设置py文件的编码--可以用于直接使用中文

继续XML解析: 使用getElementsByTagName方法搜索元素,将返回所以符合条件的Element对象列表

c=xmi.getElementsByTagName('root')
print c[0].attributes['id'].value  //使用name 可以访问key..不过'id'就是key

小节: 介绍的还是比较混乱...


Chapter 10 : 脚本和流

解析来自URL的xml
usock = urllib.urlopen('http://slashdot.org/slashdot.rdf') (1)
xmldoc = minidom.parse(usock)  //同时也可以直接传入xml文件进行解析
usock.close() //注意关闭

parseString() //用于解析字符串

StringIO模块,可以将一个字符串模拟成文件对象---提供read..seek方法
ssock = StringIO.StringIO('str')
同样,需要使用close()进行关闭

修改sys.stdout 可以将print的内容进行重定向,比如传入到一个文件中,
fsock = open('out.log', 'w')
sys.stdout = fsock
print...

sys.stderr 用于错误信息的重定向

也可以见到的使用print >> file 进行相同操作,不过只会提供一次的重定向.

处理命令行参数---用于在控制台,运行脚本情况下,获取附带的参数
sys.argv,用于获取参数的列表

getopt模块..需要再自己补充下


Chapter 11. HTTP Web服务

使用httplib 模块,提供更多的HTTP连接过程的操作,需要与urllib配合使用

设置 httplib.HTTPConnection.debuglevel = 1 后,urllib的连接过程将会自动打印出HTTP信息

urllib2提供了更多对于HTTP的操作能力
连接的方式
request=urllib2.Request('http://www.baidu.com')
opener = urllib2.build_opener()
d=opener.open(request).read()

主要操作request对象,进行http信息的修改
request.add_header('User-Agent', 'OpenAnything/1.0 +http://diveintopython.org/')

通过request的add_header方法,可以往请求中添加任意的内容

使用d.headers.dict 获取opener open之后的请求信息

常见HTTP状态码: 200 正常, 404 未找到  302 重定向 304内容未修改

可以添加 request.add_header('Accept-encoding', 'gzip') 允许向服务器请求压缩后的数据
可以使用StringIO与GZip模块进行解压缩

compressedstream = StringIO.StringIO(compresseddata) //compresseddata为read的压缩后的内容
gzipper = gzip.GzipFile(fileobj=compressedstream)
data = gzipper.read()

注意一定需要使用StringIO

SOAP 服务跳过..需要使用第三方类库,也许已经太久.


Chapter 13 单元测试
使用unittest模块进行测试,与Java类似,需要继承unittest模块中的TestCase类,同时方法
名定义为testmethodname. 使用self对象的方法进行测试...类似java的assertEqual方法

unittest.main() //执行测试,所有测试类中以test开头的方法都会执行
如:
class UUTest(unittest.TestCase):
    def testmethod(self):
        self.assertEqual(1,2)

unittest.main()

建议通过继承Exception自定义异常,同样建议继承Object实现自定义异常

正则使用时,可以通过参数添加单行的内联注释,可以同时添加多行
re.compile("\d #注释",re.VERBOSE)


单元测试的基本概念

1:测试用例的设计方针是目的单一,可以自动运行,互不干扰.
2:在被测试代码编写之前编写测试用例
3:编写测试有效输入的测试用例,并检查正确的结果
4:编写测试无效输入的测试用例,并检查正确的失败
5:为描述BUG或反映新需求而编写和升级测试用例
6:为改进性能,可伸缩性,可读性,可维护性和任何缺少的特性而无情的重构.

默认使用普通模式的运行测试,可以使用详细(verbose)模式运行,得到更多的输出
unittest.main(argv = unittest.sys.argv + ['--verbose'])

数据中心思想...看的不是太懂,可能关注在数据之上,而不是对数据的操作习惯.

动态导入模块

import时,可以使用,同时导入多个模块

动态模块也可以达到同样的效果

sys = __import__('sys') //以内置函数的形式导入module,参数为字符串

可以配合map和filter等内置函数,批量导入模块
moduleNames = ['sys', 'os', 're', 'unittest']
modules = map(__import__, moduleNames)
map函数中,把列表中的元素依次调用指定的函数

filter更多用于过滤,并返回符合条件的结果

filter和map的第二个参数可以为列表,元组以及定义了__getitem__特殊方法的自定义类

生成器--使用yield生成的类似function对象
def getY():
   while 1:
yield 1
counter = getY()
counter.next()

也可以使用for循环得到类似的结果
def getY():
   for i in range(10):
       yield i


Chapter 18: 性能优化

要防止过早的优化: 比如在代码编写完成之前

使用timeit模块计时,使用重复测试中的最小值作为最终结果..具体例子介绍的并不详细,例子
没有写成功..

如果需要在正则和编写循环之间进行选择,选择正则,因为正则是用c写的,python的循环需要通过
python解释器运行.

如果正则和字符串方法进行选择,选择字符串方法,都是以C编译的,所以选取简单的

使用静态的搜索方法 如:string.maketrans 会比普通的字典查找更快

最后一点:不要太迷恋性能优化.

本书对例子的介绍比较多,并不适合初学者阅读.











分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics