学习周期:5.19-5.25
学习时长:
5.20 4h -chap4/5
5.21 1h30m (09:00-09:30, 22:30-23:30) -chap6
5.22 1h30m (09:00-09:30, 22:30-23:30) -chap6
5.23 1h (09:00-09:30, 23:00-23:30) -chap7
5.24 1h30m (09:00-09:30, 22:30-23:30) -chap8
5.25 40m(08:40-09:20) -chap9
学习内容:Chap4-Chap9
- 句话心得:本周对python基本的数据结构、数据处理方式了基础的了解。但是缺乏应用,需要加强实践。同时通过学习别人的建模代码,了解常用数据计算、统计计算的计算包。
Chap3 字符串
- 字符串格式化操作符:%s,占位符,可写在”“中
- join:split方法的逆方法,用来连接序列中的元素。
dirs='','usr','bin','env'
print 'C:' + '\\'.join(dirs)
#结果 C:\usr\bin\env
Chap4字典
Chap5条件、循环和其他语句
5.2赋值魔法
- 序列解包/递归解包:将多个值得序列解开,然后放到变量的序列中。
x,y,z=1,2,3
print x,y,z
#1 2 3
- 链式赋值:将同一个值赋给多个变量的捷径。
x=y=somefunction()
#等价于
y=somefunction()
x=y
- 增量赋值:原地改变变量,将表达式运算符放在赋值运算符=的左边
x+=1 #等价于 x=x+1
x*=2 #等价于 x*=2
5.4条件和条件语句
- 解释器看作假(false):可用bool() 转换其他值
- false
- None
- 数字0
- 空值如:”” () [] {}
- 同一性运算符:is,表示相同对象(值相同不一定是相同对象)
5.5循环
- range(0,10,1) = range(10) = [0,1,2,3,4,5,6,7,8,9]
- range()和xrange()的区别
- for循环中使用序列解包:
for key, value in d.items():
print key, 'corresponds to', value
#dict中key是无序排列的
- 循环索引的标准变量名:for i in range(len(names)):
- 并行迭代:zip()
for name, age in zip(names, ages):
print name, 'is', age, 'years old'
- 按索引迭代:当迭代访问序列中的对象,同时还要获取当前对象的索引时使用。enumerate(),可在提供索引的地方迭代索引-值对。
for index, string in enumerate(strings):
if 'xxx' in string:
strings[index]='xxx'
#index是索引
- while true/break 习语:在循环内部的if语句中加入条件判断,主动break:
while true:
word=raw_input('enter a word')
if not word:break
print 'the word is ' + word
5.6列表推导式:轻量级循环
- 高级,不过容易写错
[x*x for x in range(10) if x%3==0]
#[0,9,36,81]
5.7 pass/del/exec/eval
- pass:python中空代码块是违法的。
- del:python中对象和变量名是分开的,变量改变后对象仍然存在。
- exec:动态创建代码字符串,并执行。
- 命名空间/作用域(scope),保存变量的地方。
exec 'sqrt=1' in scope</li>
<li>scope['sqrt'] #=1
- eval:用于求值,计算以字符串形式书写的表达式,并返回结果值。
Chap6 抽象
6.4参数魔法
- 一个感觉比较有用的字典方法 aDict.setdefault(key[,default])
- 如果aDict[key]存在则将其返回,否则返回给定的默认值(默认为None)并将aDict[key]的值绑定给该默认值
girls=['alice','bernice','clarice']
letterGirls={}
for girl in girls:
letterGirls.setdefault(girls[0],[]).append(girl)
- 在函数内为参数赋值不会改变外部任何变量的值,参数存储在局部作用域中。
- 当两个变量同时引用一个列表时,它们的确是同时引用一个列表。修改列表会改变两个变量的取值。如果想避免出现这种情况,可以复制一个列表的副本。序列切片返回的总是一个副本。
- n=names[:] 切片所有等于复制
- 位置参数与关键字参数
- 关键字参数:在调用函数时指明参数对应的值
- 关键字参数:在函数定义时给参数定义默认值,调用参数时可以选择性输入入参。
- 星号表示手机其余的位置参数 def print_params(*params). 允许使用不定数目的参数。
6.5 作用域
- 全局作用域
- 每个函数调用时都会创建一个新的作用域(新的命名空间),函数内的变量被称为局部变量
- 访问全局变量:globals()[‘parameter’]
- 函数内申明全局变量: global x
6.6递归
- 函数式编程:map filter reduce apply
- lambda
7 类和类型
7.1 对象
- 对象:对象包括特性和方法,特性只是作为对象的一部分的变量,方法则是存储在对象内的函数。绑定方法和其他函数的区别在于方法总是将对象作为自己的第一个参数,这个参数是self。
- 多态:对不同类的对象使用同一的操作,不用关注变量所引用的对象类型,只要对它进行操作即可。多态会根据对象或类的类型的不同表现出不同的行为。
- self参数:方法和函数的区别
7.2 类和类型
- 子类可以拓展超类的定义,将其他类名写在class语句后的圆括号内可以指定超类:
- 检查继承,看a是不是b的子类: issubclass(a,b)
8 异常
- 自主引发异常:raise Exception(‘xxx’)
- 捕捉异常:
- try:
- except xxxError:
- 用一个块捕捉多个异常,可以将它们作为元组列出
try:
x=12
y=0
print x/y
except(ZeroDivisionError, TypeError, NameError):
print 'xxx'
-捕捉对象本身 except(zError, tError), e
- 捕捉所有异常,使用空的except字句 excpet:
- 循环直至没有异常引发的情况下才退出
while True:
try:
x=111
y=111
value=x/y
print 'x/y' is, value
except Exception, e:
print 'invalid input', e
print 'please try again'
else:
break
- 异常后的清理:finally
- 如果知道某段代码可能会导致某种异常,而又不希望程序以堆栈跟踪的形式终止,添加try/except 或 try/finally 子句处理。
9 魔法方法、迭代器
- 前后加双下划线
- 确保类是新型的,应该把赋值语句 metaclass=type放在模块最开始
9.1 构造方法
- 当一个对象被创建后,会立即调用构造方法
class foobar:
def __init__(self):
self.somevar=42
>>>f=foobar()
>>>f.somevar = 42
- 如果一个类的构造方法被重写,那么就需要调用超类(你所继承的类)的构造方法,否则对象不会被正确初始化。
- super函数,在子类中继承超类
class songbird(bird):
def __init__(self):
super(songbird,self).__init__()
self.sound='Squawk!'
def sing(self):
print self.sound
9.3成员访问
- 创建行为类似于序列或映射(字典)的对象
- getitem(self, key)
- setitem(self,key,value)
- 子类化列表,字典和字符串
- class CounterList(list):
- super函数继承