學(xué)習(xí)編程有時(shí)候會(huì)給人一種高深莫測(cè)的錯(cuò)覺(jué)娶靡,容易讓人“敬而遠(yuǎn)之”牧牢。事實(shí)并非如此,學(xué)習(xí)編程其實(shí)就是學(xué)習(xí)一種語(yǔ)言——一種與機(jī)器對(duì)話的語(yǔ)言姿锭。編程語(yǔ)言與人類(lèi)語(yǔ)言有著很多相似的東西塔鳍,只要你懂了機(jī)器的語(yǔ)言構(gòu)成,學(xué)習(xí)編程的過(guò)程就像結(jié)交一個(gè)好朋友呻此。 而你編寫(xiě)程序的過(guò)程就像與老朋友聊天一樣有趣轮纫。這章我們就先從整體上認(rèn)識(shí)一下編程語(yǔ)言的體系,很多編程語(yǔ)言都符合這個(gè)標(biāo)準(zhǔn)焚鲜。
1. 編程體系概述
很多編程語(yǔ)言的主體部分都可以概括為四個(gè)部分:數(shù)據(jù)掌唾、運(yùn)算放前、控制和執(zhí)行。Scratch和Python也不例外糯彬。
通過(guò)設(shè)置或者從外界偵測(cè)獲得數(shù)據(jù)犀斋,然后對(duì)獲得數(shù)據(jù)進(jìn)行運(yùn)算,根據(jù)運(yùn)算結(jié)果用條件判斷和循環(huán)等方式進(jìn)行控制情连,最后執(zhí)行相應(yīng)的程序叽粹,實(shí)現(xiàn)相應(yīng)的功能或效果,如圖4.1所示却舀。
比如從Scratch的代碼模塊分類(lèi)中我們可以看到數(shù)據(jù)虫几、運(yùn)算杏头、控制三個(gè)模塊燥爷;而運(yùn)動(dòng)署恍、外觀囚霸、畫(huà)筆等模塊則可以歸為“執(zhí)行”部分拔恰;“偵測(cè)”模塊是獲得數(shù)據(jù)的一種方式或南;“事件”是綜合運(yùn)用了數(shù)據(jù)繁仁、運(yùn)算掰曾、控制的一種方式术裸;“更多模塊”主要是用函數(shù)進(jìn)行封裝倘是,是提高效率的方法。Python與Scratch類(lèi)似袭艺,Scratch的方法都能在Python中找到對(duì)應(yīng)的實(shí)現(xiàn)方式搀崭。
后面我們用幾個(gè)案例來(lái)說(shuō)明一下這個(gè)編程系統(tǒng),讓大家加深理解猾编。
1.1 案例一:自動(dòng)駕駛汽車(chē)
假設(shè)我們?cè)O(shè)計(jì)一輛能夠自動(dòng)駕駛的汽車(chē)瘤睹,能夠根據(jù)周?chē)沫h(huán)境自動(dòng)調(diào)整速度和方向,完成駕駛答倡。這個(gè)過(guò)程就用到了我們上述的編程系統(tǒng)轰传。
數(shù)據(jù)部分:偵測(cè)與前后左右車(chē)輛或障礙物的距離,獲得數(shù)據(jù)瘪撇;提取當(dāng)前的速度和方向等數(shù)據(jù)获茬;
運(yùn)算部分:根據(jù)需求對(duì)獲得的數(shù)據(jù)進(jìn)行處理;
控制部分:根據(jù)運(yùn)算結(jié)果制定控制計(jì)劃设江,如根據(jù)車(chē)距合理提高或降低行駛速度锦茁;根據(jù)計(jì)算結(jié)果判讀是否具備改變行駛方向的條件。
執(zhí)行部分:根據(jù)控制計(jì)劃作出實(shí)際的操作叉存,達(dá)到最終的結(jié)果码俩。
1.2 案例二:我們完成一個(gè)愿望
我們完成一個(gè)愿望的過(guò)程,其實(shí)也是在運(yùn)行上述編程系統(tǒng)歼捏,只不過(guò)我們沒(méi)有發(fā)覺(jué)而已稿存。比如我們要完成籌備一次旅行的的過(guò)程笨篷。這個(gè)過(guò)程涉及很多內(nèi)容:身體條件準(zhǔn)備、財(cái)務(wù)條件準(zhǔn)備瓣履、生活及工作的安排率翅、出行計(jì)劃的制定、出行方式的選擇等袖迎。上述的每一個(gè)部分都在默默的運(yùn)行上述系統(tǒng)冕臭,為了簡(jiǎn)單說(shuō)明問(wèn)題,我們只提取其中的“財(cái)務(wù)準(zhǔn)備”來(lái)說(shuō)明問(wèn)題燕锥。
數(shù)據(jù)部分:通過(guò)各種途徑了解到某地旅游的各種數(shù)據(jù):最佳旅游天數(shù)辜贵、日均消費(fèi)額、各個(gè)消費(fèi)項(xiàng)目归形、最佳出行日期等數(shù)據(jù)托慨。
運(yùn)算部分:對(duì)獲得的數(shù)據(jù)進(jìn)行運(yùn)算,總共需要多少資金暇榴,還有多長(zhǎng)時(shí)間進(jìn)行準(zhǔn)備厚棵,每天需要攢錢(qián)多少等。
控制部分:根據(jù)運(yùn)算結(jié)果制定自己的準(zhǔn)備計(jì)劃蔼紧,如每天需獲得多少資金婆硬,通過(guò)哪些項(xiàng)目進(jìn)行節(jié)約資金或獲得資金。
執(zhí)行部分:嚴(yán)格執(zhí)行上面制定的計(jì)劃并最終獲得
1.3 案例三:我們的身體本身
讓我們驚訝的是我們的身體本身也在默默地按照編程系統(tǒng)不停運(yùn)行歉井。身體的觸覺(jué)柿祈、聽(tīng)覺(jué)哈误、視覺(jué)哩至、嗅覺(jué)、痛覺(jué)等系統(tǒng)都符合編程系統(tǒng)的設(shè)置蜜自。這里我們以視覺(jué)為例進(jìn)行說(shuō)明菩貌。
數(shù)據(jù)部分:我們通過(guò)各個(gè)感覺(jué)器官獲得外部的各種刺激,不一定折算成我們熟悉的阿拉伯?dāng)?shù)值重荠,但一定以某種“數(shù)據(jù)”形式傳遞給我們的大腦箭阶。例如我們感受到的光的強(qiáng)度。
運(yùn)算部分:我們的大腦根據(jù)獲得的“數(shù)據(jù)”進(jìn)行各種精密運(yùn)算戈鲁,得到我們身體需要的“數(shù)據(jù)”仇参。例如我們將獲得的光的強(qiáng)度的數(shù)據(jù)傳遞給大腦,大腦將這個(gè)強(qiáng)度數(shù)據(jù)與眼睛能夠承受的光強(qiáng)度數(shù)據(jù)進(jìn)行比較運(yùn)算婆殿。
控制部分:根據(jù)大腦的運(yùn)算結(jié)果進(jìn)行判讀诈乒,形成對(duì)器官的不同指令。例如根據(jù)運(yùn)算結(jié)果制定眼睛睜眼婆芦、瞇眼怕磨、閉眼的不同指令喂饥。
執(zhí)行部分:我們的身體根據(jù)“控制”部分的指令產(chǎn)生相應(yīng)的反應(yīng)或動(dòng)作。例如執(zhí)行大腦對(duì)眼睛額指令肠鲫,當(dāng)光線強(qiáng)的時(shí)候员帮,眼睛按照指令進(jìn)行瞇眼或閉眼。
2 數(shù)據(jù)
中國(guó)古代哲學(xué)(比如《易經(jīng)》)認(rèn)為世間萬(wàn)物可以從“象导饲、數(shù)捞高、理”三個(gè)維度進(jìn)行描述,這是有一定道理的渣锦。比如說(shuō)我們?nèi)粘S闷诽耐鳎隳芸吹竭@個(gè)東西,說(shuō)明他有一定的具象泡挺,同時(shí)你也可以從長(zhǎng)寬高辈讶、重量、方位等數(shù)據(jù)進(jìn)行描述娄猫,同時(shí)贱除,這個(gè)東西為什么是這個(gè)樣子(“象”),為什么是這個(gè)數(shù)據(jù)(“數(shù)”)一定有他存在的道理媳溺,及所謂的“理”月幌。 所以,從某種層面上說(shuō)我們的世界是一個(gè)“數(shù)據(jù)”的世界悬蔽,我們?cè)谶@里討論的“編程”更是一個(gè)離不開(kāi)數(shù)據(jù)的小世界扯躺,計(jì)算機(jī)最底層的代碼只不過(guò)是在處理“0”與“1”兩個(gè)數(shù)字。
在編程語(yǔ)言中數(shù)據(jù)蝎困,一部分由程序捕獲录语,一部分由編程者給定。需要我們注意的是禾乘,這里的數(shù)據(jù)不僅指數(shù)學(xué)中所指的各個(gè)數(shù)字澎埠,也包括字符串、布爾值等其他內(nèi)容始藕。更具體的內(nèi)容蒲稳,我們會(huì)在下面的章節(jié)中詳細(xì)學(xué)習(xí)。
3 運(yùn)算
運(yùn)算指的是對(duì)各類(lèi)數(shù)據(jù)進(jìn)行相應(yīng)的處理伍派,這里既包括我們傳統(tǒng)意義上的加減乘除江耀、取模、求余诉植、比較大小等數(shù)據(jù)運(yùn)算祥国,也包括或、且倍踪、非等邏輯運(yùn)算系宫。
邏輯運(yùn)算在程序設(shè)計(jì)中與數(shù)據(jù)運(yùn)算一樣重要索昂。特別是在條件判斷的控制部分,發(fā)揮著舉足輕重的作用扩借。就像三個(gè)人投票決定某件事:兩種相反的意見(jiàn)的關(guān)系互為“非”椒惨,如“同意”與“不同意”;幾個(gè)人只要有一人同意即可通過(guò)潮罪,幾個(gè)人的意見(jiàn)之間的關(guān)系就是“或”康谆; 幾個(gè)人都同意才可以通過(guò),不同人的意見(jiàn)之間的關(guān)系為“且”嫉到。
4 控制
控制指根據(jù)運(yùn)算的結(jié)果調(diào)整沃暗、制定相應(yīng)的指令或計(jì)劃。主要包括兩個(gè)方面:條件控制與循環(huán)控制何恶。
條件控制就像一個(gè)“看門(mén)人”孽锥,控制符合什么樣條件的人才能進(jìn)入;條件控制也可以是“談判者”细层,守住心中的底線惜辑,在什么樣的一個(gè)數(shù)值范圍內(nèi)可以接受條件并完成交易。
循環(huán)控制就像一個(gè)喜歡動(dòng)腦的“機(jī)靈鬼兒”疫赎,最不想干的就一遍又一遍地反復(fù)做同樣的工作盛撑,于是他將問(wèn)題簡(jiǎn)化,制定了一個(gè)自動(dòng)程序捧搞,一按按鈕抵卫,就可以翹著二郎腿曬太陽(yáng)去了。
在接下來(lái)的章節(jié)中我們會(huì)詳細(xì)了解這些“看門(mén)人”胎撇、“談判者”和“機(jī)靈鬼兒”介粘。
5 執(zhí)行
“執(zhí)行”部分的語(yǔ)句最為豐富。是直接呈現(xiàn)最終結(jié)果的命令创坞。在各種編程語(yǔ)言中碗短,執(zhí)行部分的語(yǔ)句也是種類(lèi)和數(shù)量最多的部分。如在Scratch系統(tǒng)自帶的代碼分類(lèi)中的運(yùn)動(dòng)题涨、外觀、聲音总滩、畫(huà)筆等幾個(gè)部分都可以歸結(jié)為“執(zhí)行”部分纲堵。
這就像一個(gè)企業(yè)的人事結(jié)構(gòu),出主意提想法的是少數(shù)人闰渔,真正將想法實(shí)現(xiàn)席函,變?yōu)檎嬲a(chǎn)品的的是占比最多的專(zhuān)業(yè)人才,這些專(zhuān)業(yè)人才在執(zhí)行任務(wù)的過(guò)程中也需要相互合作冈涧。在企業(yè)里茂附,專(zhuān)業(yè)人才就相當(dāng)于編程系統(tǒng)中的“執(zhí)行部分”正蛙。編程的過(guò)程與管理一個(gè)企業(yè)出奇相似,如果我們從學(xué)習(xí)編程的過(guò)程中領(lǐng)悟了管理思維营曼,這算是額外收獲乒验。
6 提高效率
在本書(shū)的后面章節(jié),我們還會(huì)學(xué)到提高編程效率的兩大利器:“函數(shù)式編程”和“面向?qū)ο缶幊獭钡仝濉4蠹沂紫纫靼滓稽c(diǎn):這兩個(gè)利器非常好用锻全、對(duì)提高編程效率的作用無(wú)可替代,但是對(duì)于編程實(shí)現(xiàn)的功能來(lái)說(shuō)录煤,并沒(méi)有添加新的東西鳄厌。也就是說(shuō)我們完全可以不通過(guò)這兩大利器完成相應(yīng)的功能,所以大家學(xué)習(xí)的時(shí)候不要有心理壓力妈踊,我們只是換了一種更高效的程序編寫(xiě)方式了嚎。也許你的心中還有疑慮,既然可以選擇不用廊营,為什么還要學(xué)習(xí)他們新思?相信你看了后面章節(jié)的案例就會(huì)有了答案:太方便太強(qiáng)大了,沒(méi)有理由不用赘风。
7 Scratch案例——無(wú)人駕駛汽車(chē)
詳見(jiàn)鏈接 Scratch案例——無(wú)人駕駛汽車(chē)
8 Python案例——喝墨水的小烏龜
詳見(jiàn)鏈接 Python案例——喝墨水的小烏龜