Practical Programming-An Introduction to Computer Science Using Python这本书是Jennifer Campbell等著,唐学韬(汕头大学)译,全书300页,虽内容不多,但个人认为译者比较负责,如未统一的专有词都给出英文原词,全书风格一致。
Python以简单为美,本书也类似风格,是一本实践型入门读物,不是参考手册。因不是第一次接触Python,所以本笔记较粗糙,只记录应该注意的地方。
第一章 引言
Jeannette Wing教授认为计算型思维主要包括以下内容:
强调概念化,而非程序化。计算机科学不是计算机编程。像计算机科学家一样思考,不只要会编程,还要能在多个抽象层次上进行思考。
它是人类(而非计算机)的一种思考方式。
不论何人,不论何处。当计算型思维充分融入到人们的工作学习中,并且如常识般地从我们的注意力中消失时,它就成为了现实。
第二章 你好 Python
注意浮点数的数值精度问题,否则可能冷不丁地出错,数值分析(numerical analysis,研究近似数学算法的学科)本身就是计算机科学和数学领域的最大分支。
round() 内置的四舍五入函数。
形参(parameter,函数定义时的)与实参(argument,函数调用时传入的)的区别。
第三章 字符串
pass
第四章 模块
Python不允许"冻结”变量,即没有常量。
内置函数位于__builtin__模块中,可以用dir函数查看。Python 2.5 有135个成员,Python 2.7.3有146个成员。
字符串方法 capitalize() 返回字符串的首字母大写副本。
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
第7章 重复
多值赋值(multivalued assignment) a, b = b, a
enumerate() 返回"值对”组成的列表
Python通过运行时栈(runtime stack)去跟踪所有正在运行的函数。可以将运行时栈想象成一级记录序列,称为帧。当调用函数时,就会放入该序列的顶端。只有最顶部的那一帧是活动的。不属于任何函数的那些代码都是在一个特殊的帧内执行的,它位于运行时栈的最底部,该帧叫着,因为它是在模块级别上执行的。
第8章 文件处理
如果文件每行的列是固定的,又想提取各列,可以定义一个各列宽度的元组,方便后面使用列表切割每行
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)
第9章 集合和字典
set(集合)对象有很多数学集合运算的函数
Python集合是以散列码存元素的位置,所以集合中的元素必需为不可变(immutable)值。实际上,元组存在的理由之一即是让我们能够将('Albert', 160)之类的复合值添加到集合中去。
字典dict也称为映射map。
判断某个键是否在字典中可以直接使用 k in d。
dict.get(k [,d]) 若指定键不存在,则返回用户设定的d,通过这个可以直接实现统计元素:
d[k] = d.get(k, 0) + 1
第10章 算法
找出列表中最小两个值的3种算法:
查找,移除最小值,再查找
排序,标识最小值
扫描列表,更新最小的两个索引
看起来简单,实现中有很多细节。
第11章 搜索和排序
实现了几个简单的搜索与排序算法,内置的list.sort(),list.index()函数效率不低。
第12章 构建应用程序
默认参数值,可变参数列表(*)((**)这个没讲到),命名参数。
异常对象,Python会维护一个异常处理器栈,类似于函数调用栈。当异常发生引发之后,依次从这个栈中取出异常处理器,直到找到匹配为止,所以except有顺序的。
引发异常 raise 异常类型(说明具体问题的错误消息),如:raise ValueError('divisor is zero')
测试与测试驱动开发。
模式:其中之一就是变量,变量通常都是以某种固有方式使用的:
固定值(fixed value) 就是在被赋值之后其值不再发生变化的变量。
计步器(stepper)就是以某种可预见的方式"漫步走过”一个值序列的变量,for循环中的索引变量就是计步器。
计数器(counter)指示当前已经看到过多少东西的整数。
最符合值存储器。
最近值存储器。
容器(container)就是用来承载其它值的值。
收集器(gatherer, 有时也称为累加器(accumulator))
临时变量(temporary)
单向标志(one-way flag)用于指示某件事已经发生的变量。
第13章 面向对象编程
特殊方法__init__()
dir() 与help()函数
oo的一点理论知识:
封装(encapsulate)
多态(polymorphism)
继承(inheritance)
第14章 图形用户界面
model-view-controller
事件驱动编程(enent-driven programming)能够随时对输入进行响应。
有趣的lambda理解:
>>> lambda:2
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()
第15章 数据库
事务(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来处理缺失的数据。
键和约束。
高级功能:聚合,分组,自连接,嵌套查询