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