這裏我不評論 python 的一些有用的庫或許框架,只從言語自身,最小支撐的狀況下議論這門言語自身。言語的發展都是愈來愈接近Lisp,這也是Lisp這門言語巨大的緣由。html
下面我羅列一下我學習 python 的緣由:python
多編程範式
python是一門多範式的編程言語,所謂的進程式,面向目標和函數式的結合。程序員
大部分人接觸編程言語都是從進程式開端的,緣由是由於進程式的程序辦法與計算機運轉辦法是統一的,指令序列與運轉進程是統一的。如典型的C,我也是從C開端學習的,進程式的程序言語設計編寫程序較爲簡單,可是符合人機交互思考辦法。編程
python雖然是一門面向目標言語,就連「 」(空格)也可以看作是一個目標,可是python勝任進程式是沒有問題的。markdown
如不需求運用類的靜態辦法:閉包
1 def a_plus_b(a,b):
2 return a+b併發
Python在設計的時候將其做爲一門面向目標的辦法編寫,且不說面向目標給軟件設計帶來的一些革命等,在python這樣的動態言語中面向目標有一個亮點即是Duck typing(鴨子類型)。框架
關於鴨子類型,即是說,若是我認爲一個籠統的東西會游泳會「嘎嘎」叫,我就可以把它做爲鴨子。ide
1 def use_duck( Duck ):
2 Duck.swim()
3 Duck.gaga()
4
5 class Duck:
6 def swim(self):
7 ...
8 def gaga(self):
9 ...
若是這樣運用:函數式編程
1 little_duck = Duck()
2 use_duck( little_duck )
關於Duck類,你可以給他取任何的姓名,或許承繼它取另外一個姓名,只需求實現 swim() gaga() 你就可以把它做爲鴨子。
關於鴨子類型,不少人不瞭解爲何不需求供給一個接口來規定鴨子的行爲,我既不支撐也不反對,個人觀點是這樣的:
對於參數的查看,不符合動態言語的特性
供給了接口規範,那就不是鴨子類型了,直接叫多態得了
首先是lambda 演算。
函數式編程的定義是將函數看作是變量同樣的待遇,變量在程序中最簡單的有什麼待遇呢?
可以賦值
可以做爲參數
可以改動值(Erlang例外)
且不說生命週期了和做用域了
λ演算背後蘊含着計算機可計算性的深沉知識,lambda也是圖靈模型,是停機問題的一個否認答案,不單單是一個匿名函數那樣簡單。
關於 lambda 演算,看看這個程序作了什麼:
1 map(lambda n:2n,[1,2,3,4,5])
lambda n:2n 自身做爲一個匿名函數
lambda 自身做爲一個參數傳入 map()函數,這也即是說個人高階函數,可以將函數變身當作是一個變量做爲參數傳遞,這也是它做爲函數遭到的高等待遇
關於賦值和改動值,兩種辦法:
f = fun() 不改動函數情況,只改動名稱,可是說明函數是可以賦值的
可以運用閉包做爲改動函數的情況辦法,或許運用裝飾器來完成函數情況改動
函數式編程的運用也可以提升程序的可讀性和削減代碼,並且可以清晰的表達函數的功用,如MapReduce即是來自函數式編程的思想:
1 Map(func,List)
做用是將func 做用於List中的每個元素。
以剛纔的好比舉例:
1 map(lambda n:2*n,[1,2,3,4,5])
此函數返回
1 [2,4,6,8,10]
重要的是在於知道這樣的辦法帶給咱們的清晰的設計辦法。
固然函數式編程不是那麼幾句話就說完的,瞭解函數式編程的中心是瞭解 λ演算。
一些有意思的特性
看看完成一個斐波那契數列 python 可以怎麼作:
1 >>> def fib():
2 a , b = 0 ,1
3 while 1:
4 yield b
5 a , b = b ,a+b
6
7 >>> f = fib()
實際上由yield 生成了一個可迭代目標,每次調用f.next()就可以產生一個斐波那契值,而函數的內部情況是由迭代目標存儲的。至於返回一個可迭代目標,若是需求確認迭代到多少位,可以運用 itertools.islice。
協程也是一個基於yield的概念,首要的形式是微線程的協做式做業形式:
01 def coroutine(func):
02 def ret():
03 f = func()
04 f.next()
05 return f
06 return ret
07
08 @coroutine
09 def consumer():
10 print "Wait to getting a task"
11 while 1:
12 n = (yield)
13 print "Got %s",n
14
15 import time
16 def producer():
17 c = consumer()
18 while 1:
19 time.sleep(1)
20 print "Send a task to consumer"
21 c.send("task")
22
23 if name == "main":
24 producer()
協程帶來的好處是可以直接調度你的線程,這也是它爲何叫作協程而不是線程的緣由,線程屬於搶佔式併發,協程屬於協做式併發。
動態言語帶來的好處
從程序設計帶來的快感(我相信只要酷愛這方面的人才有的感受)來講,動態言語,好比python,節約了更多的時刻可以用來陪女友或許老婆,或許老公。
固然,做爲互聯網時代快速開發來講,趕鴨子上線,也是《***與畫家》上面介紹的,快速開發很重要,固然需求符合這方面的需求。
動態言語的CPU密集型運算一定比不過C/C++。
總之:人生苦短,我用python。