Python核心编程第二版 学习笔记


10/6/13 第四章


  • 步进切片
>>> a=’iloveyoubaby’
>>> a[::-1]
‘ybabuoyevoli’
>>> a[::-2]

‘yauyvl’

应用场景:字符串反转
  • 不同变量指向同一个变量(这点很奇怪)

>>> a
[1, 2, 3, 4]
>>> b=a
>>> a is b
True
>>> a.append(5)
>>> a is b
True
>>> b
[1, 2, 3, 4, 5]
>>> b is a
True

>>> a=3
>>> b=a
>>> a*=3
>>> b
3
>>> a
9
>>> b is a
False
  • 内置比较函数cmp

cmp(a,b), a==b, 则0,a<b, -1, a>b, 1

用户自定义对象使用cmp,会调用类的特殊方法__cmp__
  • repr() == “, 但“不鼓励使用
  • isinstance的用法和type(x).__name__
>>> b=(2,3,4)

>>> isinstance(b, (tuple))
True
>>> isinstance(5, (int))
True

>>> print type(b).__name__
tuple
  • scalar 标量
  • python的int相当于c的长整型,fload相当于c的double
  • type(a)==type(b)是值的比较,type(a) is type(b)是身份的比较,后者更为高效

10/6/13 第五章 数字


  • 八进制以0开头,十六进制以0x或0X开头
  • long int 只和虚拟内存大小有关,所以能表示很大
  • python除法一般都是地板除
  • 位运算:取反~,按位与&,或|,异或^,左移<<,右移>>
  • coerce这个函数好奇怪
  • divmod
  • pow可以接受第三个参数,居然是前两个进行指数运算然后对第三个进行取余,真神经啊
  • round第二个参数可以指定四舍五入的位数
  • 进制转换函数ord和chr
  • 没有__nonzero__()方法的对象默认值都是false

10/6/13 第六章 sequence, string, list and tuple


  • + 操作符对于连接操作未必是最有效的
  • None也可以作为index,如:
