讀《像計算機科學家一樣思考python》——筆記


這本書,完全是入門級的,特別簡單,一天多就看完。

目錄:

第二章 變量、表達式和語句

第三章: 函數調用

第四章: 案例研究:接口設計

第五章 條件與遞歸

第六章:有返回值的函數

第七章 迭代

第八章 字符串序列

第十章: 列表

第十一章: 字典

第十二章 元組

第十四章 文件

第十五章 類和對象

第十六章 類和函數

第十七章 類和方法

第18章 繼承

 

 

 

第二章 變量、表達式和語句

1.  變量的基本數據類型:python中有 整型、長整型、浮點型、字符串型、復數形式5種。

2. 使用type( ),可以查看數據類型;如:type(2), type(‘xiaoming’) 等; type是一個函數;

3. 數值操作符:

    1) 加、減、乘、除、求模和乘方: + 、-、 *、/、% 和 **

    2)在python2中, 除法 / 使用的是舍去式除法(整數相除為整數), 即 2/3 結果為0; 在python3中,除數結果為浮點數類型,即 2/3 =0.6666666666666……, 並且使用一個新的操作符 // 表示舍去式除法 .

    3)操作順序: 乘方>乘除>加減

4. 字符串可以使用的操作:

    1) 拼接: 使用 + , 如: ‘adfsa’+’adfds’ = ‘adfsaadfds’

    2) 重復操作: 使用 * , 如: ‘abc’*3 = ‘abcabcabc’

5. 注釋與換行:

# 我現在就是注釋狀態
print 'a'
#換行使用 \ 符號;
print 'asdfggk\
        sdsfsf'

 

第三章: 函數調用

1. python中內置的類型轉換函數

int 把浮點數轉換為整數,它直接把小數部分舍去;   如 int(3.999) = 3; 又或  int(‘2’) = 2,它轉換了字符串

float函數將整數和字符串轉換為浮點數: float(32)=32.0 或 float(‘3.14159’) = 3.14159

str函數將參數轉換為字符串;

2, 定義無返回值的函數,定義方法如下, def + 函數名+() + :, 函數體要有縮進: 

def hello():
  print 'hello,world!'
  print 'hello, yinheyi'

3.  python提供了兩種導入模塊的方式:

方法一: import 模塊名, 如 import math , 這時如果訪問模塊里面的函數的時候,需要同時指明模塊名與函數名,中間用 . 分隔;

方法二: from 模塊名 imort 函數名,   這時,我們就可以直接使用這個函數名了,並且不需要指明模塊名; 使用 from 模塊名 import * 導入模塊的所有成員;

優缺點: 第二方式可以使代碼更簡潔,但是,不同模塊的同名成員之間,可能發生沖突;

 

第四章: 案例研究:接口設計

1. 一個開發計划:

1) 最開始寫一些小程序, 而不需要函數定義;

2) 一旦程序成功運行,將它封裝到一個函數中,並加以命名;

3) 泛化這個函數,添加合適的形參;

4) 可以使用重構來改善程序的機會, 例如, 如果發現程序中幾處地方有相似的代碼,可以老柴將它們抽取出來做一個合適的通用函數。

 

2. 文檔字符串:

它的作用:在函數開頭用來解釋其的字符串。

def hello():
""" 這是一個文檔字符串, 使用三個引號 可以允許字符串跨行表示;
我現在就跨行了啊;
"""
    print "hello,world!"

注意:編寫這類文檔是接口設計的重要部分. 一個設計良好的接口, 也應當很簡單就能解釋清楚;

 

第五章 條件與遞歸

1. 關系操作符:

不等於 !=
大於 >
小於 <
大於等於 >=
小於等於 <=

2. 邏輯操作符:

and
or
not

3. 布爾值與布爾表達式:

表達式的值是真或假的表達式,就是布爾表達式。 它的值為  True或False, 它們並不是字符串。

4. 空語句: 在python中, 空語句使用 pass,記好!!!!

5. 條件判斷表達式:

1) 只有一個分支:

if x < y: 
    print 'x is less than y'

2)有兩個分支:

if x < y:
    print 'x is less than y'
else:
    print 'x is large than y'

3) 多個分支:

if x < y:
    print 'x is less than y'
elif:
    print 'x is large than y'
else:
    print 'x is equal to y'

6. 從鍵盤輸入:

python 2 提供了內置函數 raw_input 來從鍵盤獲取輸入, python 3 中這個函數改為了 input, 不過它們的用法相同。

