當前位置:
首頁 > 最新 > 用python在樹莓派上編程,你可以將項目擴展到令人難以置信的規模

用python在樹莓派上編程,你可以將項目擴展到令人難以置信的規模

樹莓派是一個非常廉價的、只有手掌大小的完全可編程的計算機。雖然樹莓派的體積小,但是它的潛力無限。你可以像使用常規台式計算機一樣在樹莓派上創建一個非常酷的工程。例如,你可以用樹莓派搭建你自己的家用雲存儲伺服器。

樹莓派用什麼語言編程?

樹莓派用python來進行編程。樹莓派項目的一個核心思想是Python編程語言的使用。Python允許樹莓派的擁有者將項目擴展到令人難以置信的規模。

Python是一個解釋型的面向對象的、跨平台的編程語言。良好的可靠性、清晰的語法和易用性,使它成為最流行的編程語言之一。Python是一個優雅的、功能強大的語言。

樹莓派為Python編程提供了一個便宜到令人難以置信的開發平台。Python被認為是一種「教學」語言,是因為它很容易學習,但絕不表示Python羸弱。

有了樹莓派和Python,唯一限制你的就是想像力了。你可以用Python編寫遊戲並將其運行在樹莓派控制的遊戲機上。你可以編寫程序來控制連接到樹莓派上的機器人。或者你可以像Dave Akerman一樣將你的樹莓派發送到39000千米的地球上空拍攝令人難以置信的照片。

python語言的優點如下:

1、簡單:Python是一種代表簡單主義思想的語言。閱讀一個良好的Python程序就感覺像是在讀英語一樣。它使你能夠專註於解決問題而不是去搞明白語言本身。

2、易學:Python極其容易上手,因為Python有極其簡單的說明文檔。

3、速度快:Python 的底層是用 C 語言寫的,很多標準庫和第三方庫也都是用 C 寫的,運行速度非常快。

4、免費、開源:Python是FLOSS(自由/開放源碼軟體)之一。使用者可以自由地發布這個軟體的拷貝、閱讀它的源代碼、對它做改動、把它的一部分用於新的自由軟體中。FLOSS是基於一個團體分享知識的概念。

5、高層語言:用Python語言編寫程序的時候無需考慮諸如如何管理你的程序使用的內存一類的底層細節。

6、可移植性:由於它的開源本質,Python已經被移植在許多平台上(經過改動使它能夠工作在不同平台上)。這些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStaTIon、Sharp Zaurus、Windows CE、PocketPC、Symbian以及Google基於linux開發的android平台。

7、解釋性:一個用編譯性語言比如C或C++寫的程序可以從源文件(即C或C++語言)轉換到一個你的計算機使用的語言(二進位代碼,即0和1)。這個過程通過編譯器和不同的標記、選項完成。

運行程序的時候,連接/轉載器軟體把你的程序從硬碟複製到內存中並且運行。而Python語言寫的程序不需要編譯成二進位代碼。你可以直接從源代碼運行 程序。

在計算機內部,Python解釋器把源代碼轉換成稱為位元組碼的中間形式,然後再把它翻譯成計算機使用的機器語言並運行。這使得使用Python更加簡單。也使得Python程序更加易於移植。

8、面向對象:Python既支持面向過程的編程也支持面向對象的編程。在「面向過程」的語言中,程序是由過程或僅僅是可重用代碼的函數構建起來的。在「面向對象」的語言中,程序是由數據和功能組合而成的對象構建起來的。

9、可擴展性:如果需要一段關鍵代碼運行得更快或者希望某些演算法不公開,可以部分程序用C或C++編寫,然後在Python程序中使用它們。

10、可嵌入性:可以把Python嵌入C/C++程序,從而向程序用戶提供腳本功能。