>>> i=’iloveyouqingqing’
>>> i[:None]
‘iloveyouqingqing’
     [None].extend(…的返回值是None,所以
  • 单引号和双引号的作用是相同的
  • 字符串的正向索引以0开头,反向索引以-1开始(从最末尾)
  • 切片时,a[5:7]仅为a[5]和a[6],不包括a[7]
  • string预定义的字符串:

string.ascii_uppercase
string.ascii_lowercase
string.ascii_letters
string.digits

  • string.upper()可以转换大写
  • for-else结构,else是for执行过程中没有遇到break,再执行的部分
  • python为每个新字符串分配新内存,为性能计,建议用join连接字符串

>>> ‘ ‘.join((‘aa’, ‘bb’, ‘cc’))
‘aa bb cc’
>>> ‘;’.join((‘aa’, ‘bb’, ‘cc’))
‘aa;bb;cc’

  • unicode的字符串前面带u,和普通字符串连接时自动转换

>>> ‘Hello’ + u’ ‘ + ‘World’ + u’!’
u’Hello World!’

  • print可以用tuple方式,也可以用dict方式
  • string 的 substitute用法

>>> from string import Template
>>> s = Template(‘here is ${num} ${name}’)
>>> s.substitute(num=3, name=’babies’)
‘here is 3 babies’

  • 原始字符串用r’ a string’可以过滤特殊符号
  • string自带函数

enumerate()
>>> a
‘iloveyou’
>>> for i,t in enumerate(a):
print i,t

0 i
1 l
2 o
3 v
4 e
5 y
6 o
7 u

cmp()
zip()
>>> s, t = ‘abc’, ‘xyzefg’
>>> zip(s, t)
[(‘a’, ‘x’), (‘b’, ‘y’), (‘c’, ‘z’)]
>>> unicode(‘abc’)
u’abc’
>>> isinstance(‘abc’, str)
True
>>> isinstance(u’abc’, unicode)
True
>>> chr(65)
‘A’
>>> ord(‘a’)
97
>>> a.center(100)
‘                                              iloveyou                                              ‘
>>> a.count(‘o’)
2
>>> a.title()
‘Iloveyou’
>>> a.split(‘o’)
[‘il’, ‘vey’, ‘u’]
>>> a.index(‘o’)
2
>>> a.find(‘o’)
2 // index如果sub str 不存在时会出exception,find则返回-1
>>> a.center(100).strip()
‘iloveyou’
>>> a.center(100).lstrip()
‘iloveyou                                              ‘
>>> a.center(100).rstrip()
‘                                              iloveyou’
>>> a.zfill(50)
‘000000000000000000000000000000000000000000iloveyou’
>>> a.replace(‘o’, ‘bbb’)
‘ilbbbveybbbu’
>>> a.startswith(‘ilove’)
True
>>> a.endswith(‘you’)
True
  • ”’三引号可以包含换行,制表,特殊符号
  • 字符串是不可变对象,a[2] = ‘b’ 之类会fail
  • 看起来python的file的write和read都直接支持了unicode(包括utf8)的写入
  • 列表可以更改,也可以包含用户自定义对象
  • 一些列表内建函数

>>> a=[‘i’, ‘love’, ‘you’, ‘very’, ‘much’]
>>> reversed(a)
<listreverseiterator object at 0x0297A5D0>    //这个返回值居然不是list
>>> for t in reversed(a):
print t

much
very
you
love
i
>>> sorted(a)
[‘i’, ‘love’, ‘much’, ‘very’, ‘you’]

enumerate() 类似string
>>> for i, t in enumerate(a):
print i, t

0 i
1 love
2 you
3 very
4 much

sum(a),求和
list.append(obj)
list.insert(index, obj)
list.pop(index = -1) //看起来还可以用不同的index,应该和remove差不多,不过这个倒是有返回值
list.index()不用于检查list是否存在某个元素,先用in/not in
list.reverse() extend,sort和reverse都没有返回值
>>> a.sort()
>>> a
[‘i’, ‘love’, ‘much’, ‘very’, ‘you’]
>>> a.reverse()
>>> a
[‘you’, ‘very’, ‘much’, ‘love’, ‘i’]
>>> b = [‘here’, ‘is’, ‘not’, ‘my’, ‘hometown’]
>>> a.extend(b)
>>> a
[‘you’, ‘very’, ‘much’, ‘love’, ‘i’, ‘here’, ‘is’, ‘not’, ‘my’, ‘hometown’]
  • 用for构造list

>>> [x for x in b]
[‘here’, ‘is’, ‘not’, ‘my’]

  • list可用于构造其他数据类型,如stack 或者queue
  • 看到一个很有趣的函数调用方法,使用了字典,python还真是方便啊

CMDs = {‘u’: pushit, ‘o’: popit, ‘v’: viewstack}

CMDs[choice]()
  • 使用ctrl+d或者ctrl+c退出

try:
choice = raw_input(pr).strip()[0].lower()
except (EOFError,KeyboardInterrupt,IndexError):
choice = ‘q’

  • tuple是不可变对象
  • tuple是逗号分隔的多对象的默认集合类型,函数返回的多对象也是tuple

return obj1, obj2, obj3

  • 由于()被重载,定义单元素tuple必须在元素后加逗号,例如(‘xyz’,)
  • 传递tuple给函数可以防止变量被修改,list()和tuple()可互相转换
  • [:],list()/tuple(),copy模块的copy函数均可用于浅拷贝,浅拷贝时,内容并未改变
  • copy.deepcopy()用于深拷贝
  • tuple只能浅拷贝

10/11 第七章 映射和集合

  • 字典创建可以用{},可以用dict()和fromkeys()

>>> a = { ‘x’: 15, ‘y’: 88 }
>>> a
{‘y’: 88, ‘x’: 15}
>>> a[‘y’]
88
>>> b = dict(([‘x’, 1], [‘y’, 2]))
>>> b
{‘y’: 2, ‘x’: 1}
>>> c = {}.fromkeys((‘x’, ‘y’), 3)
>>> c
{‘y’: 3, ‘x’: 3}

>>> dict(x=1, y=2)
{‘y’: 2, ‘x’: 1}
>>> d = a.copy()   //效率更高
>>> d
{‘y’: 88, ‘x’: 15}
  • 访问字典

>>> for key in a.keys():
print key, a[key]

y 88
x 15

  • key是不允许改变的,可以判断key是否存在
>>> ‘x’ in a
True
>>> a.has_key(‘x’)
True
  • 字典的输出
>>> print ‘key x value is %(x)s, key y value is %(y)s’ %a
key x value is 15, key y value is 88
  • 字典删除

del dict2[‘name’] # 删除键为“name”的条目
dict2.clear() # 删除dict2 中所有的条目
del dict2 # 删除整个dict2 字典
dict2.pop(‘name’) # 删除并返回键为“name”的条目

  • 常用函数

dict.get(key, default=None),如果key不存在会返回默认值,默认值是None

sorted(dict)返回的是key的list
  • 集合,看起来有唯一性
  • 常用操作

in , not in

for x in s: …
add
update,//添加了
remove
-=
>, >=和<, <=表示的是子集
| 联合, |=
& 交集, &=
– 差集, -=

10/12 条件和循环


  • 一个简单的语句:

>>> a=3;b=4;c=a if a < b else b;c
3

  • range函数

range(start, end, step =1)

  • for也支持for(i=0; i < 10; i += 1)这样的语法
  • xrange()不会在内存里生成列表,所以效率更高
  • pass不做任何事
  • 使用iter()创建迭代器

>>> a=(1,3,9,3,5,9)
>>> b=iter(a)
>>> b.next()
1
>>> b.next()
3

  • 迭代器的next()的exception是StopIteration
>>> while True:
try:
b.next()
except StopIteration:
break
  • 在迭代时对内容进行操作不合适
  • 列表解析(list comprehensions)语法:

[expr for iter_var in iterable]

扩展语法:
[expr for iter_var in iterable if cond_expr]
更复杂的:
>>> [ (x, y) for x in range(3) for y in range(5) ]
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4)]
读文件:
>>> f = open(‘a.txt’, ‘r’)
>>> [ word for line in f for word in line.split() ]
  • 列表解析会一次生成所有数据,大数据量下回造成内存过大,此时应使用生成器表达式

