现在的位置: 首页 > 综合 > 正文

Learn Python 3 笔记

2013年10月20日 ⁄ 综合 ⁄ 共 6001字 ⁄ 字号 评论关闭

1. python 私有函数和私有成员变量
注意:在python中没有类似public,private,protected关键字来修饰成员函数和变量。
定义私有成员变量或函数,只需在变量名前加上"__ "(两个下划线),那么这个函数或变量就会成为私有的了。在内部, python使用一种name mangling技术,将__membername替换成_classname__membername,所以导致直接访问__membername时,运行时会提示找不到该__membername。
2.使用import语句可以将模块做为一个整体进行载入。
import myfile
print myfile.title
也可以使用
from myfile import title
print title
从模块文件中,获取变量名(实际上就是拷贝)
from 和import 区别在于,from增加了对载入模块的变量名的额外赋值。
3.python 中一个模块的内部属性有四个以双下划线开头并结尾的变量名:
__builtin__,__doc__,__file__,__name__
4.Python是动态类型的(它自动地跟踪你的类型而不是要求声明代码),但是它也是强类型语言
5.不可变形
在Python中,字符串具有不可变形,在其创建后值不能改变。例如,不能通过对某一位置进行赋值而改变字符串,但可以通过建立一个新的字符串并以同一个变量名对其进行赋值。
S = “Spam”
S[0] = 'Z' #会抛出一个TypeError:'str' object does not support item assignment.
但可以通过下面这种方式修改:
S = 'Z' + S[1:]
6.元组,像列表一样,元组是序列,但是它具有不可变性,和字符串类似。
T = (1,2,3,4)
T[0] = 3 # 抛出异常,TypeError: 'tuple' object does not support item assignment.
7.Python 表达式操作符
yield x 生成器函数发送协议
lambda args:expression  生成匿名函数
x if y else z  三元选择表达式
8.a=3 注释:
1). 创建一个对象来代表值3
2). 创建一个变量a,如果它还没有创建的话。
3). 将变量a与对象3相连接。
当a=3运行完成后, 变量a变成对象3的一个引用。在内部,变量事实上是到对象内存空间的一个指针。
变量名没有类型,类型属于对象,而不是变量名。
9. 在Python中,变量总是一个指向对象的指针,而不是可改变的内存区域的标签,给一个变量赋一个新的值,并不是替换了原始的对象,而是让这个变量去引用完全不同的一个对象。
10. Python 倾向于打印所有这些形式的字符串为单引号,除非字符串内有了单引号了,但也可以通过反斜线转义字符去嵌入引号。
11.s='a\nb\tc'; len(s)=5
原因就在于:反斜线字符并不真正和字符串一起存储在内存中。
转义字符序列:
\newline 忽视(连续)
\\ 反斜线(保留\)
\' 单引号
\" 双引号
\a 响铃
\b 倒退
\f 换页
\n 新行(换行)
\r 返回
12.Python 不准许你在+表达式中混合数字和字符,但准许*表达式中混合数字和字符。
13.基于键的引用的格式化表达式。
 "%(n)d %(x)s" %{"n":1, "x":"spam"}
14.在标准Python解释器内部,列表就是C数组而不是链表结构。
15. 列表解析
 L4 = [x**2 for x in range(5)]