a = raw_input('input your name:\n')
print 'hello '+a+'!'
#輸出為:
input your name:
yinheyi
hello yinheyi!

 

第六章:有返回值的函數

1. 增量開發程序:

這個思想真的很好, 我們可以把一個大的函數一點點的增加開發出來 ,慢慢的一點點的調試。增加一些必要的腳手架代碼。 比如,在關鍵的位置打印一下變量的值等。一步步地來,保證每一步都是正確的, 這樣可以幚我們節省大量的調試時間。

2. 有返回值的函數: 返回值使用 return 返回。

def sum(a, b):
    temp = a + b
    return temp

3.  堅持信念:

在寫遞歸函數的時候, 我們可以使用一個方法: 堅持信念。 當我們遇到一個函數的調用的時候,不去跟蹤執行的流程,而是我們假定函數是正確工作的,能夠返回正確的結果 。如著名的斐波那契數列,它的程序可以寫作:

def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
    return fibonacci(n-1) + fibonacci(n-2)

4. 檢查類型:

python中內置了一個函數  isinstance 來檢查的實參的類型,  正確返回True, 否則返回 False

isinstance(12, int)
True
>>> isinstance(12.2, float)
True
>>> isinstance('hello', str)
True

 

第七章 迭代

1. while 循環:

while n < 100:
    print n
    n = n - 1

2. for 循環:

for i in range(100):
    print i
    i = i + 1

 

第八章 字符串序列

1. 字符串是一個序列,它的下標是0 開始的;  使用python的內建函數len() 可以返回字符串中的字符的個數:

>>> a = 'hello'
>>> len(a)
5
>>> a[0]
'h'

可以使用for 循環來遍歷一個字符串內的字符:

a = 'hello'
for char in a:
    print char

2. 對字符串可以切片:

操作符[n:m] 返回字符從第n個字符到第m個字符的部分, 包含第n 個字符,但是不包括第m個字符。

>>> fruit = 'banana'
>>> fruit[1:3]
'an'
>>> fruit[:2]
'ba'
>>> fruit[3:]
'ana'

3. 操作符 in

in 是一個布爾操作符, 操作於兩個字符串上,如果第一個是第二個的子串,則返回True, 否則返回 False。

>>> 'yin' in 'yinheyi'
True

4. 字符串中的元素是不可以改變的;

第十章: 列表

1. 列表是一個序列, 在列表中,它的值可以是任何類型, 列表中值稱為元素;列表可以嵌套在一個列表中。

創建一個列表最簡單的方法使用[ ], 如: [10, 20, 40, ‘xiaoming’]

2. 使用 [] 操作符來訪問列表,  列表中的元素是可以變化的;

3. 遍歷一個列表,照樣可以使用for()循環;

for i in array:
    print i

4. 列表操作:

1) + 操作,可以用於拼接列表;

2) * 操作符,可以用於重復一個列表多次;

5. 從列表中刪除元素:

1)使用下標刪除:  pop 修改列表,返回被刪除的值,如果不提供下標,它會刪除並返回最后一個元素;

t = ['a', 'b', 'c']
print t.pop(1#輸出:b
print t
#輸出:['a', 'c']

2) 使用下標刪除, 不返回刪除的值,使用del操作符:

>>> t =[1, 2, 3, 4]
>>> del t[1]
>>> print t
[1, 3, 4]
>>> t =[1, 2, 3, 4]
>>> del t[1:3]
>>> print t
[1, 4]

3)如果知道刪除的元素,則可以使用remove:

>>> t = ['a', 'b', 'c', 'd', 'e']
>>> t.remove('d')
>>> print t
['a', 'b', 'c', 'e']

6. 把字符串轉化為列表:

1)轉換為單個單詞: 使用函數:list

>>> t = 'asdfas'
>>> print list(t)
['a', 's', 'd', 'f', 'a', 's']
2)轉換為一個個的單詞, 使用字符串的方法 split()
>>> t = 'hello world yinheyi'
>>> print t.split()
['hello', 'world', 'yinheyi']

7. 一個有趣的例子:

>>> a = 'aaa'
>>> b = 'aaa'
>>> a is b
True
>>> a = ['a', 'b', 'c']
>>> b = ['a', 'b', 'c']
>>> a is b
False

為什么會這樣子? 也沒有什么意思吧。。字符串是同一個對像, 而列表不是同一個對象,其實也很容易理解, 字符串不可以更改,而列表是可以更改的;