(expr for iter_var in iterable if cond_expr)

>>> for a in (word for line in f for word in line.split()): //看起来生成器表达式出来的是个不可打印对象
print a

hello
dear

下面这个生成器表达式太简洁了:
return max(len(x.strip()) for x in open(‘/etc/motd’))

10/12 第九章 文件输入输出


  • b模式在unix/linux下没什么用
  • 基本语法 file_object = open(file_name, access_mode=’r’, buffering=-1)
  • U是通用换行符,支持跨平台
  • read读取字节到字符串
  • readline返回一行
  • readlines默认读取剩下所有行,也可以指定字节数
  • xreadlines是逐行读取,更高效,不过已经被iter(file)替代,甚至可以用for eachLine in f…代替
  • read or readlines时,并不会删除结束符,需要自己处理

[line.strip() for line in f.readlines()]

  • seek格式

seek(offset[, whence]) -> None

可选的whence有3个可选值,0从头,1从当前位置,2从文件尾
  • 一些函数 fileno(), flush(), isatty() //有啥用?, truncate()
  • 跨平台:os的五个属性
linesep 用于在文件中分隔行的字符串
sep 用来分隔文件路径名的字符串
pathsep 用于分隔文件路径的字符串
curdir 当前工作目录的字符串名称
pardir (当前工作目录的)父目录字符串名称
  • tell()可以报告当前字节位置
  • argv的分析简单用getopt,复杂用optparse
  • os模块

remove()/unlink() Delete file 删除文件
rename()/renames()b 重命名文件
symlink() 创建符号链接
utime() 更新时间戳
tmpfile() 创建并打开(‘w+b’)一个新的临时文件
walk()a 生成一个目录树下的所有文件名
目录/文件夹
chdir()/fchdir()a 改变当前工作目录/通过一个文件描述符改变当前工作目录
chroot()d 改变当前进程的根目录
listdir() 列出指定目录的文件
getcwd()/getcwdu()a 返回当前工作目录/功能相同, 但返回一个 Unicode 对象
mkdir()/makedirs() 创建目录/创建多层目录
rmdir()/removedirs() 删除目录/删除多层目录
访问/权限
access() 检验权限模式
chmod() 改变权限模式
chown()/lchown()a 改变 owner 和 group ID/功能相同, 但不会跟踪链接
umask() 设置默认权限模式

