How to Think Like a Computer Scientist 英文第二版原文
原文通俗易懂,不需要做过多解释,列出一些需要注意的地方。
1 编程之路
程序中出错:语法错误、运行时错误和语义错误
2 变量、表达式和语句
2.1 类型与值
不同的值属于不同的类型,类型是一个集合,定义了其值取值的范围。
python中以逗号‘,’间隔的一行矢量,被解释为Tuple。
print(1,000,000) 其输出为 1 0 0,Print函数将逗号解释为分隔符。
t=1,000,000 print(t) 其输出为(1,0,0)
2.3 关键字
变量不能是关键字,可以使用print(keyword.kwlist)查看python当前定义的关键字。
2.4 语句
语句是解释器可以执行的指令,如赋值语句
2.5 表达式
表达式是变量、值以及运行符的组合,如 1+1
2.6 操作符和操作数
操作符是表示特定计算的符号如+,-
注:在python3以后,raw_input()函数被删除,input()函数替代了raw_input(),曾经的input()的功能可以由eval(input())来实现
3 函数
4 条件
5 带返回值的函数
pthon中函数类型为function
6 遍历
6.1 多次赋值
a=5
b=a //id(a)==id(b)
b=3 //id(a!=id(b)
6.9 封装与泛化
封装指将代码块放在函数中,泛化指抽取特殊使得函数更能应对一般情况。
6.13 函数的优点
良好的函数名,让其中的代码更易读。将长代码划分为函数,方便调试。良好定义的通用函数可以复用。
7 字符串
字符串比较可以用== 来进行。
string模块中定义了字符串的一些常量,如string.printable,string.ascii_lowcase等。可以用help(string)来查看。
ascii_letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz' ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' digits = '0123456789' hexdigits = '0123456789abcdefABCDEF' octdigits = '01234567' printable = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU... punctuation = '!"#$%&/'()*+,-./:;<=>?@[//]^_`{|}~' whitespace = ' /t/n/r/x0b/x0c'
字符串格式化:"<FORMAT>" % (<VALUES>)
9 List
9.8 List元素删除
del list1[slice]
9.10 对象与值
str1 = '12345' str2 = '12345' print id(str1)==id(str2) #True lst1 = [1,2,3,4,5] lst2 = [1,2,3,4,5] print id(lst1)==id(lst2) #False lst1=lst2 print id(lst1)==id(lst2) #True
在例子中,str1和str2引用了对象'12345',称stri为标识符。表面上看两个string对象的值是相等的,通过id ()可以看到,两个对象其实是一个对象。但lst1和lst2标识却不同,它们引用了两个不同的lst对象,两个对象只是拥有相同的值。从这里可以看到python对可变对象和不可变对象的使用方式。
在使用赋值操作后,我们使用了别名,lst1和lst2指向同一个对象,改变任何一个都可以通过另一个反映出来。如果我们希望复制一个list,我们可以使用下面的方法:lst3 = lst1[:]
9.13 list遍历
可以用in的方法,或者enumerate()返回一个(index,value)对来遍历。
9.14 list作为参数
list作为函数参数时是作为引用传入的,如果在函数内部修改了list,则调用者可以看到这些改变。同时如果返回一个list,则返回也是一个引用,也就是说在函数内部创建的list在外面可以被使用。实际上python中函数传入参数和返回参数都是引用,函数返回后,其中的变量虽然不可用了,但此变量所引用的对象仍然保留了。
11 递归和异常
11.1 元组
以逗号分隔的序列,可以用()括起来。因此单个元素的Tuple需要这样(5,),否则解释器认为这是个整数。
多元赋值 a,b,c = c,b,a
11.4 纯函数与修改器
def insert_in_mid_lst(val,lst): mid = len(lst)/2 lst[mid:mid] = [val] lst = [1,2,3,4] insert_in_mid_lst(2.5,lst) print lst def insert_in_mid_tup(val,tup): mid = len(tup)/2 return tup[:mid]+(val,)+tup[mid:] tup1=1,2,3,4 print insert_in_mid_tup(2.5,tup1) def encap(val,seq): if (type(seq)==type('')): return str(val) elif type(seq)==type([]): return [val] elif type(seq)==type((1,)): return (val,) else: raise TypeError,'type error' def insert_in_mid(val,seq): mid = len(seq)/2 return seq[:mid]+encap(val,seq)+seq[mid:] print insert_in_mid(2,(1,2,4))
11.5 递归数据结构
如list,tuple中的元素仍可以为list和tuple,内置的sum()不能处理嵌套序列,需要自己实现。
11.7 异常
异常的使用可以见11.4中的代码
11.8 尾递归
如果函数最后返回的是自己的调用,称之谓尾递归,Python不建议使用尾递归。
12 字典
12.2 字典的成员方法
keys() 返回字典中所有关键字的列表,values()返回所有值的列表,items()返回所有条目的列表,has_key()判键是否在字典中。
12.3 字典的复制
使用成员方法copy()可以得到当字典的一个复本。
12.4 稀疏矩阵的表示
matrix = [[0, 0, 0, 1, 0], [0, 0, 0, 0, 0], [0, 2, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 3, 0]] smatrix = {(0,3):1,(2,1):2,(4,3):3} print smatrix[(4,3)] print smatrix.get((4,3)),smatrix.get((0,0),0)
对于稀疏矩阵而言,列表的方法导致多数位置为0,空间浪费,因而只需要记录非0点的位置和值即可。可以使用字典来模拟稀疏矩阵的存储。由于访问不存在的key时,字典会抛出KeyError的异常,因此字典提供了get(key,[val])的成员方法,若key不存在,其返回val或者None
12.6 大整数
Python提供了Long类型的整数支持任意大的整数,创建一个大整数只需要在用long()转换,或者在数字后加后缀L。
13 类与对象
13.1 属性
Python中,类和对象都可以有属性,对象可以实例化类之后动态的新添加属性。当然也可以在每个类中事先就添加好这些属性。在类的定义体中如果一个数据属性不是由self提引,
13.6 相似性
相同=》相等,但反之不成立。==用来比较两个引用是否相同。如果希望仅看值是否相等,必须使用深度比较,比较对象各个属性是否相等。
13.10 copy模块
其中copy()提供了复制简单对象的方法,而deepcopy()提供复制包含其他对象的对象的方法。
15 类和方法
15.8 运算符重载
python提供的运算符重载的方式是用户可以声明形以__add__(),__sub__(),__mul__()之类的函数,当调用+ - *时,这些运算符会调用类上的__x__()相应的操作。
16 类Set对象