豐富的庫:Python標準庫確實很龐大。它可以幫助處理各種工作,包括正則表達式、文檔生成、單元測試、線程、資料庫、網頁瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV文件、密碼系統、GUI(圖形用戶界面)、Tk和其他與系統有關的操作。這被稱作Python的「功能齊全」理念。除了標準庫以外,還有許多其他高質量的庫,如wxPython、Twisted和Python圖像庫等等。

11、規範的代碼:Python採用強制縮進的方式使得代碼具有較好可讀性。而Python語言寫的程序不需要編譯成二進位代碼。

樹莓派python編程詳解

當你創建一個Python程序時,首先必須從編譯器的環境中退出來,並且打開一個文本編輯器,如emacs或者樹莓派的Leafpad。在創建完程序後,將其」.py」的擴展名保存。之後,你便可以通過輸入以下命令運行該程序:

在眾多的編程語言中,Python的語法也十分與眾不同。Python使用空格或者縮進來分開不同的代碼塊。C語言等其他語言用花括弧區分不同的代碼塊,如if語句;Python使用冒號和縮進來定義一個代碼塊。

C語言中的代碼格式如下所示:

你可能會注意關於Python編程的兩個細節。第一,在if語句中括弧的作用不是很明顯。在Python中,括弧不是必需的,但在大多數情況下,使用括弧是一種好的編程習慣的表現,因為加了括弧會提高代碼的可讀性。你也會發現,大多數其他的編程語言在每行代碼的末尾都會以分號結束,而Python則不是這樣。這可能會花些功夫去適應,但卻可以避免因為在某處分號放錯位置或者忘記添加分號而引起編譯失敗的問題。在Python中,每行代碼的末尾就是該條語句的末尾—就這麼簡單。

你已經見過一條語句的形式了,如:

同之前提到的一樣,在Python中不需要提前聲明x是一個整型變數,y是一個字元型變數—Python可以自己區別。這些語句稱作賦值語句(assignment),它們將等號右邊的值賦給等號左邊的變數。不同的編程語言中有各種各樣的命名規則,但我能給你的最好建議是:選擇其中一個規則並堅持下去。如果你喜歡Pascal語言的規則(ThisIsAVariable),那就用這個規則。如果你更偏向於駝峰規則(thisIsAVariable),就使用這個規則。但一定要一致,以後你會感謝你的堅持的。在任何情況下,無論變數是數值、字元、列表,或其他別的什麼,賦值的工作僅僅是:將一個值賦給一個變數。這是編程函數中最簡單的一個。

1、if測試

接下來要介紹的編程函數是if語句,及其相關的elif和else函數。如你所預期的一樣,if執行了一個測試,然後選擇一項基於測試的結果。最基本的if語句如下所示:

『1』和布爾變數中的「true」效果一樣,因此上述語句總會輸出「true」。

當你在Python終端或者IDLE中輸入if語句並以冒號結束時,下一個提示符永遠都是省略號(…),這意味著Python正等待一個縮進塊。如果你已經進行了縮進操作,按下Enter鍵結束等待。如果你在一個文本編輯器內編寫程序,確保在需要縮進時進行了縮進操作。

從此處開始,我將會按文本編輯器的格式書寫代碼,並將輸出的結果按照運行腳本之後的格式書寫。

這是一個使用elif和else的較複雜的程序,如下:

很明顯,這段代碼最終會輸出「Spam is a wonderful thing!」。當程序執行時,計算機首先判斷第一個if,如果被判斷的語句是正確的,則會立即執行隨後縮進塊內的代碼。如果不正確,則略過縮進塊尋找elif,並判斷其語句的正確性。同樣,如果正確或者沒有elif語句,計算機會執行後面縮進塊內的程序,如果不正確,則會跳過縮進塊尋找下一個elif或者else語句。

在此有三點需要注意:第一,如果一條if語句內的內容是錯誤的,則在之後的縮進塊內的內容都不會執行,計算機會直接跳轉到下一個未縮進的代碼處。