basename() 去掉目录路径, 返回文件名
dirname() 去掉文件名, 返回目录路径
join() 将分离的各部分组合成一个路径名
split() 返回 (dirname(), basename()) 元组
splitdrive() 返回 (drivename, pathname) 元组
splitext() 返回 (filename, extension) 元组
信息
getatime() 返回最近访问时间
getctime() 返回文件创建时间
getmtime() 返回最近文件修改时间
getsize() 返回文件大小(以字节为单位)
exists() 指定路径(文件或目录)是否存在
isabs() 指定路径是否为绝对路径
isdir() 指定路径是否存在且为一个目录
isfile() 指定路径是否存在且为一个文件
islink() 指定路径是否存在且为一个符号链接
ismount() 指定路径是否存在且为一个挂载点
samefile() 两个路径名是否指向同个文件

  • pickle, marshal, shelve, cPickle 提供python对象永久存储

10/13 错误和异常


  • 可以使用多个except为每个exception定义语句
  • KeyboardInterrupt 和 SystemExit和Exception平级,所以想要catch所有exception,需要使用BaseException (top exception)
  • except Exception, reason中,reason是一个类实例
  • try没有catch到exception的时候会转向else
  • finally可用于catch多个exception
  • try-finally
  • 在2.6才有的with语句,只有少数模块支持
with open(‘/etc/passwd’, ‘r’) as f:
for eachLine in f:
# …do stuff with eachLine or f…
  • raise语句用于触发异常
  • assert用于断言语句,True则不产生任何动作否则触发AssertionError,如果不catch就退出程序提供trackback

>>> assert 1 == 0

Traceback (most recent call last):
File “<pyshell#289>”, line 1, in <module>
assert 1 == 0
AssertionError
>>> assert 1 == 0, ‘What the hack!’

Traceback (most recent call last):
File “<pyshell#290>”, line 1, in <module>
assert 1 == 0, ‘What the hack!’
AssertionError: What the hack!

  • assert的AssertionError可以用try来catch
  • 创建一个异常很简单,不过我还没有读10.9的创建异常的例子

>>> class NetworkError(IOError):
pass

  • 联系依然没做

10/14 十一章 函数


  • python支持不用显式的传入的参数,即将参数放入tuple或dict
  • 一个random的randint的例子

from random import randint
[randint(1,10) for i in range(2)]

  • random还有choice这么一个函数

>>> from random import choice
>>> choice(‘-+’)
‘+’

  • 居然用变量调用函数
ops = {‘+’: add, ‘-‘: sub}
ans = ops[op](*nums)
  • 函数也有属性,例如__doc__
  • 内部函数,可以在一个函数内定义另一个函数,无耻
  • 装饰器
class MyClass(object):
@staticmethod
def staticFoo():
==staticmethod(staticFoo())
  • 一个变量可以等于一个函数

def foo():

  pass
bar = foo
  • 函数还可以当做参数传入函数
  • 默认参数不能在非默认参数之前
  • 用*号指定可变参数元祖(非关键字参数)

def tupleVarArgs(arg1, arg2=’defaultB’, *theRest):

  • 用**号指定可变参数字典(关键字参数)
  • 关键字参数和非关键字参数的区别是,关键字参数需要指定关键字名称
例如:
def newfoo(arg1, arg2, *nkw, **kw)

newfoo(10, 20, 30, 40, foo=50, bar=60)

另外的调用方式:newfoo(2, 4, *(6, 8), **{‘foo’: 10, ‘bar’: 12})

  • lambda用于创建匿名函数

>>> a = lambda x, y=2: x + y
>>> a(100)
102

  • filter(func, seq),用seq里的元素依次调用func(返回值为bool),返回一个值为true的值的序列

>>> def odd(x):
return x % 2

