Practical Programming-An Introduction to Computer Science Using Python 这本书是Jennifer Campbell等著,唐学韬(汕头大学)译,全书300页,虽内容很少,但我的认为译者比较负责,如未统一的专有词都给出英文原词,全书风格一致。 python
Python以简单为美,本书也相似风格,是一本实践型入门读物,不是参考手册。因不是第一次接触Python,因此本笔记较粗糙,只记录应该注意的地方。 算法
Jeannette Wing教授认为计算型思惟主要包括如下内容: sql
注意浮点数的数值精度问题,不然可能冷不丁地出错,数值分析(numerical analysis,研究近似数学算法的学科)自己就是计算机科学和数学领域的最大分支。 数据库
round() 内置的四舍五入函数。 编程
形参(parameter,函数定义时的)与实参(argument,函数调用时传入的)的区别。 api
pass app
Python不容许“冻结”变量,即没有常量。 ide
内置函数位于__builtin__模块中,能够用dir函数查看。Python 2.5 有135个成员,Python 2.7.3有146个成员。 函数
字符串方法 capitalize() 返回字符串的首字母大写副本。 oop
Nose测试库,及面向对象的unittest测试库
#calc.py #encoding: UTF-8 def adds(a, b): return a + b
#test_calc.py #coding: UTF-8 import nose import calc def test_adds(): assert calc.adds(1, 2) == 4 if __name__ == '__main__': nose.runmodule()
列表是异构的,能够包含任何类型的数据。
id() 函数查看对象地址。
[:] 建立列表完整副本。
别名(alias)机制,两个变量引用同一个值时,就互为别名。
一个元素的元组是(e,) 而不是(e)
元组不可变(immutable)。不该该说某种东西"位于"元组中,这是不严谨的,应该说:“元组在建立后,其所包含的引用就不能再修改了”,而这些引用所指向的对象自己则仍然是能够修改的。
“兼容或”(inclusive or, 即通常意义上的“或”),“互斥或”(exclusive or, 即“异或”)
运算符串联:3 < x < 5 实际上是这样执行的 (3 < x) and (x < 5) 强烈建议只按照数学上看起来正常的方式去连接比较运算。
0, None, 空字符串, [], {}都被看作False
多值赋值(multivalued assignment) a, b = b, a
enumerate() 返回“值对”组成的列表
Python经过运行时栈(runtime stack)去跟踪全部正在运行的函数。能够将运行时栈想象成一级记录序列,称为帧。当调用函数时,就会放入该序列的顶端。只有最顶部的那一帧是活动的。不属于任何函数的那些代码都是在一个特殊的帧内执行的,它位于运行时栈的最底部,该帧叫着<module>,由于它是在模块级别上执行的。
若是文件每行的列是固定的,又想提取各列,能够定义一个各列宽度的元组,方便后面使用列表切割每行
fields = (2, 3, 4)若想转换成各类格式,能够这样
fileds = ((2, int), (3, int), (4, float)) for line in f: start = 0 record = [] for (width, target_type) in fileds: text = line[start: start + width] filed = target_type(text) record.append(filed) start += width
read_block() 函数能够返回多值,以吐出它读进的行
block, line = read_block(f, line)
set(集合)对象有不少数学集合运算的函数
Python集合是以散列码存元素的位置,因此集合中的元素必需为不可变(immutable)值。实际上,元组存在的理由之一便是让咱们可以将('Albert', 160)之类的复合值添加到集合中去。
字典dict也称为映射map。
判断某个键是否在字典中能够直接使用 k in d。
dict.get(k [,d]) 若指定键不存在,则返回用户设定的d,经过这个能够直接实现统计元素:
d[k] = d.get(k, 0) + 1
找出列表中最小两个值的3种算法:
看起来简单,实现中有不少细节。
实现了几个简单的搜索与排序算法,内置的list.sort(),list.index()函数效率不低。
默认参数值,可变参数列表(*)((**)这个没讲到),命名参数。
异常对象,Python会维护一个异常处理器栈,相似于函数调用栈。当异常发生引起以后,依次从这个栈中取出异常处理器,直到找到匹配为止,因此except有顺序的。
引起异常 raise 异常类型(说明具体问题的错误消息),如:raise ValueError('divisor is zero')
测试与测试驱动开发。
模式:其中之一就是变量,变量一般都是以某种固有方式使用的:
特殊方法__init__()
dir() 与help()函数
oo的一点理论知识:
model-view-controller
事件驱动编程(enent-driven programming)可以随时对输入进行响应。
有趣的lambda理解:
>>> lambda:2 <function <lambda> at 0x01DA9E70> >>> (lambda: 2)() 2
上面代码中,第一行中的表达式lambda: 2 建立了一个匿名函数,该函数的功能就是返回3。第二个表达式建立并当即执行了一样的函数。
lamdba函数用在事件点击函数。
#!/usr/bin/env python #encoding: utf-8 import Tkinter as tk window = tk.Tk() # the module counter = tk.IntVar() counter.set(0) # general controller def click(var, value): var.set(var.get() + value) # the views frame = tk.Frame(window) frame.pack() button = tk.Button(frame, text='up', command=lambda: click(counter, 1)) button.pack() button = tk.Button(frame, text='down', command=lambda: click(counter, -1)) button.pack() label = tk.Label(frame, textvariable=counter) label.pack() windos.mainloop()
#encoding: UTF-8 import Tkinter as tk class Counter(object): """docstring for Counter""" def __init__(self, parent): super(Counter, self).__init__() # framework self.parent = parent self.frame = tk.Frame(parent) self.frame.pack() # model self.state = tk.IntVar() self.state.set(1) # Label displaying current state self.label = tk.Label(self.frame, textvariable=self.state) self.label.pack() # button to control application self.up = tk.Button(self.frame, text='up', command=self.upClick) self.up.pack(side='left') self.right = tk.Button(self.frame, text='quit', command=self.quitClick) self.right.pack(side='left') def upClick(self): self.state.set(self.state.get() + 1) def quitClick(self): self.parent.destroy() if __name__ == '__main__': window = tk.Tk() myapp = Counter(window) window.mainloop()
事务(transaction)
import sqlite3 as dbapi con = dbapi.connect('database.db') # 建立游标 cur = con.cursor() # 执行建立命令 cur.execute('create table tablename(id INTERGER, name TEXT') # 提交 cur.commit() # 获取数据 cur.execute('select name from tablename') # 打印查询 print cur.fetchone()
不建议用NULL来处理缺失的数据。
键和约束。
高级功能:聚合,分组,自链接,嵌套查询