樹莓派是一個非常廉價的、只有手掌大小的完全可編程的計算機。雖然樹莓派的體積小,但是它的潛力無限。你可以像使用常規(guī)臺式計算機一樣在樹莓派上創(chuàng)建一個非??岬墓こ?。例如,你可以用樹莓派搭建你自己的家用云存儲服務器。
樹莓派用什么語言編程?
樹莓派用python來進行編程。樹莓派項目的一個核心思想是Python編程語言的使用。Python允許樹莓派的擁有者將項目擴展到令人難以置信的規(guī)模。
Python是一個解釋型的面向對象的、跨平臺的編程語言。良好的可靠性、清晰的語法和易用性,使它成為最流行的編程語言之一。Python是一個優(yōu)雅的、功能強大的語言。
樹莓派為Python編程提供了一個便宜到令人難以置信的開發(fā)平臺。Python被認為是一種“教學”語言,是因為它很容易學習,但絕不表示Python羸弱。
有了樹莓派和Python,唯一限制你的就是想象力了。你可以用Python編寫游戲并將其運行在樹莓派控制的游戲機上。你可以編寫程序來控制連接到樹莓派上的機器人?;蛘吣憧梢韵馜ave Akerman一樣將你的樹莓派發(fā)送到39000千米的地球上空拍攝令人難以置信的照片。
python語言的優(yōu)點如下:
1、簡單:Python是一種代表簡單主義思想的語言。閱讀一個良好的Python程序就感覺像是在讀英語一樣。它使你能夠專注于解決問題而不是去搞明白語言本身。
2、易學:Python極其容易上手,因為Python有極其簡單的說明文檔。
3、速度快:Python 的底層是用 C 語言寫的,很多標準庫和第三方庫也都是用 C 寫的,運行速度非常快。
4、免費、開源:Python是FLOSS(自由/開放源碼軟件)之一。使用者可以自由地發(fā)布這個軟件的拷貝、閱讀它的源代碼、對它做改動、把它的一部分用于新的自由軟件中。FLOSS是基于一個團體分享知識的概念。
5、高層語言:用Python語言編寫程序的時候無需考慮諸如如何管理你的程序使用的內存一類的底層細節(jié)。
6、可移植性:由于它的開源本質,Python已經(jīng)被移植在許多平臺上(經(jīng)過改動使它能夠工作在不同平臺上)。這些平臺包括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開發(fā)的android平臺。
7、解釋性:一個用編譯性語言比如C或C++寫的程序可以從源文件(即C或C++語言)轉換到一個你的計算機使用的語言(二進制代碼,即0和1)。這個過程通過編譯器和不同的標記、選項完成。
運行程序的時候,連接/轉載器軟件把你的程序從硬盤復制到內存中并且運行。而Python語言寫的程序不需要編譯成二進制代碼。你可以直接從源代碼運行 程序。
在計算機內部,Python解釋器把源代碼轉換成稱為字節(jié)碼的中間形式,然后再把它翻譯成計算機使用的機器語言并運行。這使得使用Python更加簡單。也使得Python程序更加易于移植。
8、面向對象:Python既支持面向過程的編程也支持面向對象的編程。在“面向過程”的語言中,程序是由過程或僅僅是可重用代碼的函數(shù)構建起來的。在“面向對象”的語言中,程序是由數(shù)據(jù)和功能組合而成的對象構建起來的。
9、可擴展性:如果需要一段關鍵代碼運行得更快或者希望某些算法不公開,可以部分程序用C或C++編寫,然后在Python程序中使用它們。
10、可嵌入性:可以把Python嵌入C/C++程序,從而向程序用戶提供腳本功能。
豐富的庫:Python標準庫確實很龐大。它可以幫助處理各種工作,包括正則表達式、文檔生成、單元測試、線程、數(shù)據(jù)庫、網(wǎng)頁瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV文件、密碼系統(tǒng)、GUI(圖形用戶界面)、Tk和其他與系統(tǒng)有關的操作。這被稱作Python的“功能齊全”理念。除了標準庫以外,還有許多其他高質量的庫,如wxPython、Twisted和Python圖像庫等等。
11、規(guī)范的代碼:Python采用強制縮進的方式使得代碼具有較好可讀性。而Python語言寫的程序不需要編譯成二進制代碼。
樹莓派python編程詳解
當你創(chuàng)建一個Python程序時,首先必須從編譯器的環(huán)境中退出來,并且打開一個文本編輯器,如emacs或者樹莓派的Leafpad。在創(chuàng)建完程序后,將其”.py”的擴展名保存。之后,你便可以通過輸入以下命令運行該程序:
在眾多的編程語言中,Python的語法也十分與眾不同。Python使用空格或者縮進來分開不同的代碼塊。C語言等其他語言用花括號區(qū)分不同的代碼塊,如if語句;Python使用冒號和縮進來定義一個代碼塊。
C語言中的代碼格式如下所示:
你可能會注意關于Python編程的兩個細節(jié)。第一,在if語句中括號的作用不是很明顯。在Python中,括號不是必需的,但在大多數(shù)情況下,使用括號是一種好的編程習慣的表現(xiàn),因為加了括號會提高代碼的可讀性。你也會發(fā)現(xiàn),大多數(shù)其他的編程語言在每行代碼的末尾都會以分號結束,而Python則不是這樣。這可能會花些功夫去適應,但卻可以避免因為在某處分號放錯位置或者忘記添加分號而引起編譯失敗的問題。在Python中,每行代碼的末尾就是該條語句的末尾—就這么簡單。
你已經(jīng)見過一條語句的形式了,如:
同之前提到的一樣,在Python中不需要提前聲明x是一個整型變量,y是一個字符型變量—Python可以自己區(qū)別。這些語句稱作賦值語句(assignment),它們將等號右邊的值賦給等號左邊的變量。不同的編程語言中有各種各樣的命名規(guī)則,但我能給你的最好建議是:選擇其中一個規(guī)則并堅持下去。如果你喜歡Pascal語言的規(guī)則(ThisIsAVariable),那就用這個規(guī)則。如果你更偏向于駝峰規(guī)則(thisIsAVariable),就使用這個規(guī)則。但一定要一致,以后你會感謝你的堅持的。在任何情況下,無論變量是數(shù)值、字符、列表,或其他別的什么,賦值的工作僅僅是:將一個值賦給一個變量。這是編程函數(shù)中最簡單的一個。
1、if測試
接下來要介紹的編程函數(shù)是if語句,及其相關的elif和else函數(shù)。如你所預期的一樣,if執(zhí)行了一個測試,然后選擇一項基于測試的結果。最基本的if語句如下所示:
‘1’和布爾變量中的“true”效果一樣,因此上述語句總會輸出“true”。
當你在Python終端或者IDLE中輸入if語句并以冒號結束時,下一個提示符永遠都是省略號(…),這意味著Python正等待一個縮進塊。如果你已經(jīng)進行了縮進操作,按下Enter鍵結束等待。如果你在一個文本編輯器內編寫程序,確保在需要縮進時進行了縮進操作。
從此處開始,我將會按文本編輯器的格式書寫代碼,并將輸出的結果按照運行腳本之后的格式書寫。
這是一個使用elif和else的較復雜的程序,如下:
很明顯,這段代碼最終會輸出“Spam is a wonderful thing!”。當程序執(zhí)行時,計算機首先判斷第一個if,如果被判斷的語句是正確的,則會立即執(zhí)行隨后縮進塊內的代碼。如果不正確,則略過縮進塊尋找elif,并判斷其語句的正確性。同樣,如果正確或者沒有elif語句,計算機會執(zhí)行后面縮進塊內的程序,如果不正確,則會跳過縮進塊尋找下一個elif或者else語句。
在此有三點需要注意:第一,如果一條if語句內的內容是錯誤的,則在之后的縮進塊內的內容都不會執(zhí)行,計算機會直接跳轉到下一個未縮進的代碼處。
第二,同其他語言一樣,Python使用雙等號來判斷是否相等。單等號用來進行賦值操作,雙等號用來判斷。我之所以提起這個是因為每個程序員(我確定指的是每一個程序員)某些時候都會在if語句中使用單等號進行判斷操作,因此他們的程序會得到很多奇怪的結果。你也會犯同樣的錯誤,但我希望提前為你打個預防針。
第三,Python忽略空行、空格(當然,除了在交互式情景及縮進塊內的狀況)和注釋。這點很重要,因為你可以隨意標注你的代碼,以便提高它們對于其他程序員的可讀性,即便是以后你自己讀你的代碼也是一樣。
在Python中,注釋通常以“#“開始,程序會忽略#后的一切內容。
代碼的可讀性是一個很重要的因素,希望你能定期回憶我這句話。你是希望試著調試先前編寫的代碼還是按照以下方式編程:
雖然沒什么樂趣,但你可以很清楚地看懂第二種書寫方式的內容,在讀完類似的上百行沒有空格、空行或者注釋的代碼后,你的眼睛會感謝你相信我。讓我們看看使用空格后倒數(shù)第二行發(fā)生的變化:
你可以隨意使用空格。
關于if部分,我最后想說的的內容是關于布爾操作符。在一個判斷正誤的測試中,X and Y正確意味著X和Y都正確。X or Y正確則意味著X或者Y正確,not X正確意味著X是錯的。Python中使用關鍵詞進行布爾運算,而不像C或者C++中使用&&、||、!操作符。好好學習這些操作符,它們會變得十分順手的。
2、循環(huán)
通常,程序從頭至尾每一行執(zhí)行一次。然而,一些特定的語句可能會使程序執(zhí)行的順序從一點跳到另一點,這些控制流語句(control-flow statement)包括if(then)語句和循環(huán)。
最簡單的循環(huán)語句可能是執(zhí)行很多次的一段代碼,例如:
也可使用for循環(huán)遍歷字符串,或者是一個列表:
盡管Python中for循環(huán)的語法和C或Java中的有些不同,不過一旦你適應了它們,使用這種語法就得心應手了。
第二種循環(huán)語句是while語句。這種語句判斷一個狀態(tài),只要狀態(tài)正確就會繼續(xù)執(zhí)行縮進框內的程序,例如:
可能與你想象中的有些不同,這段代碼絕對不會輸出“10”,因為x輸出之后才會進行加1操作。在第10次循環(huán)過程中,編譯器輸出“9”之后x增加到10。而此時while條件不再為真,因此縮進框內的代碼也不會被執(zhí)行。
如果你正等待一個特定事件的發(fā)生,如按鍵按下或者用戶按下“Q”退出的操作,while語句就十分有用。讓我們看看接下來的例子:
這段代碼中有兩點值得注意:第一,在Python 2.x版本中,raw_input命令用來得到用戶的一個輸入,而在Python 3.x中,該命令則改為簡單的input了;第二,記得使用break命令,這條命令會跳出當前循環(huán)。所以在這種情況下,while中循環(huán)的部分會永遠循環(huán),但當檢測var == ‘q’返回值為真時,程序會退出當前循環(huán)并結束程序。
3、函數(shù)
函數(shù)可以讓程序員編寫的代碼重復使用。它能大大提高工作效率。通常,如果你發(fā)現(xiàn)代碼中某些功能需要執(zhí)行很多次,這個功能很有可能需要改寫為函數(shù)。
假設你編寫了一個簡單的程序用來計算矩形的面積和周長。用戶輸入矩形的高和寬,之后程序進行相應的計算。實現(xiàn)這個功能最簡單的方法是編寫一個帶參數(shù)的函數(shù),其參數(shù)分別為矩形的高和寬。之后函數(shù)將矩形的面積和周長返回給主程序。為了實現(xiàn)這個函數(shù),我們用def賦值語句進行編寫。def賦值語句是我們定義一個函數(shù)的方法,其語法為def函數(shù)名(參數(shù)1,參數(shù)2):
這個小程序需要你提供一些參數(shù)并返回計算的結果??赡苓@不是最好的例子(你可以用更少的代碼計算出結果),但卻很好地闡述了代碼復用的思想。通過這個函數(shù),你就明白:在程序的任何位置,只要你需要計算面積或者周長,調用AreaPerimeter函數(shù)并賦給參數(shù)“height”和“width”值即可。
在此需要注意一點:raw_input函數(shù)會返回一個字符串,即便你輸入的是數(shù)字,返回的也是字符串類型的值。這也就解釋了為什么在AreaPerimeter函數(shù)中height和width變量在計算前必須要進行int轉換。
如果對其他語言比較熟悉的話,你會發(fā)現(xiàn)Python的函數(shù)與其他語言的函數(shù)在方法、功能和步驟方面都有一些不同。例如,在Python中,所有的函數(shù)都是按引用進行調用(call-by-reference)。不需要太過專業(yè)的術語,簡單而言,這意味著當你給函數(shù)傳遞一個參數(shù)時,你只是將一個指針傳遞給一個變量,而不是傳遞數(shù)值。這種方式使得Python的內存管理更加方便。例如,當你在函數(shù)中一遍又一遍地傳遞列表參數(shù)時,不需要復制整個列表的內容。具體而言,當一個函數(shù)將一個列表作為參數(shù)時,你傳遞的只是列表首元素在內存中的位置,之后函數(shù)基于首元素的位置再查找剩余項。
函數(shù)另一個有意思的方面是:它們都是可執(zhí)行的語句。這意味著一個函數(shù)實際上可以在if語句中聲明和調用。雖然并不是很常見,但是這樣定義和調用是合法的(有時也十分有用)。def語句可以嵌套在循環(huán)當中,嵌套在其他的def語句中,甚至嵌套在列表和字典里。
我們會在進行具體項目時回顧函數(shù)部分;現(xiàn)在,只需要知道它們的存在,并知道它們對你自己編寫的每個程序都很實用即可。
4、對象和面向對象編程
在本章中,最后一件重要的事情是其與生俱來的執(zhí)行面向對象代碼的能力。面向對象編程(object-oriented programming,OOP)是一個較為高級的話題,可能不在本書討論的范圍之內。但我認為這是一個十分重要的話題,不可輕描淡寫,一帶而過。
OOP是一個程序數(shù)據(jù)被分為對象和函數(shù)(或方法)組合的范例。一個對象就是一個數(shù)據(jù)結構,通常是一組數(shù)據(jù)類型的結合,包括整型、字符型或者其他的數(shù)據(jù)類型。對象通常是類的一部分,與類中的方法相關聯(lián),并通過方法操作。
也許解釋這部分最簡單的方法就是使用shape示例。在這個例子中,一個shape(形狀)是一個對象的類。類中有值,例如name(名稱)和numberOfSides(面數(shù))。這個類也有相關的函數(shù),如findArea(計算面積)或者findPerimeter(計算周長)。
shape類有很多子類,子類描述的內容更為具體。一個square(正方形)是一個shape的對象,它的shapeType(形狀屬性)值等于square,numberOfSides值等于4。它的findArea函數(shù)接受numberOfSides值,并將該值的平方作為返回值。同時,一個triangle(三角形)對象也有不同的name、shapeType和numberOfSides值和不同的findArea方法。
這個例子不僅簡單介紹了對象的概念,也闡述了繼承的概念—OOP的一個組成部分。triangle對象從它的父類shape類繼承了name、numberOfSides和findArea部分(雖然這幾個部分都具有不同的值或者實現(xiàn)方法)。如果一個對象繼承于shape類,它也會繼承那些部分。即便它不需要用到那些部分,它還是會包含這些部分。它可能會增加一些其他的部分(例如circle(圓形)對象可能會有radius(半徑)值),但它也會包含其父類的那些部分。
如果你在編程中用到這些類,相對于C++或者Java而言,Python更容易理解。無論屬性是一個對象或是一個方法,你都可以按照接下來的語法結構進行命名:object.attribute(對象。屬性)。如果你有一個叫作holyGrail的circle對象,其半徑值用holyGrail.radius來表示。一個名為unexplodedScotman的正方形,其計算面積的函數(shù)用unexplodedScotsman.findArea來定義。
如之前所述,OOP的內容超出了本書涉及的范圍。但像函數(shù)這些概念卻十分有用,尤其是在很長很復雜的程序中。當你在學習Python的過程中,請自由地進行探索吧。你會發(fā)現(xiàn)Python也是一門功能豐富的語言,它甚至允許你執(zhí)行其他高級程序任務。
-
編程
+關注
關注
88文章
3565瀏覽量
93536 -
python
+關注
關注
55文章
4767瀏覽量
84375
原文標題:用python在樹莓派上編程,你可以將項目擴展到令人難以置信的規(guī)模
文章出處:【微信號:mcuworld,微信公眾號:嵌入式資訊精選】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論