8. 很重要:別名

當我們使用賦值 b =a 時, 這兩個變量都會引用同一個對象,改變其中一個,必然會影響另一個,這個與C語言不同,因為C語言中,它們是兩個不同的對象;例子如下:

>>> a = [111, 222, 333]
>>> b = a
>>> b[0] = 444
>>> print a
[444, 222, 333]

9. 列表參數:

當我們將一個列表作為參數傳入到函數中時, 函數會得到列表的一個引用。 所以,在函數中修改了列表的話,對函數外也有影響;

 

這一章特別注意: 對於列表進行賦值,是得到了原來列表的一個引用, 是引用啊。要特別曲分修改列表還是新建了一個列表;

 

第十一章: 字典

1. 字典是一個鍵值對的組合, 

新建方法:使用內置函數 dict 新建一個不包含任何項的字典。添加元素的話,就可以如此操作:

>>> a = dict()
>>> a['first'] = 'yinheyi'
>>> print a
{'first': 'yinheyi'}

記住:字典中的各項順序是不可預料的,即不是確定的,因為本來就與順序無關,它使用鍵來查找對應的值。

函數 len : 它返回一個字典的鍵值對的數量;

函數 in : 它可以告訴一個指定的值是不是字典里面的鍵。

注意: in 操作符對於列表和字典使用不同的算法實現, 對於列表, 它使用搜索算法, 當列表變長時,搜索時間會隨之變長。 對於字典,python使用一個稱為  散列表 的算法, 不管字典中有多少項,in 操作符花費的時間都差不多。

2. 循環與字典:

如果在 for 循環中使用字典, 會遍歷字典的鍵。

3. 使用字典的備忘 來解決fibonacci 問題,真的可以提高效率啊:

 21 def fibonacci(n):
 22         if n in known:
 23                 return known[n]
 24 
 25         res = fibonacci(n-1) + fibonacci(n-2)
 26         known[n] = res
 27         return res

 

第十二章 元組

1. 元組是一個序列, 它與列表很相似,也按照整數下標索引. 它們之間的重要區別就是: 元組是不可變的;

新建一個元組的方法: 注意使用括號哦;

a = ('a', 'd', 'e')

也可以使用內建的函數 tuple 新建一個空元組:

t = tuple()

2. 作為返回值的元組:

在python中 ,函數只能返回一個值, 如何讓函數返回多個值呢?我們可以把一個元組當作函數的返回值,這樣的話,相當於函數返回多個值了;

def sb():                                                                   
  2         a = 1
  3         b = 2
  4         return a, b
  5 
  6 num = sb()
  7 print type(num)
#輸出:<type 'tuple'>

3.

第十四章 文件

1. 讀和寫

一個文件需要先打開,然后再進行讀與寫, 最后把打開的文件關閉。

#讀文件
>>> f = open('words.txt')
>>> print f
<open file 'words.txt', mode 'r' at 0x7fd74378e4b0>
>>> f.readline()
'aa\r\n'
>>> f.close()
# 寫文件
>>> f = open('sb.txt', 'w')
>>> print f
<open file 'sb.txt', mode 'w' at 0x7fd74378e540>
>>> line = "hello, world!\n"
>>> f.write(line)
>>> f.close()
>>> exit()

注意:要寫入一個文件,需要使用 ‘w’模式作為第二個實參開打開它。如果文件已經存在,則使用寫模式打開時會清除掉舊的數據並重新形如,所以特別注意啊。如果文件不存在,則新建一個。另外, write的參數是必須是字符串。

2,格式操作符

它與c語言中printf()里面的格式化字符串類似的,可以格式化輸出。 %d 用於格式化整數, %g 用於格式化小數,%s 用於格式化字符串。

當字符串中有一個格式序列時,

>>> print 'I have %d pens' % 12
I have 12 pens

當字符串中有多個字符序列時, 第十個操作對象就必須是元組。 並且每個格式序列按對應元組中的一個元素。

>>> print 'In %d years I have spotted %g %s.' % (3, 0.1, 'camels')
In 3 years I have spotted 0.1 camels.

3. 文件名與路徑

os模塊提供了用於操作文件和目錄的函數, 具體可以查看一下這個模塊的相關函數。

4. 捕獲異常

可以使用 try語句來捕獲一個異常,例子如下:

try:
        fin = open('1123.d')
        print '打開成功'
        fin.close()
