標籤:

python小白的一點筆記(1)

python小白的一點筆記(1)

近日學習python。。感覺不學習不能應付現在的課程和未來的學習,一年半以前我就吼著要學習,直到現在被課業逼迫才有壓力趕緊學習。

1. Functions

Fig 1

"""first python source file."""from operator import floordiv, moddef divide_exact(n, d) return floorinv(n, d), mod(n, d)q, r = divide_exact(2013, 10)

2. 斐波拉契數列:

Fig 2

"""fib"""def fib(n): pred, curr = 1, 0 k = 0 print(curr) while k < n: pred, curr = curr, curr + pred k = k + 1 print(curr) return curr print(curr)def fib(n): k, a, b, c = 0, 1, 0, 1 while k < n: c = a a = b b = b + c k = k + 1 return b

上面的是顯示出斐波拉契數列前n位數字,下面的只顯示出第n位

但最主要的區別在於上面在賦值的時候pred和curr這個變數是同時賦值的,而我若想一行只能給一個變數賦值的時候,這樣就需要在原來的基礎上增加一個變數,也就變成了下面的這種寫法。

對於現在學的循環(本菜鳥剛起步的,比較簡單的循環),我都是寫成數列的形式。

比如說fib數列的關係就是b_{n+1}=b_{n}+b_{n-1} , 那我把b作為最後想要返回的值的時候,可以同時給兩個變數賦值的時候,就會寫成b_{n+1}=b_{n}+a_{n},這個時候就要用a_{n} 表示b_{n-1}

但是如果一次給一個變數賦值,那就是b_{n+1}=b_{n}+a_{n+1}(因為這個是寫在所有賦值的最後一行),這時候就要引入新的變數c_{n},使得a_{n+1}=c_{n}=b_{n-1}

3. Higher-Order Functions:

Fig 3

def make_adder(n): """將這個函數的返回值定義成另一個函數""" def adder(k): """上一個確定了n,這裡僅僅與k有關""" return k + n return adder

我現在學習的時候一直把這個當成一個很經典的例子,每次做這種例題的時候都會想到這個例子。因為定義的函數make_adder它的return value跟1處的簡單函數返回的是確切的數值不一樣,它是返回到了一個函數。所以在終端輸入make_adder時,出現的是:

Fig 4

make_adder(5)仍然是一個函數,其實就是f =make_adder(5)。

4. summation & generalization:

4.1 summation:

比如說我想求一串數的和,比如:

1 + 2 + …… +n= ?

1^{2} + 2^{2} +…… + n^{2} = ?

sum_{k=1}^{n}{frac{8}{(4k-1)(4k-3)}} = ?

一開始我的想法就是規規整整的給每一個想要求和的定義一個函數,比如下圖:

Fig 5

def con_sum(n): a, b = 0, 0 k = 0 while k < n: a = a + 1 b = a + b k = k + 1 return b

這是我一開始的寫法,a/b變數是用來循環賦值的,然後用k變數是作為指示集合,代表加到了數列的第幾個。。但其實我這樣寫的不夠精簡,因為不需要引入這麼多變數:

Fig 6

def sum_naturals(n): k, b = 1, 0 while k <= n: b = b + k k = k + 1 return b

同理對剩下兩個求和也是一樣的寫法:

Fig 7

from operator import muldef con_squaresum(n): x, k = 0, 0 while k < n: k = k + 1 x = x + mul(k, k) return x

Fig 8

from operator import truedivdef de_sum(n): y, k = 0, 0 while k < n: k = k + 1 y = y + truediv(truediv(8, 4 * k - 3), 4 * k - 1) return y

但是如果我們是需要同時計算這三個數列的前n項和,一個一個單獨計算未免浪費時間,代碼也不夠精簡。因為都是同樣的循環模式,僅僅是表達式子的差異。這時就可以引入一個新的函數:

Fig 9

於是將之前的函數更改成:

Fig 10

def identity(k): return kdef cube(k): return pow(k, 3)def summation(n, term): """計算前n項的和""" total, k = 0, 1 while k <= n: total, k = total + term(k), k + 1 return total def sum_naturals(n): return summation(n, identity)def sum_cubes(n): return summation(n, cube)

但這個時候我們只更改了前兩個函數,對最後數列是分式形式的還沒有進行操作,因為term的表達式按照目前的函數/以及所擁有的信息來說,還不能夠得到精簡的表達。於是,我們又接著做下一步改進工作,這時候就要用到Fig 3所定義的那個函數啦:make_adder

Fig 11

我現在自己是用make_adder來進行了改變。

【例題】定義一個函數same_length(a, b),判斷a,b的位數是否一樣:

Fig 12.1

Fig 12.2

左邊是老師給出的代碼,右邊是我自己寫的。老師的寫的更為簡單,雖然同樣是三個變數,但是老師的代碼在進入while循環之前只給一個變數進行了賦值,而我進行了兩個賦值。(感覺還是自己不夠熟練,總是會把括弧里的n作為自變數而單獨放到一邊,其他的操作都要用自己引入的變數= =)

4.2 generalization:

Fig 13

"""generalization"""from math import pi, sqrtdef area(r, shape_constant): assert r > 0, a length must be positive return r * r * shape_constantdef area_square(r): return area(r, 1)def area_circle(r): return area(r, pi)def area_hexagon(r): return area(r, 3 * sqrt(3) / 2)

這裡舉了計算面積的例子,其實我覺得和上面summation的思想是一致的,都是具有相同的計算方法,只是存在一些參數或者表達形式的差異,所以完全可以找一個通用的模式來進行generalization。

這裡提到了assert,目前還沒有具體的學到,留一個坑。。。

5. higher-order functions:、

Fig 14

Fig 15

Fig 16

Fig 17 nested

這裡好像講到了local frameglobal frame 的差別,但我感覺可能是我學的不夠好,還不能夠好好的用文字表達。。又是一個坑。。。

6. iteration:

Fig 18

Fig 19

未完待續。。。


推薦閱讀:

幺學聲課堂筆記vcd??2
托福聽力高分必備技巧——筆記
敢不敢換種活法? ——陳果11.19講座筆記
幺學聲07年8月筆記3
讀書筆記,讀《千年一嘆》

TAG:筆記 | 科技 |