16.列表L.append(x)
L[len(L):]=[x] <==> L.append(x)
L[:0]=[x] <==> 等同于在列表前端附加元素x。
17.从本质上讲,字典是作为哈希表(支持快速检索的数据结构)来实现的,一开始很小,并根据要求而增长。此外,Python采用最优的哈希算法来寻找键,因此搜索是很快速的。和列表一样,字典存储的是对象引用(而不是拷贝)。
18.字典:避免missing-key错误
1)可以在if语句中预先对键进行测试;
if Matrix.has_key((2,3,6)):
print Matrix[(2,3,6)]
else:
print 0
2)可以使用try语句明确地捕获并修复这一异常;
try:
print Matrix[(2,3,6)]
except KeyError:
print 0
3)还可以用我们前面介绍的get方法为不存在的键提供一个默认值。
Matrix.get((2,3,4), 0) #0作为默认值,如果字典Matrix中没有key(2,3,4),则返回0,作为其默认值。
19.使用eval可以把字符串转换成对象。
pickle模块是能够让我们直接在文件中存储几乎任何Python对象的高级工具,也并不要求我们把字符串转换来转换去,有点像超级通用的数据格式化和解析工具。如果想要在文件中存储字典,就直接用pickle来存储。
在pickle的内部,自动完成了对象和字节字符串之间的相互转换。
相关的工具有shelve模块。
20.struct模块能够构造并解析打包的二进制数据。
21.拷贝需要主要的是:无条件值的分片以及字典copy方法只能做顶层复制。也就是说,不能够赋值嵌套的数据结构(如果有的话)。如果你需要一个深层嵌套的数据结构的完整的,完成独立的拷贝,那么就要使用标准的copy模块,当然需要包括import copy语句,并编辑x=copy.deepcopy(y)对任意嵌套对象y作完整的复制。这一调用语句能够递归地遍历对象来赋值它们所有的组成部分,然而这是相当罕见的情况,因为引用通常就是你想要的,然而当它们不是你所需要的时候,分片和copy方法通常就是你所需要的赋值方法。
22.Python也把任意的空数据结构视为假,把任何非空数据结构视为真。更一般地,真和假的概念是Python中每个对象的固有属性:每个对象不是真就是假。
如下:
“spam” True
"" False
[] False
{} False
1 True
0.0 False
None False
23 Python准许循环引用
L=['grail']
L.append(L)
L
输出结果:
['grail', [...]]
24.Python语句
1)raise 触发异常
2)exec 执行代码字符串
exec "import " + modName
3)with/as 环境管理器(2.6)
 with open('data') as myfile:
process(myfile)
25.虽然可以在“=”符号两侧混合和匹配的序列类型,右边元素的数目还是要跟左边的变量数目相同,不然会产生错误。
>>> string='Spam'
>>> a,b,c,d=string
>>> a,d
('S', 'm')
>>> a,b,c=string
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    a,b,c=string
ValueError: too many values to unpack
26.合并与等效的在原处的修改相比,往往运行起来更慢点一些,因为合并运算必须建立的新对象,复制左侧的列表,再赋值右侧的列表。与之相对比的是,在原处的修改法只会在内存块的末尾增加元素。
>>> L=[2,3]
>>> L=L + [4]
>>> L
[2, 3, 4]
>>> L.append(6)
>>> L
[2, 3, 4, 6]
>>> L = L + [8,9]
>>> L
[2, 3, 4, 6, 8, 9]
>>> L.extend([10,11])
>>> L
[2, 3, 4, 6, 8, 9, 10, 11]
27.虽然Python现在支持像X+=Y这类语句,但还没有C的自动递增/递减运算符(如:X++和--X)
这些无法对应到Python中的对象模型,因为Python没有对不可变对象进行在原处的修改的概念,如数字。
28.在使用增强赋值语句来扩展列表时,Python会自动调用较快的extend方法,而不是使用较慢的“+”合并运算。因为,“+=”对列表是做原处修改的意思,完全不像“+”合并,总是生成新对象。
29.命名惯例
1)以单一下划线开头的变量名(_x),不会被from module import *语句导入的
2) 前后有下划线的变量名(__x__)是系统定义的变量名,对解释器有特殊意义
3)以两个下划线开头,但结尾没有两个下划线的变量名(__x)是类的本地变量
4)通过交互模式运行时,只有单个下划线的变量名(_)会保存最后表达式的结果。
5)类变量名通常以一个大写字幕开头,而模块变量名以小写字母开头。
30.对列表调用append,sort或erverse这类在原处的修改的运算,一定是对列表做原处的修改,但这些方法在列表修改后并不会把列表返回。
>>> L
[2, 3, 4, 6, 8, 9, 10, 11]
>>> L = L.append(4)
>>> print L
None
31.print 和sys.stdout 之间是相互等效的。因为print 语句只是传送文本给sys.stdout.write方法,可以把sys.stdout赋值给一个对象,而由该对象的write方法通过任意方式处理文字,通过这个对象扑捉程序中打印的文本。
32.Python的def语句实际上是一个可执行的语句:当它运行的时候,它创建并将一个新的函数对象赋值给一个变量名。确切地说:def在运行时才进行评估,而在def之中的代码在函数调用后才会评估。
33.所有的变量名都可以归纳为本地,全局或者内置的。在函数定义内部的尚未赋值的变量名是一个在一定范围内(在这个def内部)的本地变量,全局(在一个模块的命名空间内部)或者内置(由Python的预定义 __builtin__模块提供的)变量。
34.在函数内部定义的任意的赋值操作定义的变量名都将成为本地变量:=语句,import语句,def语句,参数传递。此外,注意实地改变对象并不会把变量划分为本地变量,实际上只有对变量赋值才可以。
35.Python的变量名解析机制“LEGB法则”,是由作用域的命令而来的。
当在函数中使用未认证的变量名时,Python搜索4个作用域【本地作用域(L),之后是上一层结构中def或lambda的本地作用域(E),之后是全局作用域(G),最后是内置作用域(B)】并且在第一处能够找到这个变量名的地方停下来。如果没有找到,Python会报错。
36. Python中的闭包
>>> def f1():
x = 88
def f2():
print x
return f2

