# Python

作為一門計算機語言來說,Python會有下面的特點。
* 語言學習起來容易
* 解決生活中的實際問題
* 支持多學科
我們可以和其他不是腳本語言的語言進行一個簡單的對比,如C,你需要去編譯去運行,有時候還需要解決跨平臺問題,本來你是在你的Windows上運行得好好的,但是有一天你換了一個Mac電腦的時候,問題變得很棘手,你甚至不知道怎么去解決問題。我沒有用過MFC,聽說很方便,但是在其他平臺下就沒有一個好的解決方案。這里可能跑得有點遠,但是不同的用戶可能在不同的平臺上,這也就是腳本語言的優勢所在了。
## 7.1 代碼與散文
你可能聽過,也可能了解過,不過在這里我們可能不會去講述那些基礎的語法的東西,我們想說的是代碼格式的重要性,在html中你可以這樣去寫你的代碼
~~~
<html><head><title>This is a Title
</title></head><body><div class="content">
<p>flakjfaklfjalfa</p></div>
</body></html>
~~~
又或者是js的minify,它可能會使你的代碼看起來像是這樣的:
~~~
function NolTracker(b,a){this.pvar=b;this.mergeFeatures(a)}
~~~
可能的是如果是python的話,你可能會遇到下面的問題。。
~~~
File "steps.py", line 10
try:
^
IndentationError: expected an indented block
~~~
如果你對JSLint、Lint這類的工具有點印象的話,你也可以認為python集成了這類工具。整潔的代碼至少應該看上去要有整潔的衣服,就好像是我們看到的一個人一樣,而后我們才會有一個好的印象。更主要的一點是代碼是寫給人看的,而衣服更多的時候對于像我這樣的人來說,他首先應該是要保暖的,其次對于一個懶的人來說。
> 程序應該是具有可讀性的短文,它將在計算機上執行,從而解決某些問題
我們需要去讀懂別人的代碼,別人也需要去讀懂我們的代碼。計算機可以無條件地執行你那未經編排過的程序,但是人就不是如此了。
~~~
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;}}}
~~~
上面的代碼相對于下面的代碼可讀性沒有那么多,但是計算機可以無條件地執行上面的代碼。上面的代碼對于網絡傳輸來說是好的,但是對于人來說并不是如此,我們需要一些工具來輔助我們去讀懂上面的代碼。如果代碼上寫得沒有一點可讀性,諸如函數命名沒有多少實際意義,如果我們把前面的函數就成這樣:
~~~
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;
}
}
}
~~~
那么只有在我們理解了這個函數是干什么之后才能理解函數是干什么,而不是光看函數名就可以了。
在Javascript解決一個函數的辦法有很多,在其他一些語言如Ruby或者Perl中也是如此,解決問題的辦法有很多,對于寫代碼的人來說是一個享受的過程,但是對于維護的人來說并非如此。而這個和Python的思想不是很一致的是,Python設計的理念是
> 對于特定的問題,只要有一種最好的方法來解決就夠了
可讀性的代碼在今天顯得比以前重要的多,以前寫程序的時候我們需要去考慮使用匯編或者其他工具來提高程序的效率。
~~~
.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"
~~~
所以上面的代碼的可讀性在今天新生一代的程序員來說可能沒有那么容易理解。芯片運行的速度越來越快,在程序上我們也需要一個越來越快的解決方案,而所謂的越來越快的解決方案指的不是運行速度上,而是開發速度上。如果你沒有辦法在同樣時間內開發出更好的程序,那么你就可能輸給你的競爭對手。
### 7.1.1 開始之前
我們終于又從一種語言跳到了另外一種語言,我們可能習慣了一種模式,而不敢于去嘗試新的東西,這些或許是我們的一些習慣又或者是因為害怕等等。
作為另外一個跨平臺能力很強的語言,這里說的是與Javascript、HTML比較,或許你會覺得C算是最好的,但是我們這里討論更多的是腳本語言,也就是直接可以運行的。在現在主流的大多數移動平臺上,python也有良好的支持,如Android,IOS,只是這些算是類Unix系統內核,python還支持之前Nokia的Symbian。
開始之前我們需要確認我們的平臺上已經有了python環境,也就是可以運行下面的Hello,World,你可以在網上很多地方看到,最簡單的地方還是到官網,又或者是所用移動平臺的store下載。
### 7.1.2 Python的Hello,World
Python的Hello,World有兩種形式,作為一種腳本語言來說,Javascript也是一種腳本語言,只是兩者之間有太多的不同之處,每個人都會有不同的選擇對于一種語言用來作為其的習慣。于是這就是我們的
~~~
print "Hello,World"
~~~
當我們把我們的腳本在shell環境下運行時
~~~
>>> print "Hello,world"
File "<stdin>", line 1
print "Hello,world"
^
IndentationError: unexpected indent
>>> print "Hello,world"
Hello,world
>>>
~~~
如果你沒有預料到縮進帶來的問題的時候,這就是一個問題了。
和我們在Javascript或者是CSS里面一樣,我們也可以用一個文件的方式來寫入我們的代碼,文件后綴名是py,所以創建一個helloworld.py,輸入上面的代碼,然后執行
~~~
python helloworld.py
~~~
一個理想的結果,或許你試過C語言的helloworld,如果了解過GCC的話應該是可以這樣的:
~~~
./a.out
~~~
也就是執行編譯完后的程序,需要注意的是helloworld.py沒有編譯,不過也會輸出
~~~
Hello,world
~~~
### 7.1.3 我們想要的Hello,World
我們想展示的是如何結合前面學習的內容做一個更有意思的Hello,World。
~~~
import cherrypy
class HelloWorld(object):
def index(self):
return "Hello World!"
index.exposed = True
cherrypy.quickstart(HelloWorld())
~~~
## 7.2 算法
我們需要去了解算法(algorithm),引經據典的話就是這樣子:
> a process or set of rules to be followed in calculations or other problem-solving operations, especially by a computer
也就是計算或其他解決問題的操作需要遵循的一個過程或者一套規則,書上還提到的說法是——解決問題的訣竅,讓我想起了hack一詞。我們總會去想某些東西是否有一個更快的計算方法,有時候在處理某些問題上也顯示了一個好的算法的重要性。
## 7.3 實用主義哲學
(來自于:HyryStudio)
大多數工程師、科學家使用科學計算軟件的目的都是為了快速解決其工作中遇到的問題,而不是開發出一套完整的軟件。這就是為什么MATLAB這樣的商用科學計算軟件十分流行的原因。而Python在這一點上實際上和MATLAB十分相似,我們也可以使用Python眾多的擴展庫快速寫出一次性的數據處理、運算的腳本。然而由于Python語言的一些高級特性,以及眾多的科學計算之外的擴展庫,我們可以將積累下來的一次性腳本進行改造,為它們提供命令行、GUI、數據庫、網絡等眾多接口,最終成為一套完整的工具包或者實用的計算軟件。而且由于是開源的自由軟件,我們可以在任何系統中安裝Python環境,運行我們 的程序。
Python一直保持著很強的實用主義,它通常不會去試著重新開發一整套函數庫,而是將現有的開源函數庫包裝成其擴展庫。而Python則通過這些擴展庫將眾多的開源函數庫連接在一起,是名符其實的膠水語言。例如由華盛頓大學的教授主導開發的 Sage ,就是一套以代替MATLAB、Mathematica、Maple等商用科學計算軟件為目的的開源系統。它通過Python結合了眾多的開源科學計算軟件,并通過網頁瀏覽器提供了一個與其交互的記事本文檔界面。 Python的科學計算擴展庫非常多,不同專業的技術人員都可以找到適合自己的擴展庫。下面是我經常會用到的一個非常不完全的列表:
* NumPy + SciPy + matplotlib + IPython : 這幾個應該是每位開發者都應具備的擴展庫。NumPy提供了多維數組以及眾多的處理函數,SciPy提供了各種數值運算功能,matplotlib能繪制 出精美的二維圖表,IPython則提供了一個超強的命令行,最新版的IPython還添加于Sage類似的瀏覽器的記事本界面(notebook)。
* SciKits : 其中包括許多獨立的擴展庫,作為SciPy的補充。其中 scikit-learn 是一套機器學習庫,包含了比較完善的文檔以及眾多的實例程序。
* Pandas : 以Python世界中 R 的替代品為目標的數據分析庫。根據其官方網站的測試,Pandas在許多方面的性能都比R要高。
* ETS : 這是一套Enthought公司開發的函數庫,其中的 Mayavi 能很方便地對數據進行三維可視化。
* OpenCV : 這是一套計算機視覺庫,目前的最新版本已經提供了十分完備的Python接口,能夠調用OpenCV中眾多的圖像處理、模式識別函數直接對NumPy數組進行處理。
## 7.4 包管理
關于Python的包管理
* Eggs 格式是 setuptools 引入的一種文件格式,它使用 .egg 擴展名,用于 Python 模塊的安裝。
* pip 是目前 python 包管理的事實標準,2008年發布。它被用作 easy_install 的替代品,但是它仍有大量的功能建立在 setuptools 組件之上。
### 7.4.1 python requests
Requests 是使用 Apache2 Licensed 許可證的 HTTP 庫。用 Python 編寫,真正的為人類著想。
Python 標準庫中的 urllib2 模塊提供了你所需要的大多數 HTTP 功能,但是它的 API太渣了。它是為另一個時代、另一個互聯網所創建的。它需要巨量的工作,甚至包括各種方法覆蓋,來完成最簡單的任務。
以安裝requests為例:
命令:
~~~
sudo pip install requests
~~~
結果:
~~~
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...
~~~
用這個庫我們可以做些什么?看看官網的示例:
~~~
>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.json()
~~~
到現在你會發現我們沒有說到任何的Python語法,這不是一本關于Python語法的書,如我們在開頭所說的。下面是我們將會在后面用到的代碼
~~~
#!/usr/bin/env python
import requests
url = "http://b.phodal.com/athome/1"
r = requests.get(url)
print r.text
~~~
* [**一步步搭建物聯網系統**](http://www.ituring.com.cn/book/1580)
* [前言](http://www.ituring.com.cn/tupubarticle/3778)
* [第一部分](http://www.ituring.com.cn/tupubarticle/3801)
* [1 無處不在的HTML](http://www.ituring.com.cn/tupubarticle/3779)
* [2 無處不在的Javascript](http://www.ituring.com.cn/tupubarticle/3780)
* [3 無處不在的CSS](http://www.ituring.com.cn/tupubarticle/3781)
* [4 無處不在的三劍客](http://www.ituring.com.cn/tupubarticle/3782)
* [5 GNU/Linux 強大且Free](http://www.ituring.com.cn/tupubarticle/3783)
* [6 Arduino 極客的玩具](http://www.ituring.com.cn/tupubarticle/3784)
* [?7 Python 代碼如散文](http://www.ituring.com.cn/tupubarticle/3785)
* [8 Raspberry Pi 極客的盛宴](http://www.ituring.com.cn/tupubarticle/3786)
* [9 Server 一切皆為服務](http://www.ituring.com.cn/tupubarticle/3787)
* [10 Web服務](http://www.ituring.com.cn/tupubarticle/3788)
* [11 HTTP 熟悉&陌生](http://www.ituring.com.cn/tupubarticle/3789)
* [12 設計RESTful API](http://www.ituring.com.cn/tupubarticle/3790)
* [第二部分](http://www.ituring.com.cn/tupubarticle/3802)
* [13 環境準備](http://www.ituring.com.cn/tupubarticle/3791)
* [14 創建REST服務](http://www.ituring.com.cn/tupubarticle/3792)
* [15 REST與不同語言](http://www.ituring.com.cn/tupubarticle/3793)
* [16 前端顯示](http://www.ituring.com.cn/tupubarticle/3794)
* [17 RESTful的CoAP協議](http://www.ituring.com.cn/tupubarticle/3795)
* [第三部分](http://www.ituring.com.cn/tupubarticle/3803)
* [18 簡單物聯網](http://www.ituring.com.cn/tupubarticle/3797)
* [19 Android簡單示例](http://www.ituring.com.cn/tupubarticle/3798)
* [尾聲](http://www.ituring.com.cn/tupubarticle/3799)