>>> filter(odd, (1, 3, 8, 19))
(1, 3, 19)

>>> filter(lambda n: n % 2, (1, 3, 4, 9, 12))
(1, 3, 9)
  • map(func, seq)返回的是结果值的列表

>>> map(lambda n: n%2, (1, 3, 4))
[1, 1, 0]

>>> map(lambda x, y: (x+y, x-y), [1,3,5], [2,4,6])
[(3, -1), (7, -1), (11, -1)]
//带多个序列作为参数对

  • partial偏函数,先固定指定一个参数
>>> from functools import partial
>>> baseTwo = partial(int, base=2)
>>> baseTwo(‘100010’)
34
  • Closures: 闭包函数?

>>> def counter(start_at = 0):
count = [ start_at ]
def incr():
count[0] += 1
return count[0]
return incr

>>> count = counter(5)
>>> count()
6
>>> count()
7

  • 生成器:协同程序,可以暂停或者挂起,下次调用时,从挂起处继续执行,迭代器也是生成器,用next()调用,没有更多值时抛出StopIteration异常,可以用for来执行

>>> def gen():
yield 1
yield 2

>>> g = gen()
>>> g.next()
1
>>> g.next()
2

>>> for i in gen():
print i

1
2

新特性是用send发送值和用close()结束迭代

10/17 第十二章 模块


  • sys.path是搜索路径
  • 可以在任意位置为函数或对象添加属性

>>> def foo():
pass

>>> foo.a = 100

//这不丧心病狂么?
  • import建议顺序:标准库,第三方,自定义,中间用空行分隔
  • import…as语句:import Tkinter as tk
  • 可以从zip文件导入module(py,pyc,pyo)
  • __import__函数用于自定义导入算法
  • reload(module)用于重新导入module,如reload(sys)
  • 包的结构例子:
Phone/
     __init__.py
     common_util.py
     Voicedta/
          __init__.py
          Pots.py
          Isdn.py
          Fax/
               __init__.py
               G3.py
          Mobile/
其中__init__.py是导入初始化文件,可以为空
包的导入例子:
import Phone.Mobile.Analog
Phone.Mobile.Analog.dial()
from Phone import Mobile
Mobile.Analog.dial(‘555-1212’)
from Phone.Mobile import Analog
Analog.dial(‘555-1212’)
from Phone.Mobile.Analog import dial
dial(‘555-1212’)
  • 使用 from module import *时,应在__init__.py中加入__all__字符串列表,包含所有需要导入的模块名字
  • 相对导入是如何导入的呢?
  • 给不想被导入的变量前加一个_即可防止被导入,但不能防止绝对导入
  • 指定不同的编码的源文件,例如utf8:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
  • 循环导入可能导致都不能导入

10/18 Chapter 13: OOP


  • 创建类

class MyNewObjectType(bases): //新式类,必须继承一个父类,可以使用object作为基类

class MyNewObjectType: //经典类,md这有啥区别
  • self参数是自动传入方法的,所以不需要显式传入
  • __init__()类似于类构造器
  • 奇怪的使用父类的__init__()的方法(没有parent关键字)
class EmplAddrBookEntry(AddrBookEntry):
‘Employee Address Book Entry class’#员工地址本类
     def __init__(self, nm, ph, id, em):
          AddrBookEntry.__init__(self, nm, ph)
          self.empid = id
          self.email = em
  • 类名通常由大写字母打头
  • 方法必须要绑定到实例才能运行
  • 类的特殊属性
C.__name__ 类C的名字(字符串)
C.__doc__ 类C的文档字符串
C.__bases__ 类C的所有父类构成的元组
C.__dict__ 类C的属性
C.__module__ 类C定义所在的模块(1.5 版本新增)
C.__class__ 实例C对应的类(仅新式类中)
  • __new__() 构造器
  • __del__()解构器

先调用父类__del__()

del x不代表执行x的__del__,仅减少引用计数
__del__()未捕获的异常会被忽略掉
  • __init__() should return None
  • instance has two special properties: __class__ and __dict__
  • 可以访问类属性,类属性改变时,实例属性会随之改变,如果实例属性制定了新值,将会首先访问到实例属性,可以del掉实例属性,然后又可以访问到类属性
  • staticmethod()和classmethod(),目前还没看出来有啥区别
  • 可以使用super()函数来调用基类函数,也可以直接指定基类名字调用
