python小白的一點筆記(1)
近日學習python。。感覺不學習不能應付現在的課程和未來的學習,一年半以前我就吼著要學習,直到現在被課業逼迫才有壓力趕緊學習。
1. Functions
"""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. 斐波拉契數列:
"""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作為最後想要返回的值的時候,可以同時給兩個變數賦值的時候,就會寫成,這個時候就要用 表示。
但是如果一次給一個變數賦值,那就是(因為這個是寫在所有賦值的最後一行),這時候就要引入新的變數,使得。
3. Higher-Order Functions:
def make_adder(n): """將這個函數的返回值定義成另一個函數""" def adder(k): """上一個確定了n,這裡僅僅與k有關""" return k + n return adder
我現在學習的時候一直把這個當成一個很經典的例子,每次做這種例題的時候都會想到這個例子。因為定義的函數make_adder它的return value跟1處的簡單函數返回的是確切的數值不一樣,它是返回到了一個函數。所以在終端輸入make_adder時,出現的是:
make_adder(5)仍然是一個函數,其實就是f =make_adder(5)。
4. summation & generalization:
4.1 summation:
比如說我想求一串數的和,比如:
一開始我的想法就是規規整整的給每一個想要求和的定義一個函數,比如下圖:
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變數是作為指示集合,代表加到了數列的第幾個。。但其實我這樣寫的不夠精簡,因為不需要引入這麼多變數:
def sum_naturals(n): k, b = 1, 0 while k <= n: b = b + k k = k + 1 return b
同理對剩下兩個求和也是一樣的寫法:
from operator import muldef con_squaresum(n): x, k = 0, 0 while k < n: k = k + 1 x = x + mul(k, k) return x
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項和,一個一個單獨計算未免浪費時間,代碼也不夠精簡。因為都是同樣的循環模式,僅僅是表達式子的差異。這時就可以引入一個新的函數:
於是將之前的函數更改成:
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
我現在自己是用make_adder來進行了改變。
【例題】定義一個函數same_length(a, b),判斷a,b的位數是否一樣:
左邊是老師給出的代碼,右邊是我自己寫的。老師的寫的更為簡單,雖然同樣是三個變數,但是老師的代碼在進入while循環之前只給一個變數進行了賦值,而我進行了兩個賦值。(感覺還是自己不夠熟練,總是會把括弧里的n作為自變數而單獨放到一邊,其他的操作都要用自己引入的變數= =)
4.2 generalization:
"""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:、
這裡好像講到了local frame和global frame 的差別,但我感覺可能是我學的不夠好,還不能夠好好的用文字表達。。又是一個坑。。。
6. iteration:
未完待續。。。
推薦閱讀:
※幺學聲課堂筆記vcd??2
※托福聽力高分必備技巧——筆記
※敢不敢換種活法? ——陳果11.19講座筆記
※幺學聲07年8月筆記3
※讀書筆記,讀《千年一嘆》