為什么推薦學Python

這篇文章將為大家詳細講解有關(guān)為什么推薦學Python,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

10年積累的成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有大余免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

習慣了靜態(tài)語言,當年覺得C++就是不二選擇了。我的觀點也一直很明確:作為一位專業(yè)的程序員,第一門應(yīng)該精通的語言是C,接著應(yīng)該掌握匯編語言,之后再學什么語言都可以融會貫通。

然而自從接觸了JavaScript這種動態(tài)語言,才猛然發(fā)現(xiàn)靜態(tài)語言的不足,并轉(zhuǎn)向這個更為美麗的陣營。

動態(tài)語言有這幾種:JavaScript、Python、Ruby和Lua,而Python則是唯一推薦的。

這并不是說其他的語言不好,而是說如果你只想學一門語言,那么Python就是最好的選擇。

首先看下比較泛泛而談的方面:

快速上手。Python的書籍非常多,文檔也很詳細,大多數(shù)模塊都配有例子。我不知道初學編程的人要多久才能掌握Python,但我只用了半天就掌握了大部分Python的語法。你完全可以在等公交或擠地鐵時學會Python。

用途廣泛。如果不考慮性能,你幾乎可以用Python做任何事,包括系統(tǒng)編程、數(shù)據(jù)庫、應(yīng)用軟件、游戲、WEB應(yīng)用等等。

平臺無關(guān)。從嵌入式設(shè)備到幾十年前的大型機上你都能找到Python,它支持的平臺甚至多于Java。

模塊眾多。無論你是想操作數(shù)據(jù)庫,還是想進行音樂、圖像處理,或者處理文字編碼解碼,Python都在標準庫里為你提供了。而且不但標準庫不遜于Java,就連第三方庫的數(shù)量也沒有哪門語言可以比得上,并且這些庫大多是開源和免費的。

使用方便,無需編譯。打開命令行,敲入Python就能在控制臺直接執(zhí)行Python語句了。用文本編輯器編輯一個.py文件,編寫完雙擊它就能運行了。在構(gòu)建較大的應(yīng)用時會節(jié)約很多時間,即便是Java這種語言,在打個par或war包時,仍然需要幾分鐘的編譯和構(gòu)建時間。

代碼簡短,容易閱讀。由于內(nèi)置了眾多實用的類型,合理的操作符重載,以及各種語法特性和庫的支持,實現(xiàn)同樣的事,Python幾乎總比絕大部分語言少寫很多代碼。

面向?qū)ο蟆?/strong>如今大多數(shù)語言都已在語法層面上支持面向?qū)ο罅?,所以這或許算不上什么。只是想和Ruby擁護者強調(diào)一下,Python同樣也是純面向?qū)ο蟮恼Z言。Python里所有你能看到的東西,全都是對象,包括1、2、3這種字面量,甚至代碼和棧幀。至于Python里有函數(shù),所以不是純面向?qū)ο蟮倪@種說法也是站不住腳的:因為函數(shù)也是對象,一個函數(shù)調(diào)用就是將0到多個對象傳遞給函數(shù)對象的__call__方法的過程,難道非得加個小數(shù)點才叫面向?qū)ο螅?/p>

接著看看一些值得一提的特性:

支持長整數(shù)類型,長度只受限于虛擬內(nèi)存的大小。

例如123的321次方:

>>> 123 ** 321
72367033806371673149109894141163778628811792657571658906010558390395870363798401
74409528068615550773640492165707028496172182896059297790954263709889769722310262
26285667876540913278254539915951402057014129613641887324089361978905536997158369
51569999800431957769217006743321026257517932764164662319487914962533302741368207
21118949461532655279066772041128547416263676516890721192413497337430449601963537
66658585599417357039248364677569172479954695834874677915245821537445221075978652
77798136080074161485280424274076931083994487111719562249702540362855712911132265
96623575435535351670333904300150611852076035957773786947201861794212059087317071
0805078696371738906375721785723L

支持連續(xù)比較。

