第一章 Python基础
list是一种有序的可变集合[ ],可以包含不同的数据类型,下标由0开始,到n-1,下标也可以为负数,表示倒数第i个,到-n;可以使用append函数在末尾插入,也可以使用insert函数插入到指定位置;使用pop(i)删除末尾或第i个元素。
tuple又叫元组(),一旦初始化就不可再改变
dict又叫字典,d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}2
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。s = set([1, 1, 2, 2, 3, 3]);set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:s1 & s2;s1 | s2
第二章 函数
函数def需要指定函数名和参数名,不需要指定返回值类型;函数参数有普通的位置参数,默认参数(多一个等号);可变数目参数(形参名前加一个*号),调用时也要加*号;
关键字参数:可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。定义时在参数名前加两个*号;如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下:def person(name, age, *, city, job):关键字参数会进行复制传递,所以在函数中修改不会改变原字典的值,
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。在此基础上,所有参数(自变量)在Python里都是按引用传递。
默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!
要注意定义可变参数和关键字参数的语法:
*args是可变参数,args接收的是一个tuple;
**kw是关键字参数,kw接收的是一个dict。
第三章 高级特性
列表生成式则可以用一行语句代替循环生成上面的list:
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
只要把一个列表生成式的[]改成(),就创建了一个generator:;另外一种生成方法是 如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。要理解generator的工作原理,它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。
a, b = b, a + b相当于
t = (b, a + b) # t是一个tuple
a = t[0]
b = t[1]
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
第四章 函数式编程
要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map():
map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
第六章 面向对象编程
定义类:
classStudent(object):def __init__(self, name, score):
self.__name =name
self.__score =scoredefprint_score(self):print('%s: %s' % (self.__name, self.__score))
其中函数__init__用于构造对象,第一个参数self是固定的
和静态语言不同,Python允许对实例变量绑定任何数据,bart.age = 8
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__;在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名;不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量