作為一門計(jì)算機(jī)語言來說,Python會(huì)有下面的特點(diǎn)。
我們可以和其他不是腳本語言的語言進(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中你可以這樣去寫你的代碼
<html><head><title>This is a Title
</title></head><body><div class="content">
<p>flakjfaklfjalfa</p></div>
</body></html>
又或者是js的minify,它可能會(huì)使你的代碼看起來像是這樣的:
function NolTracker(b,a){this.pvar=b;this.mergeFeatures(a)}
可能的是如果是python的話,你可能會(huì)遇到下面的問題。。
File "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)編排過的程序,但是人就不是如此了。
var 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ù)就成這樣:
var 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, world\n"
所以上面的代碼的可讀性在今天新生一代的程序員來說可能沒有那么容易理解。芯片運(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有兩種形式,作為一種腳本語言來說,Javascript也是一種腳本語言,只是兩者之間有太多的不同之處,每個(gè)人都會(huì)有不同的選擇對(duì)于一種語言用來作為其的習(xí)慣。于是這就是我們的
print "Hello,World"
當(dāng)我們把我們的腳本在shell環(huán)境下運(yùn)行時(shí)
>>> print "Hello,world"
File "<stdin>", 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
我們想展示的是如何結(jié)合前面學(xué)習(xí)的內(nèi)容做一個(gè)更有意思的Hello,World。
import 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è)好的算法的重要性。
(來自于: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è)非常不完全的列表:
關(guān)于Python的包管理
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為例:
命令:
sudo pip install requests
結(jié)果:
Downloading/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)的示例:
>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.json()
到現(xiàn)在你會(huì)發(fā)現(xiàn)我們沒有說到任何的Python語法,這不是一本關(guān)于Python語法的書,如我們?cè)陂_頭所說的。下面是我們將會(huì)在后面用到的代碼
#!/usr/bin/env python
import requests
url = "http://b.phodal.com/athome/1"
r = requests.get(url)
print r.text
更多建議: