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來處理缺失的數據。

鍵和約束。

高級功能:聚合,分組,自鏈接,嵌套查詢

相關文章
相關標籤/搜索