Python编程实践 学习笔记

Practical Programming-An Introduction to Computer Science Using Python 这本书是Jennifer Campbell等著,唐学韬(汕头大学)译,全书300页,虽内容很少,但我的认为译者比较负责,如未统一的专有词都给出英文原词,全书风格一致。 python

Python以简单为美,本书也相似风格,是一本实践型入门读物,不是参考手册。因不是第一次接触Python,因此本笔记较粗糙,只记录应该注意的地方。 算法

第一章 引言

Jeannette Wing教授认为计算型思惟主要包括如下内容: sql

  • 强调概念化,而非程序化。计算机科学不是计算机编程。像计算机科学家同样思考,不仅要会编程,还要能在多个抽象层次上进行思考。
  • 它是人类(而非计算机)的一种思考方式。
  • 不论何人,不论何处。当计算型思惟充分融入到人们的工做学习中,而且如常识般地从咱们的注意力中消失时,它就成为了现实。

第二章 你好 Python

注意浮点数的数值精度问题,不然可能冷不丁地出错,数值分析(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

第7章 重复

多值赋值(multivalued assignment) a, b = b, a

enumerate() 返回“值对”组成的列表

Python经过运行时栈(runtime stack)去跟踪全部正在运行的函数。能够将运行时栈想象成一级记录序列,称为帧。当调用函数时,就会放入该序列的顶端。只有最顶部的那一帧是活动的。不属于任何函数的那些代码都是在一个特殊的帧内执行的,它位于运行时栈的最底部,该帧叫着<module>,由于它是在模块级别上执行的。

第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
<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()

第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来处理缺失的数据。

键和约束。

高级功能:聚合,分组,自链接,嵌套查询

相关文章
相关标签/搜索