>>> action = f1()
>>> action()
88
这种行为称为闭包或者工厂函数--一个能够记住嵌套作用域的变量的函数,尽管那个作用域或许已经不存在了。
也可以通过下面的方式避免def嵌套
>>> def c1():
x = 77
c2(x)

>>> def c2(x):
print x

>>> c1()
77
注意:在某一个函数内部就调用一个之后才定义的函数是可行的,只要第二个函数定义的运行是在第一个函数调用前就行,在def内部的代码直到这个函数运行时才会被验证。
37.默认参数是在嵌套函数创建时评估的(而不是在其稍候调用时评估),因此,每一个函数都可以记住自己的变量i的值。
acts.append(lambda x, i**x)
修改后:
acts.append(lambda x, i=i: i ** x)
38.参数传递:
1)不可变参数是“通过值”进行传递
2)可变对象是通过“指针”进行传递。
39.通过元组tuple,返回多个值
>>> def multiple(x,y):
x = 2
y = [3,4]
return x, y

>>> X =1
>>> L=[2,3]
>>> X,L = multiple(X, L)
>>> X
2
>>> L
[3, 4]
40.函数参数匹配
func(value) 调用者 常规参数:通过位置进行匹配
func(name=value) 调用者    关键字参数:通过变量名进行匹配
func(*name) 调用者 以name传递所有的对象,并作为独立的基于位置的参数。
func(**name) 调用者    以name成对的传递所有的关键字/值,并作为独立的关键字参数。
41. 函数匹配:细节
如果决定使用并混合特定的参数匹配模型,Python将会遵循下面有关的顺序法则:
1)在函数调用中,所有的非关键字参数(name)必须首先出现,其后跟随所有的关键字参数(name=value),后边跟着*name的形式,并且如果需要的话,最后是**name
2)在函数头部,参数必须以相同的顺序出现:一般参数(name),紧跟着默认参数(name=value),后面如果出现了的话是*name的形式,如果使用了的话最后是**name。
Python内部是使用以下的步骤来在赋值前进行参数匹配的。
1)通过位置分配非关键字参数
2)通过匹配变量名分配关键字参数。
3)其他额外的非关键字参数分配到*name元祖中。
4)其他额外ide关键字参数分配到**name字典中。
5)用默认值分配给在头部未得到分配的参数。
42.匿名函数:lambda
lambda argument1,argument2,...argumentN:expression using arguments
43.Python 的内置ord函数会返回一个单个字符的ASCII整数编码(chr内置函数是它的逆过程,将一个ASCII整数编码转为字符)
44.列表解析在一个序列的值上应用一个任意表达式,将其结果收集到一个新的列表中并返回。
45.生成器函数在生成值后自动挂起并暂停它们的执行和状态。
在Python中,包含yield语句的函数将会特地编译成为生成器。
46.生成器表达式类似一般的列表解析,只是它们括在圆括号中。
>>> G=(x**2 for x in range(4))
>>> G.next()
0
>>> G.next()
1
>>> G.next()
4
47.默认和可变对象
默认参数是在def语句运行时被评估并保存的,而不是在这个函数调用时,从内部来将,Python会将每一个默认参数保存成一个对象,附加在这个函数本身上。
48.嵌套作用域的循环变量
在进行嵌套函数作用域查找时,处理嵌套的循环改变了的变量时要小心。所有的引用将会使用在最后的循环迭代中对应的值,作为替代,请使用默认参数来保持循环变量的值。
49.reload 在不中止Python程序的情况下,提供了一种重新载入模块文件代码的方法。
50.在Python中,导入并非只是把一个文件文本插入另一个文件而已。
导入其实是运行时运算,程序第一次导入指定文件时,会执行三个步骤。
1)找到模块文件
2)编译成位码(需要时)
3)执行模块的代码来创建其所定义的对象。
在这之后,导入相同模块时,会跳过这三个步骤,而只是提取内存中
51.

后续需要看的关于Python书籍
《Dive Into Python》
《Core Python Programming》

抱歉!评论已关闭.