第二,同其他語言一樣,Python使用雙等號來判斷是否相等。單等號用來進行賦值操作,雙等號用來判斷。我之所以提起這個是因為每個程序員(我確定指的是每一個程序員)某些時候都會在if語句中使用單等號進行判斷操作,因此他們的程序會得到很多奇怪的結果。你也會犯同樣的錯誤,但我希望提前為你打個預防針。

第三,Python忽略空行、空格(當然,除了在互動式情景及縮進塊內的狀況)和注釋。這點很重要,因為你可以隨意標註你的代碼,以便提高它們對於其他程序員的可讀性,即便是以後你自己讀你的代碼也是一樣。

在Python中,注釋通常以「#「開始,程序會忽略#後的一切內容。

代碼的可讀性是一個很重要的因素,希望你能定期回憶我這句話。你是希望試著調試先前編寫的代碼還是按照以下方式編程:

雖然沒什麼樂趣,但你可以很清楚地看懂第二種書寫方式的內容,在讀完類似的上百行沒有空格、空行或者注釋的代碼後,你的眼睛會感謝你相信我。讓我們看看使用空格後倒數第二行發生的變化:

你可以隨意使用空格。

關於if部分,我最後想說的的內容是關於布爾操作符。在一個判斷正誤的測試中,X and Y正確意味著X和Y都正確。X or Y正確則意味著X或者Y正確,not X正確意味著X是錯的。Python中使用關鍵詞進行布爾運算,而不像C或者C++中使用&&、||、!操作符。好好學習這些操作符,它們會變得十分順手的。

2、循環

通常,程序從頭至尾每一行執行一次。然而,一些特定的語句可能會使程序執行的順序從一點跳到另一點,這些控制流語句(control-flow statement)包括if(then)語句和循環。

最簡單的循環語句可能是執行很多次的一段代碼,例如:

也可使用for循環遍歷字元串,或者是一個列表:

儘管Python中for循環的語法和C或Java中的有些不同,不過一旦你適應了它們,使用這種語法就得心應手了。

第二種循環語句是while語句。這種語句判斷一個狀態,只要狀態正確就會繼續執行縮進框內的程序,例如:

可能與你想像中的有些不同,這段代碼絕對不會輸出「10」,因為x輸出之後才會進行加1操作。在第10次循環過程中,編譯器輸出「9」之後x增加到10。而此時while條件不再為真,因此縮進框內的代碼也不會被執行。

如果你正等待一個特定事件的發生,如按鍵按下或者用戶按下「Q」退出的操作,while語句就十分有用。讓我們看看接下來的例子:

這段代碼中有兩點值得注意:第一,在Python 2.x版本中,raw_input命令用來得到用戶的一個輸入,而在Python 3.x中,該命令則改為簡單的input了;第二,記得使用break命令,這條命令會跳出當前循環。所以在這種情況下,while中循環的部分會永遠循環,但當檢測var == 『q』返回值為真時,程序會退出當前循環並結束程序。

3、函數

函數可以讓程序員編寫的代碼重複使用。它能大大提高工作效率。通常,如果你發現代碼中某些功能需要執行很多次,這個功能很有可能需要改寫為函數。

假設你編寫了一個簡單的程序用來計算矩形的面積和周長。用戶輸入矩形的高和寬,之後程序進行相應的計算。實現這個功能最簡單的方法是編寫一個帶參數的函數,其參數分別為矩形的高和寬。之後函數將矩形的面積和周長返回給主程序。為了實現這個函數,我們用def賦值語句進行編寫。def賦值語句是我們定義一個函數的方法,其語法為def函數名(參數1,參數2):

這個小程序需要你提供一些參數並返回計算的結果。可能這不是最好的例子(你可以用更少的代碼計算出結果),但卻很好地闡述了代碼復用的思想。通過這個函數,你就明白:在程序的任何位置,只要你需要計算面積或者周長,調用AreaPerimeter函數並賦給參數「height」和「width」值即可。

