Python入门读物摘要--How to think like a csor

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对象

 

你可能感兴趣的:(python,list,input,insert,whitespace)