http://www.thinksaas.cn/group/topic/350780/
作為一門計(jì)算機(jī)語言來說帝璧,Python會(huì)有下面的特點(diǎn)。
語言學(xué)習(xí)起來容易
解決生活中的實(shí)際問題
支持多學(xué)科
我們可以和其他不是腳本語言的語言進(jìn)行一個(gè)簡(jiǎn)單的對(duì)比纸颜,如C,你需要去編譯去運(yùn)行绎橘,有時(shí)候還需要解決跨平臺(tái)問題胁孙,本來你是在你的Windows上運(yùn)行得好好的,但是有一天你換了一個(gè)Mac電腦的時(shí)候称鳞,問題變得很棘手涮较,你甚至不知道怎么去解決問題。我沒有用過MFC冈止,聽說很方便狂票,但是在其他平臺(tái)下就沒有一個(gè)好的解決方案。這里可能跑得有點(diǎn)遠(yuǎn)靶瘸,但是不同的用戶可能在不同的平臺(tái)上苫亦,這也就是腳本語言的優(yōu)勢(shì)所在了。
代碼與散文
你可能聽過怨咪,也可能了解過屋剑,不過在這里我們可能不會(huì)去講述那些基礎(chǔ)的語法的東西,我們想說的是代碼格式的重要性诗眨,在html中你可以這樣去寫你的代碼
htmlThis is a Title
flakjfaklfjalfa
又或者是js的minify唉匾,它可能會(huì)使你的代碼看起來像是這樣的:
javascriptfunction NolTracker(b,a){this.pvar=b;this.mergeFeatures(a)}
可能的是如果是python的話,你可能會(huì)遇到下面的問題匠楚。巍膘。
bashFile"steps.py", line 10
try:
^
IndentationError: expected an indented block
如果你對(duì)JSLint、Lint這類的工具有點(diǎn)印象的話芋簿,你也可以認(rèn)為python集成了這類工具峡懈。整潔的代碼至少應(yīng)該看上去要有整潔的衣服,就好像是我們看到的一個(gè)人一樣与斤,而后我們才會(huì)有一個(gè)好的印象肪康。更主要的一點(diǎn)是代碼是寫給人看的荚恶,而衣服更多的時(shí)候?qū)τ谙裎疫@樣的人來說,他首先應(yīng)該是要保暖的磷支,其次對(duì)于一個(gè)懶的人來說谒撼。。雾狈。
程序應(yīng)該是具有可讀性的短文廓潜,它將在計(jì)算機(jī)上執(zhí)行,從而解決某些問題
我們需要去讀懂別人的代碼善榛,別人也需要去讀懂我們的代碼辩蛋。計(jì)算機(jī)可以無條件地執(zhí)行你那未經(jīng)編排過的程序,但是人就不是如此了移盆。
javascriptvar calc={add: function(a,b){return a+b;},sub: function(a,b){return a-b;},dif: function(a,b){if(a>b){return a;}else{return b;}}}
上面的代碼相對(duì)于下面的代碼可讀性沒有那么多堪澎,但是計(jì)算機(jī)可以無條件地執(zhí)行上面的代碼。上面的代碼對(duì)于網(wǎng)絡(luò)傳輸來說是好的味滞,但是對(duì)于人來說并不是如此,我們需要一些工具來輔助我們?nèi)プx懂上面的代碼钮呀。如果代碼上寫得沒有一點(diǎn)可讀性剑鞍,諸如函數(shù)命名沒有多少實(shí)際意義,如果我們把前面的函數(shù)就成這樣:
javascriptvar c={
a: function(a,b){
return a+b;
},
s: function(a,b){
return a-b;
},
d: function(a,b){
if(a>b){
return a;
}else{
return b;
}
}
}
那么只有在我們理解了這個(gè)函數(shù)是干什么之后才能理解函數(shù)是干什么爽醋,而不是光看函數(shù)名就可以了蚁署。
在Javascript解決一個(gè)函數(shù)的辦法有很多,在其他一些語言如Ruby或者Perl中也是如此蚂四,解決問題的辦法有很多光戈,對(duì)于寫代碼的人來說是一個(gè)享受的過程,但是對(duì)于維護(hù)的人來說并非如此遂赠。而這個(gè)和Python的思想不是很一致的是久妆,Python設(shè)計(jì)的理念是
對(duì)于特定的問題,只要有一種最好的方法來解決就夠了
可讀性的代碼在今天顯得比以前重要的多跷睦,以前寫程序的時(shí)候我們需要去考慮使用匯編或者其他工具來提高程序的效率筷弦。
.global _start
.text
_start:
# write(1, message, 13)
mov $1, %rax # system call 1 is write
mov $1, %rdi # file handle 1 is stdout
mov $message, %rsi # address of string to output
mov $13, %rdx # number of bytes
syscall # invoke operating system to do the write
# exit(0)
mov $60, %rax # system call 60 is exit
xor %rdi, %rdi # we want return code 0
syscall # invoke operating system to exit
message:
.ascii"Hello, worldn"
所以上面的代碼的可讀性在今天新生一代的程序員來說可能沒有那么容易理解。芯片運(yùn)行的速度越來越快抑诸,在程序上我們也需要一個(gè)越來越快的解決方案烂琴,而所謂的越來越快的解決方案指的不是運(yùn)行速度上,而是開發(fā)速度上蜕乡。如果你沒有辦法在同樣時(shí)間內(nèi)開發(fā)出更好的程序奸绷,那么你就可能輸給你的競(jìng)爭(zhēng)對(duì)手。
開始之前
我們終于又從一種語言跳到了另外一種語言层玲,我們可能習(xí)慣了一種模式号醉,而不敢于去嘗試新的東西反症,這些或許是我們的一些習(xí)慣又或者是因?yàn)楹ε碌鹊取?/p>
作為另外一個(gè)跨平臺(tái)能力很強(qiáng)的語言,這里說的是與Javascript扣癣、HTML比較惰帽,或許你會(huì)覺得C算是最好的,但是我們這里討論更多的是腳本語言父虑,也就是直接可以運(yùn)行的该酗。在現(xiàn)在主流的大多數(shù)移動(dòng)平臺(tái)上,python也有良好的支持士嚎,如Android,IOS呜魄,只是這些算是類Unix系統(tǒng)內(nèi)核,python還支持之前Nokia的Symbian莱衩。
開始之前我們需要確認(rèn)我們的平臺(tái)上已經(jīng)有了python環(huán)境爵嗅,也就是可以運(yùn)行下面的Hello,World,你可以在網(wǎng)上很多地方看到笨蚁,最簡(jiǎn)單的地方還是到官網(wǎng)睹晒,又或者是所用移動(dòng)平臺(tái)的store下載。
Python的Hello,World
Python的Hello,World有兩種形式括细,作為一種腳本語言來說伪很,Javascript也是一種腳本語言,只是兩者之間有太多的不同之處奋单,每個(gè)人都會(huì)有不同的選擇對(duì)于一種語言用來作為其的習(xí)慣锉试。于是這就是我們的
print"Hello,World"
當(dāng)我們把我們的腳本在shell環(huán)境下運(yùn)行時(shí)
bash>>> print"Hello,world"
File"", line 1
print"Hello,world"
^
IndentationError: unexpected indent
>>> print"Hello,world"
Hello,world
>>>
如果你沒有預(yù)料到縮進(jìn)帶來的問題的時(shí)候,這就是一個(gè)問題了览濒。
和我們?cè)贘avascript或者是CSS里面一樣呆盖,我們也可以用一個(gè)文件的方式來寫入我們的代碼,文件后綴名是py贷笛,所以創(chuàng)建一個(gè)helloworld.py应又,輸入上面的代碼,然后執(zhí)行
python helloworld.py
一個(gè)理想的結(jié)果昨忆,或許你試過C語言的helloworld丁频,如果了解過GCC的話應(yīng)該是可以這樣的:
./a.out
也就是執(zhí)行編譯完后的程序,需要注意的是helloworld.py沒有編譯邑贴,不過也會(huì)輸出
Hello,world
我們想要的Hello,World
我們想展示的是如何結(jié)合前面學(xué)習(xí)的內(nèi)容做一個(gè)更有意思的Hello,World席里。
pythonimport cherrypy
class HelloWorld(object):
def index(self):
return"Hello World!"
index.exposed = True
cherrypy.quickstart(HelloWorld())
算法
我們需要去了解算法(algorithm),引經(jīng)據(jù)典的話就是這樣子:
a process or set of rules to be followed in calculations or other problem-solving operations, especially by a computer
也就是計(jì)算或其他解決問題的操作需要遵循的一個(gè)過程或者一套規(guī)則拢驾,書上還提到的說法是——解決問題的訣竅奖磁,讓我想起了hack一詞。我們總會(huì)去想某些東西是否有一個(gè)更快的計(jì)算方法繁疤,有時(shí)候在處理某些問題上也顯示了一個(gè)好的算法的重要性咖为。
實(shí)用主義哲學(xué)
(來自于:HyryStudio)
大多數(shù)工程師秕狰、科學(xué)家使用科學(xué)計(jì)算軟件的目的都是為了快速解決其工作中遇到的問題,而不是開發(fā)出一套完整的軟件躁染。這就是為什么MATLAB這樣的商用科學(xué)計(jì)算軟件十分流行的原因鸣哀。而Python在這一點(diǎn)上實(shí)際上和MATLAB十分相似,我們也可以使用Python眾多的擴(kuò)展庫快速寫出一次性的數(shù)據(jù)處理吞彤、運(yùn)算的腳本我衬。然而由于Python語言的一些高級(jí)特性,以及眾多的科學(xué)計(jì)算之外的擴(kuò)展庫饰恕,我們可以將積累下來的一次性腳本進(jìn)行改造挠羔,為它們提供命令行、GUI埋嵌、數(shù)據(jù)庫破加、網(wǎng)絡(luò)等眾多接口,最終成為一套完整的工具包或者實(shí)用的計(jì)算軟件雹嗦。而且由于是開源的自由軟件范舀,我們可以在任何系統(tǒng)中安裝Python環(huán)境,運(yùn)行我們 的程序了罪。
Python一直保持著很強(qiáng)的實(shí)用主義尿背,它通常不會(huì)去試著重新開發(fā)一整套函數(shù)庫,而是將現(xiàn)有的開源函數(shù)庫包裝成其擴(kuò)展庫捶惜。而Python則通過這些擴(kuò)展庫將眾多的開源函數(shù)庫連接在一起,是名符其實(shí)的膠水語言荔烧。例如由華盛頓大學(xué)的教授主導(dǎo)開發(fā)的 Sage 吱七,就是一套以代替MATLAB、Mathematica鹤竭、Maple等商用科學(xué)計(jì)算軟件為目的的開源系統(tǒng)踊餐。它通過Python結(jié)合了眾多的開源科學(xué)計(jì)算軟件,并通過網(wǎng)頁瀏覽器提供了一個(gè)與其交互的記事本文檔界面。 Python的科學(xué)計(jì)算擴(kuò)展庫非常多,不同專業(yè)的技術(shù)人員都可以找到適合自己的擴(kuò)展庫帅刀。下面是我經(jīng)常會(huì)用到的一個(gè)非常不完全的列表:
NumPy + SciPy + matplotlib + IPython : 這幾個(gè)應(yīng)該是每位開發(fā)者都應(yīng)具備的擴(kuò)展庫超凳。NumPy提供了多維數(shù)組以及眾多的處理函數(shù),SciPy提供了各種數(shù)值運(yùn)算功能揩尸,matplotlib能繪制 出精美的二維圖表,IPython則提供了一個(gè)超強(qiáng)的命令行,最新版的IPython還添加于Sage類似的瀏覽器的記事本界面(notebook)幕帆。
SciKits : 其中包括許多獨(dú)立的擴(kuò)展庫,作為SciPy的補(bǔ)充赖条。其中 scikit-learn 是一套機(jī)器學(xué)習(xí)庫失乾,包含了比較完善的文檔以及眾多的實(shí)例程序常熙。
Pandas : 以Python世界中 R 的替代品為目標(biāo)的數(shù)據(jù)分析庫。根據(jù)其官方網(wǎng)站的測(cè)試碱茁,Pandas在許多方面的性能都比R要高裸卫。
ETS : 這是一套Enthought公司開發(fā)的函數(shù)庫,其中的 Mayavi 能很方便地對(duì)數(shù)據(jù)進(jìn)行三維可視化纽竣。
OpenCV : 這是一套計(jì)算機(jī)視覺庫墓贿,目前的最新版本已經(jīng)提供了十分完備的Python接口,能夠調(diào)用OpenCV中眾多的圖像處理退个、模式識(shí)別函數(shù)直接對(duì)NumPy數(shù)組進(jìn)行處理募壕。
包管理
關(guān)于Python的包管理
Eggs 格式是 setuptools 引入的一種文件格式,它使用 .egg 擴(kuò)展名语盈,用于 Python 模塊的安裝舱馅。
pip 是目前 python 包管理的事實(shí)標(biāo)準(zhǔn),2008年發(fā)布刀荒。它被用作 easy_install 的替代品代嗤,但是它仍有大量的功能建立在 setuptools 組件之上。
python requests
Requests 是使用 Apache2 Licensed 許可證的 HTTP 庫缠借。用 Python 編寫干毅,真正的為人類著想。
Python 標(biāo)準(zhǔn)庫中的 urllib2 模塊提供了你所需要的大多數(shù) HTTP 功能泼返,但是它的 API太渣了硝逢。它是為另一個(gè)時(shí)代、另一個(gè)互聯(lián)網(wǎng)所創(chuàng)建的绅喉。它需要巨量的工作渠鸽,甚至包括各種方法覆蓋,來完成最簡(jiǎn)單的任務(wù)柴罐。
以安裝requests為例:
命令:
bashsudo pip install requests
結(jié)果:
bashDownloading/unpacking requests
Downloading requests-2.4.3-py2.py3-none-any.whl (459kB): 459kB downloaded
Installing collected packages: requests
Successfully installed requests
Cleaning up...
用這個(gè)庫我們可以做些什么徽缚?看看官網(wǎng)的示例:
bash>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.json()
到現(xiàn)在你會(huì)發(fā)現(xiàn)我們沒有說到任何的Python語法,這不是一本關(guān)于Python語法的書革屠,如我們?cè)陂_頭所說的凿试。下面是我們將會(huì)在后面用到的代碼
python#!/usr/bin/env python
import requests
url ="http://b.phodal.com/athome/1"
r = requests.get(url)
print r.text