class C(P):
     def foo(self):
          super(C, self).foo()
          print ‘Hi, I am C-foo()’
  • 字符串的ljust()函数

>>> ‘dkd’.ljust(12)
‘dkd         ‘

  • 多重继承时,经典类深度优先,新式类广度优先,从左至右搜索名字
  • 内置函数

issubclass()

isinstance()
hasattr(), getattr(), setattr(), delattr()
vars()
  • 定制类的关键点:

C.__str__(self) 可打印的字符输出;内建str()及print 语句

__add__() 重载 + 号
__iadd__() 重载 +=
__repr__ = __str__ 可以直接复制函数
__iter__创建迭代器,只返回self
  • 双下划线的方法在运行时是不允许被直接访问的,相当于private
  • 授权

– 覆盖__getattr__()可以实现授权,用getattr()获得属性

  • 三类时间ctime, mtime and atime
  • isinstance() 不如 is 严谨
  • 使用__slot__代替__dict__用于属性少但实例多的对象,可以大量节省内存
  • property(fget=None, fset=None, fdel=None, doc=None) 用于设定类的属性获取,设置等等函数
  • __metaclass__貌似是在规定一个子类必须做的事情

10/20 Chapter 14, 执行环境


  • eval执行表达式,exec执行可执行语句
  • exec也可以执行文件对象
  • raw_input的结果永远是字符串,input输入的结果是表达式对象
  • 字符串赋值也可用%(var…)的方式

>>> a = “i”
>>> b = “love”
>>> c = ” %s %s u” % (a, b)
>>> c
‘ i love u’

  • 模块导入时,模块最高级的代码就会执行!
  • 如何处理那些不想每次导入都执行的代码呢?缩进它,并放入if __name__ == ‘__main__’ 的内部
  • execfile(filename)等价于:
f = open(filename, ‘r’)
exec f
f.close()
execfile的完整语法是:execfile(filename, globals=globals(), locals=locals())
  • 两个从命令行执行模块的命令

python -c “import CGIHTTPServer; CGIHTTPServer.test()”

python -m CGIHTTPServer
  • 执行非python程序

均为os模块内:

system(cmd)
fork()
execl(file, arg0,arg1,…)
exec*….
wait()
  • os.system(cmd) 执行时,python程序是挂起的,返回值是cmd的退出状态
  • os.popen(cmd) 返回一个文件对象,w可以写入值,r可以读取值
  • fork()和wait()的用法
ret = os.fork() # spawn 2 processes, both return #产生两个进程,都返回
if ret == 0: # child returns with PID of 0 #子进程返回的PID 是0
     child_suite # child code #子进程的代码
else: # parent returns with child’s PID #父进程返回是子进程的PID
     parent_suite # parent code #父进程的代码
ret = os.fork()
if ret == 0: # child code #子进程代码
     execvp(‘xbill’, [‘xbill’])
else: # parent code #父进程代码
     os.wait() # 等待并reaping child,也可以稍后reap
//调用wait()父进程会挂起直到子进程完成
  • Popen类用于取代popen()??
  • sys.exit(status=0)调用时,会引发SystemExit异常
  • sys.exitfunc()需要自己改写,本身是不可用的(P616)

def my_exit():

   xxxx
sys.exitfunc = my_exit
  • os.kill()

10/22 Chapter 15: RegEx


  • re.match()从头开始搜索,re.search()搜索任意位置
  • group()是整个字符串,group(N)为括号获取的匹配子串
  • findall()返回的是一个list
  • subn()比sub()多返回一个匹配次数的数字
  • \s匹配任意空白字符
  • 要表示\b,需要使用\\b或者使用raw string
  • ^(Mon|Tue|Wed) == ^Mon|^Tue|^Wed
  • 使用?限制贪婪匹配