在此需要注意一點:raw_input函數會返回一個字元串,即便你輸入的是數字,返回的也是字元串類型的值。這也就解釋了為什麼在AreaPerimeter函數中height和width變數在計算前必須要進行int轉換。

如果對其他語言比較熟悉的話,你會發現Python的函數與其他語言的函數在方法、功能和步驟方面都有一些不同。例如,在Python中,所有的函數都是按引用進行調用(call-by-reference)。不需要太過專業的術語,簡單而言,這意味著當你給函數傳遞一個參數時,你只是將一個指針傳遞給一個變數,而不是傳遞數值。這種方式使得Python的內存管理更加方便。例如,當你在函數中一遍又一遍地傳遞列表參數時,不需要複製整個列表的內容。具體而言,當一個函數將一個列表作為參數時,你傳遞的只是列表首元素在內存中的位置,之後函數基於首元素的位置再查找剩餘項。

函數另一個有意思的方面是:它們都是可執行的語句。這意味著一個函數實際上可以在if語句中聲明和調用。雖然並不是很常見,但是這樣定義和調用是合法的(有時也十分有用)。def語句可以嵌套在循環當中,嵌套在其他的def語句中,甚至嵌套在列表和字典里。

我們會在進行具體項目時回顧函數部分;現在,只需要知道它們的存在,並知道它們對你自己編寫的每個程序都很實用即可。

4、對象和面向對象編程

在本章中,最後一件重要的事情是其與生俱來的執行面向對象代碼的能力。面向對象編程(object-oriented programming,OOP)是一個較為高級的話題,可能不在本書討論的範圍之內。但我認為這是一個十分重要的話題,不可輕描淡寫,一帶而過。

OOP是一個程序數據被分為對象和函數(或方法)組合的範例。一個對象就是一個數據結構,通常是一組數據類型的結合,包括整型、字元型或者其他的數據類型。對象通常是類的一部分,與類中的方法相關聯,並通過方法操作。

也許解釋這部分最簡單的方法就是使用shape示例。在這個例子中,一個shape(形狀)是一個對象的類。類中有值,例如name(名稱)和numberOfSides(面數)。這個類也有相關的函數,如findArea(計算面積)或者findPerimeter(計算周長)。

shape類有很多子類,子類描述的內容更為具體。一個square(正方形)是一個shape的對象,它的shapeType(形狀屬性)值等於square,numberOfSides值等於4。它的findArea函數接受numberOfSides值,並將該值的平方作為返回值。同時,一個triangle(三角形)對象也有不同的name、shapeType和numberOfSides值和不同的findArea方法。

這個例子不僅簡單介紹了對象的概念,也闡述了繼承的概念—OOP的一個組成部分。triangle對象從它的父類shape類繼承了name、numberOfSides和findArea部分(雖然這幾個部分都具有不同的值或者實現方法)。如果一個對象繼承於shape類,它也會繼承那些部分。即便它不需要用到那些部分,它還是會包含這些部分。它可能會增加一些其他的部分(例如circle(圓形)對象可能會有radius(半徑)值),但它也會包含其父類的那些部分。

如果你在編程中用到這些類,相對於C++或者Java而言,Python更容易理解。無論屬性是一個對象或是一個方法,你都可以按照接下來的語法結構進行命名:object.attribute(對象。屬性)。如果你有一個叫作holyGrail的circle對象,其半徑值用holyGrail.radius來表示。一個名為unexplodedScotman的正方形,其計算面積的函數用unexplodedScotsman.findArea來定義。

如之前所述,OOP的內容超出了本書涉及的範圍。但像函數這些概念卻十分有用,尤其是在很長很複雜的程序中。當你在學習Python的過程中,請自由地進行探索吧。你會發現Python也是一門功能豐富的語言,它甚至允許你執行其他高級程序任務。(轉自電子發燒友)

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嵌入式資訊精選 的精彩文章:

前洛克希德馬丁高工談寬頻RF接收機架構

TAG:嵌入式資訊精選 |