引言:學習python近兩年,談談我對於python的一點小理解,也從一些方面談談自己微薄的想法,也就是我為什麼學習python
這裡我不討論python的一些有用的庫或者框架,只從語言本身,最小支援的情況下談論這門語言本身。
語言的發展都是越來越接近lisp,這也是這門語言偉大的原因。
下面我羅列一下我學習python的原因:
一.多程式設計正規化
python是一門多正規化的程式語言,所謂的過程式,物件導向和函式式的結合。
大部分人接觸程式語言都是從過程式開始的,原因是因為過程式的程式方式與計算機執行方式是統一的,指令序列與執行過程是統一的
如典型的c,我也是從c開始學習的,過程式的程式語言設計編寫程式較為簡單,但是符合人機互動思考方式。
python雖然是一門物件導向語言,就連「 」(空格)也可以看做是乙個物件,但是python勝任過程式是沒有問題的。
如不需要使用類的靜態方法:
defa_plus_b(a,b):
return a+b
python在設計的時候將其當做一門物件導向的方式編寫,且不說物件導向給軟體設計帶來的一些革命等,在python這樣的動態語言中物件導向有乙個亮點就是duck typing(鴨子型別)
關於鴨子型別,就是說,如果我認為乙個抽象的東西會游泳會「嘎嘎」叫,我就可以把它當做鴨子。
defuse_duck( duck ):
duck.swim()
duck.gaga()
class
duck:
defswim(self):
...def
gaga(self):
...
如果這樣使用
little_duck = duck()use_duck( little_duck )
關於duck類,你可以給他取任何的名字,或者繼承它取另乙個名字,只需要實現 swim() gaga() 你就可以把它當做鴨子
關於鴨子型別,很多人不理解為什麼不需要提供乙個介面來規定鴨子的行為,我既不支援也不反對,我的觀點是這樣的:
1.對於引數的檢查,不符合動態語言的特性
2.提供了介面規範,那就不是鴨子型別了,直接叫多型得了
關於python支援的函式式程式設計
首先是lambda 演算
函式式程式設計的定義是將函式看做是變數一樣的待遇,變數在程式中最簡單的有什麼待遇呢
1.可以賦值
2.可以作為引數
3.可以改變值(erlang例外)
4.且不說生命週期了和作用域了
λ演算背後蘊含著計算機可計算性的深厚知識,lambda也是圖靈模型,是停機問題的乙個否定答案。不僅僅是乙個匿名函式那樣簡單
關於lambda 演算,看看這個程式做了什麼
map(lambda n:2*n,[1,2,3,4,5])
1.lambda n:2*n 本身作為乙個匿名函式
2.lambda 本身作為乙個引數傳入 map()函式 ,這也就是說我的高階函式,可以將函式變身看成是乙個變數作為引數傳遞,這也是它作為函式受到的高等待遇
關於賦值和改變值,兩種方式:
1.f = fun() 不改變函式狀態,只改變名稱,但是說明函式是可以賦值的
2.可以使用閉包作為改變函式的狀態方式,或者使用裝飾器來完成函式狀態改變
函式式程式設計的使用也可以提高程式的可讀性和減少**,而且能夠清晰的表達函式的功能,如mapreduce就是來自函式式程式設計的思想
map(func,list)
作用是將func 作用於list中的每乙個元素
以剛才的例子舉例
map(lambda n:2*n,[1,2,3,4,5])
此函式返回
[2,4,6,8,10]
重要的是在於知道這樣的方式帶給我們的清晰的設計方式
當然函式式程式設計不是那麼幾句話就說完的,理解函式式程式設計的核心是理解 λ演算
二.一些有意思的特性
惰性計算:
看看完成乙個斐波那契數列python 可以怎麼做:
>>> deffib():
a , b = 0 ,1
while 1:
yield
b a , b = b ,a+b
>>> f = fib()
實際上由yield 生成了乙個可迭代物件,每次呼叫
f.next()就可以產生乙個斐波那契值,而函式的內部狀態是由迭代物件儲存的
至於返回乙個可迭代物件,如果需要確定迭代到多少位,可以使用 itertools.islice
協程:協程也是乙個基於yield的概念,主要的模式是微執行緒的協作式工作模式:
1defcoroutine(func):
2def
ret():
3 f =func()
4f.next()
5returnf6
return
ret789
10@coroutine
11def
consumer():
12print
"wait to getting a task"13
while 1:
14 n = (yield)15
"got %s",n
1617
1819
import
time
20def
producer():
21 c =consumer()
22while 1:
23 time.sleep(1)
24print
"send a task to consumer
"25 c.send("
task")
2627
if__name__ == "
__main__":
28 producer()
協程帶來的好處是可以直接排程你的執行緒,這也是它為什麼叫做協程而不是執行緒的原因,執行緒屬於搶占式併發,協程屬於協作式併發
三.動態語言帶來的好處
從程式設計帶來的快感(我相信只有熱愛這方面的人才有的感覺)來說,動態語言,比如python,節約了更多的時間可以用來陪女朋友或者老婆,或者老公
當然,作為網際網路時代快速開發來說,趕鴨子上線,也是《黑客與畫家》上面介紹的,快速開發很重要,當然需要符合這方面的需求
動態語言的cpu密集型運算必然比不過c/c++
總之:人生苦短,我用python
我為什麼要學習python
引言 學習python近兩年,談談我對於python的一點小理解,也從一些方面談談自己微薄的想法,也就是我為什麼學習python 這裡我不討論python的一些有用的庫或者框架,只從語言本身,最小支援的情況下談論這門語言本身。語言的發展都是越來越接近lisp,這也是這門語言偉大的原因。下面我羅列一下...
我為什麼要學習python程式設計?
為什麼要學習python程式設計?在開始學習之前,不只是身邊的朋友也在問,更多的是自己內心也不斷的問,為什麼要學習python程式設計,僅僅是為了了解,如果是為了了解上網一天的功夫就能了解個大概。當那天在群裡看到乙個朋友用程式幫助業務提高效率,做出乙個 來,大大提高了業務的效率,節省了很多時間和麻煩...
我為什麼要學習?
我為什麼要學習?為了更聰明,更有邏輯,更能看透本質。學習什麼?人工智慧演算法,統計學,數學。用來幹什麼?1 對眼前工作。更準且穩的分類模型,是可以帶來直接經濟效益的。有利於公司業務。更具體是,1 歸一化原始資料練乙個邏輯回歸。2 從準確率召回率圖,重新分箱。2 我的長期目標。假如我到了乙個,真正大業...