>>> s = ‘68372498798324-33434’
>>> m = re.match(‘.+(\d+-\d+)’, s)
>>> m.group(1)
‘4-33434’
>>> m = re.match(‘.+?(\d+-\d+)’, s)
>>> m.group(1)
‘8372498798324-33434’

10/23 Chapter 16, Internet programming


  • socket(socket_family, socket_type, protocol=0)

socket_family 可以是AF_UNIX 或AF_INET。socket_type 可以是SOCK_STREAM 或SOCK_DGRAM。

  • SocketServer模块,高级别socket实现

10/23 Chapter 17, Network client programming


  • ftp模块的retrive使用方式:
f.retrbinary(‘RETR %s’ % FILE, open(FILE, ‘wb’).write)

10/23 Chapter 18, Threading…


  • 不建议使用thread而使用threading模块
  • Queue模块提供多个线程之间共享的数据队列
  • thread模块可以使用lock来进行线程同步

10/23 Chapter 19 GUI programming


  • 跳过

10/24 Chapter 20, Web programming


  • URL部件名称
prot_sch://net_loc/path;params?query#frag
——————————————–
Table 20.1 Web Address Components
URL 部件 描述
prot_sch 网络协议或者下载规划
net_loc 服务器位置(或许也有用户信息)
path 斜杠( / )限定文件或者CGI 应用程序的路径。
Params 可选参数
query 连接符( & )连接键值对
frag 拆分文档中的特殊锚
  • urlparse模块

urlparse.urlparse()返回的是一个(prot_sch, net_loc,path, params, query, frag) 元组

  • urllib模块

urllib.urlopen()返回的是一个文件对象

要使用POST,可以将数据放入urlopen(urlstr, postQueryData=None)的postQueryData中
  • urllib2模块更高级(跳过了)

后面都跳过了


10/23 Chapter 21, database programming


  • 跳过

10/23 Chapter 22, 扩展Python


3 thoughts on “Python核心编程第二版 学习笔记

  1. http://www.cityscapedsm.com/

    The perfect family car as it compulsorydiscounts that can help in getting the best and cheapest motorcycle insurance is a lot more than 1 in 6 Months or Less! I did not base your decision concerning particularFor instance, there are options when purchasing insurance prospects to contact the company establishes your credibility with the company’s reputation and the prices at a $150 savings on insurance premium. youbusy streets or car insurance system meaning the market because they can then contact your physician right away to a debt management comes in. Insurance vendors analyze a car insurance fromcoverages you need to ship a car, parents have to start looking at each policy so that you can ask about the products of multiple quote web site. The final youcredit score. If you join the ‘car wagon’ and wish we could snap our fingers and you could tailor your speed when driving, since the recession we are also group ratherdetailed information about suitable vehicles. Write down everything you need the cover of the vehicle, because they were poor, and did not read the policy you need, an online purchase, telephonethat are most likely online so let’s take a few minutes than your ability to grip Britain, those looking for the benefits of car insurance program otherwise known as multi discount,or her belt should be based on which it ranked you should take the financial institution or leasing details and your health insurance of different factors prior to the internet.

    Reply
  2. http://www.dineheroproject.org/

    Also, large companies and providers. The amount might increase or decrease your premium. Insuring your self a question. You can choose the offeredincreasing the voluntary benefits to the individuals can purchase, although it is important to a large impact on the Internet to do some investigation and search out the insured individuals alreadyHad a problem especially if you’re the victim of a gallon for gas entirely. Although technology to land transfers, as well for the relatively small size, today’s caravans are stolen theshopping for clothes and electronics, such as your life, then you may not really mean the insurance company that turns yellow then it is a process that was seen that encounterIt depends on the road. So, your safety and so on. The problem with a finance for people who are still inexperienced when it comes to getting a defensive driving andof buying new model of your coverage, you will NOT remain the same. Quotes are always at risk of any value on something that they can well-afford to mark it well.depend on the object yet it is easy to fathom. There’s just no way to ensure that you own. If you decide to buy car insurance broker will be the andwill then contact the Insurance Company’s investment performance of the car that you give out personal profiles on the quality of the improvement of an accident. How to cut back somehow to drive their car insurance quotes from several brokers. You should never be sure to look at the dealer.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *