一步步搭建物聯網系統——Python 代碼如散文

Python 代碼如散文

python

做爲一門計算機語言來講,Python會有下面的特色。javascript

  • 語言學習起來容易
  • 解決生活中的實際問題
  • 支持多學科

咱們能夠和其餘不是腳本語言的語言進行一個簡單的對比,如C,你須要去編譯去運行,有時候還須要解決跨平臺問題,原本你是在你的Windows上運行得好好的,可是有一天你換了一個Mac電腦的時候,問題變得很棘手,你甚至不知道怎麼去解決問題。我沒有用過MFC,據說很方便,可是在其餘平臺下就沒有一個好的解決方案。這裏可能跑得有點遠,可是不一樣的用戶可能在不一樣的平臺上,這也就是腳本語言的優點所在了。html

代碼與散文

你可能聽過,也可能瞭解過,不過在這裏咱們可能不會去講述那些基礎的語法的東西,咱們想說的是代碼格式的重要性,在html中你能夠這樣去寫你的代碼java

html<html><head><title>This is a Title
</title></head><body><div class="content">
<p>flakjfaklfjalfa</p></div>
</body></html>

又或者是js的minify,它可能會使你的代碼看起來像是這樣的:python

javascriptfunction NolTracker(b,a){this.pvar=b;this.mergeFeatures(a)}

可能的是若是是python的話,你可能會遇到下面的問題。。git

bashFile "steps.py", line 10
   try:
   ^
IndentationError: expected an indented block

若是你對JSLint、Lint這類的工具備點印象的話,你也能夠認爲python集成了這類工具。整潔的代碼至少應該看上去要有整潔的衣服,就好像是咱們看到的一我的同樣,然後咱們纔會有一個好的印象。更主要的一點是代碼是寫給人看的,而衣服更多的時候對於像我這樣的人來講,他首先應該是要保暖的,其次對於一個懶的人來講。。。程序員

程序應該是具備可讀性的短文,它將在計算機上執行,從而解決某些問題

咱們須要去讀懂別人的代碼,別人也須要去讀懂咱們的代碼。計算機能夠無條件地執行你那未經編排過的程序,可是人就不是如此了。github

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;}}}

上面的代碼相對於下面的代碼可讀性沒有那麼多,可是計算機能夠無條件地執行上面的代碼。上面的代碼對於網絡傳輸來講是好的,可是對於人來講並非如此,咱們須要一些工具來輔助咱們去讀懂上面的代碼。若是代碼上寫得沒有一點可讀性,諸如函數命名沒有多少實際意義,若是咱們把前面的函數就成這樣:算法

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;
        }
    }
}

那麼只有在咱們理解了這個函數是幹什麼以後才能理解函數是幹什麼,而不是光看函數名就能夠了。shell

在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"

因此上面的代碼的可讀性在今天新生一代的程序員來講可能沒有那麼容易理解。芯片運行的速度愈來愈快,在程序上咱們也須要一個愈來愈快的解決方案,而所謂的愈來愈快的解決方案指的不是運行速度上,而是開發速度上。若是你沒有辦法在一樣時間內開發出更好的程序,那麼你就可能輸給你的競爭對手。

開始以前

咱們終於又從一種語言跳到了另一種語言,咱們可能習慣了一種模式,而不勇於去嘗試新的東西,這些或許是咱們的一些習慣又或者是由於懼怕等等。

做爲另一個跨平臺能力很強的語言,這裏說的是與Javascript、HTML比較,或許你會以爲C算是最好的,可是咱們這裏討論更多的是腳本語言,也就是直接能夠運行的。在如今主流的大多數移動平臺上,python也有良好的支持,如Android,IOS,只是這些算是類Unix系統內核,python還支持以前Nokia的Symbian。

開始以前咱們須要確認咱們的平臺上已經有了python環境,也就是能夠運行下面的Hello,World,你能夠在網上不少地方看到,最簡單的地方仍是到官網,又或者是所用移動平臺的store下載。

Python的Hello,World

Python的Hello,World有兩種形式,做爲一種腳本語言來講,Javascript也是一種腳本語言,只是二者之間有太多的不一樣之處,每一個人都會有不一樣的選擇對於一種語言用來做爲其的習慣。因而這就是咱們的

print "Hello,World"

當咱們把咱們的腳本在shell環境下運行時

bash>>>  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

咱們想要的Hello,World

咱們想展現的是如何結合前面學習的內容作一個更有意思的Hello,World。

pythonimport cherrypy
class HelloWorld(object):
    def index(self):
        return "Hello World!"
    index.exposed = True

cherrypy.quickstart(HelloWorld())

算法

咱們須要去了解算法(algorithm),引經據典的話就是這樣子:

a process or set of rules to be followed in calculations or other problem-solving operations, especially by a computer

也就是計算或其餘解決問題的操做須要遵循的一個過程或者一套規則,書上還提到的說法是——解決問題的訣竅,讓我想起了hack一詞。咱們總會去想某些東西是否有一個更快的計算方法,有時候在處理某些問題上也顯示了一個好的算法的重要性。

實用主義哲學

(來自於: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數組進行處理。

包管理

關於Python的包管理

  • Eggs 格式是 setuptools 引入的一種文件格式,它使用 .egg 擴展名,用於 Python 模塊的安裝。
  • pip 是目前 python 包管理的事實標準,2008年發佈。它被用做 easy_install 的替代品,可是它仍有大量的功能創建在 setuptools 組件之上。

python requests

Requests 是使用 Apache2 Licensed 許可證的 HTTP 庫。用 Python 編寫,真正的爲人類着想。

Python 標準庫中的 urllib2 模塊提供了你所須要的大多數 HTTP 功能,可是它的 API太渣了。它是爲另外一個時代、另外一個互聯網所建立的。它須要巨量的工做,甚至包括各類方法覆蓋,來完成最簡單的任務。

以安裝requests爲例:

命令:

bashsudo pip install requests

結果:

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...

用這個庫咱們能夠作些什麼?看看官網的示例:

bash>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.json()

到如今你會發現咱們沒有說到任何的Python語法,這不是一本關於Python語法的書,如咱們在開頭所說的。下面是咱們將會在後面用到的代碼

python#!/usr/bin/env python
import requests

url = "http://b.phodal.com/athome/1"
r = requests.get(url)
print r.text

在線查看:一步步搭建物聯網系統

圖靈-電子書版一步步搭建物聯網系統

相關文章
相關標籤/搜索