>>> 10 > 5 > 3
True
>>> 10 < 15 > 3
True
>>> 10 > 2 < 3
True

快速生成列表。

例如0~100之間所有的奇數(shù):

>>> range(1, 100, 2)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41,
43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81,
83, 85, 87, 89, 91, 93, 95, 97, 99]

列表支持切片操作。

>>> x = range(20, 0, -1)
>>> x
[20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> x[8:] # 生成x的第8到最后一個元素的列表
[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> x[:8] # 生成x的第0到第8個(不包含第8)元素的列表
[20, 19, 18, 17, 16, 15, 14, 13]
>>> x[:-8] # 生成x的第0到倒數(shù)第8個元素的列表
[20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9]
>>> x[8:-8] # 生成x的第8到倒數(shù)第8個元素的列表
[12, 11, 10, 9]
>>> x[::2] # 從x中每隔1個數(shù)生成的列表
[20, 18, 16, 14, 12, 10, 8, 6, 4, 2]
>>> x[8:-8:2] # x的第8到倒數(shù)第8個元素中,每隔1個數(shù)生成的列表
[12, 10]

元組可以自動打包和解包。

>>> a, b = 1, 2
>>> a
1
>>> b
2
>>> a, b = b, a
>>> a
2
>>> b
1
>>> def f():
...   return 3, 4 # 函數(shù)可以返回多個值,實際上也是元組
...
>>> a, b = f()
>>> a
3
>>> b
4
>>> a = f()
>>> a
(3, 4)

強大的for循環(huán)讓大多數(shù)情況下無需處理循環(huán)索引。

例如計算0~100的奇數(shù)和:

>>> s = 0
>>> for i in range(1, 100, 2):
...   s += i # 每次迭代,i都會被賦予下一個值
...
>>> s
2500

還可以同時獲得多個迭代值:

>>> x = (((1, 2), 3),)
>>> x *= 5
>>> x
(((1, 2), 3), ((1, 2), 3), ((1, 2), 3), ((1, 2), 3), ((1, 2), 3))
>>> for (i, j), k in x:
...   s += (i + j + k)
...
>>> s
30

可用zip函數(shù)同時迭代2個列表。

>>> a = range(5)
>>> b = range(5, 10)
>>> zip(a, b)
[(0, 5), (1, 6), (2, 7), (3, 8), (4, 9)]
>>> for x, y in zip(a, b):
...   print x + y,
...
5 7 9 11 13

支持lambda函數(shù)。(不過不如Lisp的簡潔,也沒有JavaScript的匿名函數(shù)強大,更不如Ruby的block優(yōu)雅)

>>> f = lambda x: 2 * x
>>> f(3)
6
>>> (lambda x: 2 * x)(3)
6
>>> map(lambda x: 2 * x, range(10))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>> filter(lambda x: x % 2, range(10))
[1, 3, 5, 7, 9]
>>> reduce(lambda x, y: x * y, range(1, 10))
362880

列表解析可以省略很多for循環(huán)、map和filter函數(shù)。

>>> [str(i) for i in range(10)]
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> [i * i for i in range(20) if i % 2 and i % 3 ]
[1, 25, 49, 121, 169, 289, 361]
>>> [i * j for i in range(5) for j in range(5, 10)]
[0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 15, 18, 21, 24, 27, 20, 24, 2
8, 32, 36]
>>> [i * j for i in range(5) for j in range(5) if i > j]
[0, 0, 2, 0, 3, 6, 0, 4, 8, 12]

支持缺省參數(shù),且缺省參數(shù)位置隨意。

>>> def f(a, b=1, c=2):
...   return a + b + c
...
>>> f(1)
4
>>> f(1, 2)
5
>>> f(1, c=5)
7
>>> f(1, c=5, b=9)
15
>>> f(c=5, a=8, b=9)
22

支持參數(shù)列表和參數(shù)字典。

>>> def f(a, b=1, c=2):...   return a + b + c...>>> args = [9, 8, 7]>>> f(*args)
24
>>> kwargs = zip(['a', 'b', 'c'], args)
>>> kwargs
[('a', 9), ('b', 8), ('c', 7)]
>>> kwargs = dict(kwargs)
>>> kwargs
{'a': 9, 'c': 7, 'b': 8}
>>> f(**kwargs)
24
>>> f(9, *[8], **{'c': 7})
24
>>> a = (0, 1, 2, 3, 4)
>>> b = (5, 6, 7, 8, 9)
>>> zip(a, b)
[(0, 5), (1, 6), (2, 7), (3, 8), (4, 9)]
>>> zip(*zip(a, b))
[(0, 1, 2, 3, 4), (5, 6, 7, 8, 9)]
>>> c, d = zip(*zip(a, b))
>>> c # 等于a
(0, 1, 2, 3, 4)
>>> d # 等于b
(5, 6, 7, 8, 9)

支持閉包和高階函數(shù)。

>>> def f(x):
...   return  x + 1
...
>>> def g(func):
...   def wrap(x):
...     return func(x) * 2
...   return wrap
...
>>> h = g(f)
>>> h(2)
6
>>> @g
... def a(x):
...   return x + 1
...
>>> a(2)
6

對象的屬性和方法可以動態(tài)改變:

>>> class A(object):
...   def __init__(self, x):
...     self.x = x
...
>>> a = A(10)
>>> a.x
10
>>> a.y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'y'
>>> a.y = 5
>>> a.y
5
>>> del a.x
>>> a.x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'x'
>>> def f(self):
...   return 10
...
>>> A.x = f
>>> a.x()
10

對象的類型可以動態(tài)改變。

>>> class A(object):
...   def __init__(self, x):
...     self.x = x
...   def y(self):
...     return self.x * 2
...
>>> class B(object):
...   def __init__(self, x):
...     self.x = x
...   def y(self):
...     return self.x / 2
...
>>> x = A(10)
>>> x.y()
20
>>> x.__class__ = B
>>> x.y()
5

其他雖然還有很多優(yōu)點,為了公平起見,把部分缺點也列出。

性能不出色。比起靜態(tài)語言要差很多,但是在動態(tài)語言里表現(xiàn)尚可,至少不遜色于Ruby和PHP。

要追求性能,就不得不以C來重寫這些實現(xiàn);但好在絕大部分Python程序員不需要做這種事,也有較為方便的工具可以將Python(的一個變種)轉(zhuǎn)換成C實現(xiàn),并編譯成機器語言。

不支持switch...case結(jié)構(gòu),只能以傳統(tǒng)的if...elif...else來實現(xiàn)。

不過Ruby雖說支持switch...case,但我估計內(nèi)部實現(xiàn)也是if...elif...else(未考證)。

沒有抽象類和接口,對象靠實現(xiàn)特殊的屬性和方法來實現(xiàn)一個接口,但書寫很麻煩(前后2個下劃線)。

私有屬性不是真正的私有(可以通過特殊的辦法訪問),且沒有保護和包訪問方式。

實例方法不能省略第一個self參數(shù),內(nèi)部也得使用“self.屬性名”的方式來訪問屬性。

這主要是因為Python的方法實現(xiàn)很奇特,實例方法、類方法和靜態(tài)方法是用相同的機制實現(xiàn)的,這在部分情況下提供了便利。

不支持多行注釋。只能靠編輯器來幫忙了。

內(nèi)部函數(shù)不能改變外部函數(shù)的命名空間,包括賦值和刪除。Python 2.x只能將其提升為global變量來解決,而Python 3.x者可以使用nonlocal。

Python 3.x與Python 2.x不兼容,而大部分的庫只支持Python 2.x,會導(dǎo)致初學者不知道該學哪個版本。

關(guān)于為什么推薦學Python就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

網(wǎng)頁標題:為什么推薦學Python
標題URL:http://bm7419.com/article38/goecsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航品牌網(wǎng)站制作、企業(yè)建站微信公眾號、網(wǎng)站收錄、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)