except:
        print '沒有打開成功,可能文件不存在\n'

5. 數據庫: 模塊anydbm 提供了接口用於創建和更新數據庫的文件。 anydbm模塊的限制之一是鍵和值都是字符串,即它只能保存字符串。  pickle模塊可以把幾乎所有類型的對象轉換為適合保存到數據庫的字符串形式, 並可以將字符串轉換成為對象。 python將上面這兩個模塊封裝起來成為了一個模塊,叫做 shelve.

6. 管道  ( os.popen()現在已經廢止了,但是還沒有完全廢止)

任何在字符界面能啟動的程序都可以在python 中通過一個管道來啟動。 它的返回值和一個打開的文件差不多。

>>> cmd = 'ls -l'
>>> fp = os.popen(cmd)
>>> print fp.read()
總用量 1156
drwxrwxr-x 3 yinheyi yinheyi    4096 Sep 20 17:34 2048
-rwxrwxr-x 1 yinheyi yinheyi    8519 Oct 27 20:29 a.out
-rw-rw-r-- 1 yinheyi yinheyi      95 Oct 27 20:29 hello.c
-rw-rw-r-- 1 yinheyi yinheyi      75 Oct 31 14:26 hello.py
-rw-rw-r-- 1 yinheyi yinheyi     140 Oct 31 22:10 main.c
-rw-rw-r-- 1 yinheyi yinheyi     218 Oct 31 22:11 Makefile
-rw-rw-r-- 1 yinheyi yinheyi      14 Nov  1 09:52 sb.txt
-rw-rw-r-- 1 yinheyi yinheyi     214 Nov  1 10:17 sum.py
drwxrwxr-x 4 yinheyi yinheyi    4096 Sep 20 17:18 Tinyhttpd
-rw-rw-r-- 1 yinheyi yinheyi     423 Oct 31 20:13 turtle.py
-rw-rw-r-- 1 yinheyi yinheyi 1130523 Oct 31 16:43 words.txt

>>> print fp.close()

7. 編寫模塊:

我們可以把任何包含 pyhon 的代碼的文件都可以作為模塊導入。 里面定義了函數的話, 我們就可以調用它。

說明一點:為了模塊內的部分沒有必要的代碼被執行, 通常把這部分代碼寫入到如下模式中去:

if __name__ == '__main__':
    print 'hello, world!'
    ……

__name__ 是一個內置變量,當程序啟動時就會被設置, 程序作為腳本執行, __name__ 的值就是 __main__ ,此時, 下面代碼會被執行。當作為模塊被導入時, 這部分代碼就會被跳過。

 

第十五章 類和對象

這本書上,這一節講的實在太簡單表面了,,沒有什么可以作為筆記的;

 

第十六章 類和函數

1. 什么是純函數?一個函數它墜子返回一個值之外, 並不修改作為實參傳入的任何對象, 也沒有任何如顯示值或獲得用戶輸入之類的副作用。

2. 什么是修改器? 有時候用函數修改傳入的參數對象是很有用的。在這種情況下, 修改對調用者是可見的, 這樣工作的函數稱為修改器。

 

第十七章 類和方法

1. 對於寫在類內部的函數,我們把它稱為方法。

當我們調用一個方法時,直接使用主體與方法名稱就可以了,比如(xiaoming 是一個主體,而h1為一個方法名稱):

class hello(object):
    def h1():
        print 'hello, world!'
xiaoming = hello()
xiaoming.h1()

在方法中, 主體會被賦值到第一個形參上。 依慣來, 方法的互一個形參通常叫做 self。

2. 類的 init 方法

init 方法是一個特殊的方法,當對象初始化時會被調用。它的全名是 __init__。比如:

def __init__(self, hour = 0, minute = 0, second = 0):
    self.hour = hour
    self.minute = minute
    self.second = second

2. 類的 __str__方法

__init__也是一個特殊方法, 它用來返回對象的字符串的表達形式。當我們打印對象的結果時, python 會調用__str__方法。定義例如:

def __str__(self):
    return '%d %d %d' % (self.hour, self.minute, self.second)

3. 操作符重載

通過定義其它特殊方法, 我們可以為用戶定義類型的各種操作符指定的行為, 比如:當我們定義一個名為 __add__ 方法時, 則可以在時間對象上使用 + 操作符。  其它的操作符都有相應的特殊名字的方法。

4. 多態問題

書中沒有詳細說明,等着再參考其它的學習資料吧。

 

第18章 繼承


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM