點擊上方「CSDN」,選擇「置頂公眾號」
關鍵時刻,第一時間送達!
如果你是一個在軟體開發公司工作的非編程人員,你可能會想知道程式設計師到底做什麼。而且你可能每天聽到新的流行語。本文中無論你是銷售人員、醫生、律師、業務負責人還是會計師,只要你曾經在腦海你想過如何學習編寫代碼,這裡將是一個好的開始的地方。
本文主要分為 4 個部分。
第1部分——編程是什麼?
簡單的說,「編程就是指導計算機執行任務的行為」。編程通常被認為是編碼。
那麼,什麼是電腦程式?電腦程式就是計算機所執行的一系列的指令。
上面所定義的計算機指的是任何能夠執行代碼的設備。可能是智慧型手機、ATM機、黑莓PI、伺服器等等。
一個關於編程的好的類比
首先,我們的日常生活是有規律可尋的。宇宙的運行某種程度上來說是可預測的;例如白天黑夜、季節變換、日出日落。人類在早上起床然後去上學或者上班的循環裡周而復始。工作上我們從別人那裡獲得指令,比如上級。再比如烹製一道菜可以分解成有限的幾個步驟。
再次,比如當我們使用智慧型手機的時候,有部分代碼運行的在後臺不可見的。再比如在電腦上將滑鼠從一個地方移動到另一個地方,看起來很簡單,但實際上,這需要運行很多行代碼。又如在Google Docs上輸入文字這樣一個看似簡單的操作,在後臺也需要運行相當多的代碼。代碼隨處可見。
電腦程式也可以稱為代碼。不要使用"codes"這個詞來稱呼代碼(因為「code」只能用單數形式)。
計算機的自然語言
就像人類一樣,機器也有屬於他們的自然語言。但計算機無法理解人類的語言。計算機的自然語言實際上是二進位代碼(binary code)——1和0。它們代表了兩種狀態:有(1)和無(0)。
它就是電子設備的自然語言。但是要讓人類用這種二進位代碼來交流的話,我們一定會抓狂的!
進入程序設計語言
為了和這些只講二進位語言的機器交流,我們需要一種與我們的自然語言(比如英語、法語、阿拉伯語或斯瓦希裡語。)比較接近的語言。程序設計語言就是一種和人類語言相近的語言。但是它們跟加結構化而且必須完全學會才能夠使用它們。
程序設計語言可能是高級程序設計語言或是低級程序設計語言。高級語言與機器語言的差別要比低級語言更大。這種「大的差別」通常被稱之為抽象(abstraction),這一點我們在這個系列中不會深入討論。這樣我們就不會分心(distracted)了:)
計算機需要一種方法來理解我們的語言。為此,我們需要一個翻譯器(Translator)。
什麼是翻譯器
原始碼是指以特定程式語言編寫的代碼。 更多內容在第2部分。
翻譯器有責任將您的原始碼轉換為機器語言。 這也被稱為二進位化。 記住1和0。 我們可以將二進位文件稱為目標代碼,程序或今天的常用詞:應用程式。
翻譯器可以是以下任何一種:
解釋器
一些語言是被解釋的。 翻譯器逐行處理原始碼,程序或應用程式運行每一行代碼。 這意味著解釋從運行代碼開始,直到它遇到錯誤。 然後解釋器停止工作,報告錯誤。 更多內容在第3部分。
Python是解釋型程式語言的一個很好的例子。
編譯器
編譯器的工作方式跟解釋器不一樣。編譯器會通過編譯過程將所有原始碼全部轉換成為二進位文件。然後執行該二進位文件。如果原始碼中存在錯誤,在編譯的時候編譯器會檢測出來並予以標示。這將會中斷編譯過程,並且不會生成二進位文件。
解釋器是一行行的翻譯原始碼並執行的,只有當前行的原始碼執行完後才能進行下一行代碼的翻譯。而編譯器則是一次性將所有原始碼翻譯成一個文件(二進位),並執行這一整個文件。
還記得電腦程式的定義嗎?就是計算機所執行的一系列的指令。
一個正在執行的程序通常被稱為進程。這樣的程序需要佔用計算機或智慧型手機一定的資源,如內存、硬碟空間還有文件系統。正在執行的程序也可以說成正在運行。
當我們執行一個電腦程式的時候,我們使用「運行(run)」這個詞來描述。程序運行所花的時間一般被稱為該程序的運行時。
電腦程式通常也被叫做應用程式(Apps)。我們經常會把程序和它們所運行的、或者設計運行的平臺或者環境聯繫起來。比如web應用程式是運行在web瀏覽器上的,谷歌電子表格(Google Spreadsheet)就是一個例子。還有行動應用程式,是運行在智慧型手機上的,如CandyCrush。另外還有桌面應用程式,如Evernote的桌面應用。
再說一遍,解釋型原始碼是直接從源文件上執行的。而編譯型原始碼則是先轉換成二進位文件。之後再執行該文件。編譯型原始碼編譯成功後,在運行時仍有可能發生錯誤。詳見第3部分。
混合解釋編譯器
混合解釋編譯器是解釋器和編譯器的組合。流行的混合程式語言是 Java 。Java 首先將你的原始碼編譯為稱為字節碼(Bytecode)的中間格式。
字節碼然後由稱為虛擬機的運行時引擎解釋和執行。這使得混合翻譯器能夠在各種作業系統上運行字節碼。
Assemblers 彙編器
彙編器是將底層的彙編語言翻譯成二進位。
對於這個系列,我們只關注高級語言。
分析轉譯器的一個好方法就是把它們看成一個程序。你需要下載或獲取它們,將其安裝在計算機系統上並了解其基本工作流程。
常見問題
這裡有一個初學者通常都會問的問題。
我應該先學哪門語言?
現在有數百種程式語言。他們按流行度、社區活躍度、長期支持、教育用途和商業用途排名。也可以按技術性來排序,比如是否是函數式的、命令式的、靜態的、強類型或弱類型的。
某些語言比其它的更合教學。這些語言以教學為目而不是以商業用途為目的。比如那些給孩子們用於學習編寫代碼的語言。
也存在非常強大,易於安裝和學習的語言。Python 就是其中之一。我一般會建議初學者學習 Python。
如果你有興趣探索怎麼選擇「第一語言」,這裡有 Philip Guo 的一些研究(https://cacm.acm.org/blogs/blog-cacm/176450-python-is-now-the-most-popular-introductory-teaching-language-at-top-u-s-universities/fulltext)。
在學習一門新語言的時候你就應該知道語言翻譯器。這是安裝配置在你的計算機系統中的一個程序。
我非常推薦從如何使用 CLI(Command Line Interface,命令行界面) 開始學習。CLI 是一個終端或 Shell。你可以把終端看作 GUI(Graphical User Interface,圖形用戶界面)。
在 GUI 中,你會通過滑鼠與計算機進行交互。同時也會依賴目錄以及其它你事情的視覺表現。
但是,如果使用 CLI,你會通過命令與計算機進行交互,你需要在提示信息或閃爍的滑鼠後輸入命令
$_
在 Windows 下,隨機終端就是命令提示符。而對於 Mac 和 Linux 用戶,已經存在 Bash 終端。如果想在Windows 下有相同的體驗,就安裝 Git Bash 或者 PowerShell。
繼續前進
你現在已經不知不覺進入到了編程中。你需要做好準備開始寫第一行代碼了。
你需要從下面這些內容開始:
計算機系統
這時候你需要的不是複雜或昂貴的計算機,你只需要一臺工作正常的就行。
安裝 CLI
我推薦你從這個速成教程(https://learnpythonthehardway.org/book/appendixa.html)開始學習使用 CLI。
安裝文本編輯器
我們會在第二部分回到這個主題
學習一門程式語言
在這個系列中你會學習一些基礎,建立適用於多數程式語言的基礎知識。
詢問
開始編程需要哪些基本的工具?
你將在 Bash(CLI) 下使用什麼命令?
小結
我們已經了解了基本編程知識,也介紹了翻譯器。「源碼」 對你來說不再陌生。我們將會在下一部分仔細分析源碼。
小測驗答案
開始編程時你需要的基礎工具有哪些?
在bash(CLI)中你使用什麼命令完成以下操作?
第 2 部分 ——原始碼
現在你已經理解了編程的概念,我們來分析原始碼。
原始碼基本上就是一個文件,就像 Microsoft (.doc) 文件,但略有不同。它是一個原始的文本文件,使用像 Windows 記事本這樣的簡單編輯器就可以寫出來。回憶前面章節中提到過,你需要解釋器或編輯器來把原始碼轉換為二進位。原始碼必須保存在文件中,這樣可以作為翻譯器的輸入。
根據你寫程序的語言,會將原始碼保存在指定擴展名的文件中。Python 的擴展名是 『.py』。Java 的是 『.java』。Php 的是 『.php』 還有 PERL 的是 『.pl』 等等。
你在寫完原始碼之後,必須使用翻譯器來運行。比如,這裡有一個例子說明如何使用 python 命令來運行 Python 原始碼。
入門:你的第一個程序
print 'hello world!'
$ python main.py
源碼分析
現在我們會研究這段經典代碼的內容。以下是代碼常規的幾個組成部分:
關鍵字
通常說的關鍵字是一些簡短而且可以人為閱讀的單詞。每種語言都有自己的關鍵字,它們很特殊。我們稍後還會回到這個主題。你需要學習並記住一些關鍵字。這裡有一個 Python 中已知並已使用在使用的關鍵字。
標識符
有一些是你發明的詞 —— 是的,就是你,一個程式設計師。這些詞通常被稱為標識符。它是由你或者其它程式設計師創造的,它們以插件的形式打包,通常被稱為庫。
Math 庫可以用作庫的示例。它提供一些像平方根(Math.sqrt)這樣的函數供 JavaScript 訪問。
許多程式語言都有大量自己的庫。這些通常都作為它們的 SDK(Software Development Kit,軟體開發包)。你可以隨編譯器下載這些庫,然後用於構建技術、應用和項目。除此之外,有一些框架,它們對構建一個特定的 Web 或移動平臺很有幫助。
某些標識符是與你使用的語言綁定的,而且可能不是作為用戶命名的標識符來使用。比如 Java 中的 string。這類標識符,與關鍵字一起被稱為保留字。它們不是關鍵字,但像關鍵字一樣特殊。
所有關鍵字都是保留字,但並不是所有保留字都是關鍵字。
你選擇的單詞對任何第一眼看到它的人來說都有意義。
標識符常用於命名變量,我們將對此進行深入研究。
基本數據類型
你會發現在源碼中,數據有各種不同的類型,例如:數字 (3,5.7,-100,3.142)、字符 (M,A)。在一些程式語言中,數字會被更加細緻地劃分為更為精確的類別,例如整型。
整型可以被分為有符號 (Signed) 和無符號 (Unsigned)、長整性、短整型。長和短取決於系統給數字所保留的內存空間的大小。當然還有一些數字是有小數部分的,在現在你所學的程式語言中,我們通常稱這一類數字為雙精度浮點型 (double) 和單精度浮點數 (float)。
同時我們也使用布爾值 (boolean) 這個數據類型來表示 真(true) 和 假(false)。
複合數據類型
上面所說的數據類型,都是最基本的幾種數據類型。我們可以通過這些基本的數據類型來構建各種類型的複合數據類型。
數組(Array) 就是一種最簡單的複合數據類型。字符串 (String) 是一個字符的數組集合。在我們編寫代碼的時候是無法離開這些複合數據類型的。
一些字符的組合是字符串 (String)。簡單說,一個字符串對於計算機來說,就相當於一個詞語對於人來說。「Thermometer」這個詞由11個字符組成 —— 我們簡稱為字符串。對於字符串的處理是一個很大的方面,這其中有很多東西需要去學習,並且對於每一個有抱負的程式設計師來說,都必須要很用心地學。
我們所使用的絕大多數程式語言中都提供了複合數據類型。當然我們也使用其他的一些覆核數據類型,比如說類(class)。這些也被稱為面向對象編程。
變量
變量可以簡單理解為對內存地址的命名。我們有時候會想在代碼中保存數據,使之可以反覆使用。通常是編譯器/解釋器來為我們保留這些內存地址。我們需要對這些內存地址命名以便稍後可以訪問。看看下面的 Python 代碼段:
pet_name = 'Hippo'
print pet_name
pet_name 就是一個變量。因為保存在 pet_name 中的數據是字符串,我們稱之為字符串變量。另外有數值變量等。變量按其類型進行分類。
常量
常量是在整個程序生命周期內都不會改變的值。我們使用大寫字母來強調某個值是常量值。某些語言提供了創建常量的方法,另外一些則沒有。
某些語言提供了聲明變量類型的特權。我們通常稱之為強類型語言。Java 就是很典型的例子。
另外一些語言沒提供這一特性,它們是弱類型或動態類型語言。Python 就是其中之一。
下面是在 JavaScript 中聲明常量的示例。
const petName = 'Hippo'
字面量
很多原始碼中都充斥著需要通過編輯原始碼來改變的數據類型,我們稱之為字面量,不要將之與變量或常量混淆。字面量可以在瀏覽代碼的時候看到。它們可能是字符串、數值、小數或其它數據類型。
在上面的原始碼片段中,『Hippo』 就是字面量 —— 一個字符串字面量。它會一直是 『Hippo』 直到你在原始碼中把它修改掉。在學習編寫代碼的過程中,你要學習如何採用一種容易的方法來管理原始碼中的字面量,避免對原始碼進行大量改動。
標點/符號
從大量原始碼中你會發現不同的語言使用著不同的標點符號。與 Python 相比,Java 的標點符號就比較多。
常見的標點符號包括逗號(,)、分號(;)、冒號(:)、花括號({})、圓括號(())、方括號([])、引號("")、管道符號(|)、斜線(\)、點號(。)、問號(?)、插入符號(^) 和百分號(%)。
歡迎來到編寫代碼的世界,這裡標點符號會是你的好朋友。你會發現自己會經常使用它們。
運算符
你寫代碼去進行運算操作的概率是非常高的。即使從最微小的方面, 你也會在你的代碼中進行分配運算。 我們展示了我們所使用的程序語言中大量的操作符。示例中包括加法(+), 除法(/) 乘法(*), 減法(-) 和 大於(>)。
運算符通常分按以下分類:
分配運算符
它有時候被誤解為等於. 等於用來比較兩個值。分配運算符給變量賦值, 例如 pet_name = 'Hippo'。
算術運算符
這些組成的操作符用來執行算術任務,例如加法和減法。一些語言提供了某些其他語言沒有的算術操作。例如模運算 (%)返回除法操作的餘數。
關係運算符
用來比較值。它們包括大於,小於,等於,不等於。它們的表示根據你學習的程式語言而變化。 在某些語言中不等於用<>表示, 而其他語言中, 使用 != 或 !==。
邏輯運算符
用來計算邏輯操作。這些通常使用的邏輯運算符是 and, or, not. 某些語言實用其他符號來表示,比如&& 表示 and, || 表示 or, 和 ! 表示 not。邏輯操作值的運算結果通常是布爾值true或false。
注釋
在你的代碼活動中,注釋是非常重要的組成部分。它用來向其他程式設計師解釋你的代碼。這是通過在部分代碼中偶爾添加注釋完成的。通過注釋,你可以引導其他程式設計師理解你的代碼處理什麼樣的數據和產生什麼樣的輸出。
通常,編譯器忽略代碼中的注釋行。
注釋隨語言而變。 # 是 Python 的注釋符。
這是 Python 中的注釋示例。
# program snippet to compute fibonacci of N numbers
在 Java、C 和 C++ 中, 也有像 Python 中 # 的單行注釋符, 但它們使用 // 替代。同樣有多行注釋符 /* … */ 。你可以閱讀更多你所選擇學習語言的注釋。
空格鍵和 Tab 鍵
你所寫的代碼中會有一些空白間隔。這是通過敲空格鍵或者 Tab 鍵完成的。
前行
確保在電腦系統上正確地安裝 Python ,並運行你的第一個程序。
小測驗
這是你的一個小測驗。
識別出下面的 Java 源碼片段中我們目前所學的不同的元素:
// a recursive implementation of Factorial
import java.util.Scanner;
class RecursiveFactorial
{
public static void main(String[] args)
{
Scanner input=new Scanner(System.in);
System.out.print("Find the Factorial of: ");
int num=input.nextInt();
System.out.println("Factorial of "+num+" = "+fact(num));
}
static long fact(int n)
{
if(n<2) return 1;
return n*fact(n-1);
}
}
小結
你已經了解什麼是原始碼了,並已經體驗了典型的原始碼的內容布局。
編譯或轉譯,你的代碼可能由於一系列原因無法運行。這些原因通常與你的原始碼中的錯誤相關。 這些錯誤被稱為 bugs 。
查找和刪除這些 bug 的行為被稱為調試(debugging),並且是你作為程式設計師必須學習的技能。我們將在下一部分中研究 bug 究竟是什麼。
小測驗的答案
請識別下面Java原始碼片段中我們已經學習的不同元素:
關鍵詞:
import, class, public, static, void, new, int, long, if, return
標識符:
java, util, Scanner, RecursiveFactorial, main, String, args, input, System, in, out, print, println, num, nextInt, fact, n
字面量:
字符串常量 — 「Factorial of 」 = 「Find the Factorial of: 」
整型常量 — 2, 1
運算符:
賦值運算符 =
連接符+ (用於字符串的連接)
小於 <
乘法*
減法-
標點符號:
{ } [ ] ( ) ; .
注釋
// Factorial的遞歸實現
第三部分 — Debugging 調試
一旦你開始嘗試編寫代碼片段,或者你正在嘗試基於代碼解決實際問題,你將很快意識到,你的程序總是會有崩潰、被打斷並停止運行的一些時刻。
這通常是由錯誤引起的,統稱為運行時錯誤或異常。從我們的代碼中查找和刪除錯誤的行為被稱為調試。通過更好地調試代碼,你的程序會變得更好。我們不僅調試我們自己的代碼,還可以調試其他程式設計師編寫的代碼。
開始之前,我們需要能夠識別原始碼中可能出現的常見錯誤。
語法錯誤
這些錯誤不會讓你的原始碼通過編譯。它們會在編譯期或在解釋源碼的時候被檢測到。這些錯誤也很容易被 Lint 工具檢查到。我們稍後會了解更多關於 Lint 工具的內容。
語法錯誤多數情況下是由於你在編碼時破壞了對應語言的預期形式或結構引起的。比如在某個語句中少寫了反括號。
語義錯誤
語義錯誤也被稱為邏輯錯誤,它是所有錯誤中最麻煩的一種。語義錯誤並不容易檢測。語義錯誤的標誌之一是程序可以正確運行但不能產生預期的輸出。
看看下面這個例子:
3 + 5 * 6
按優先順序,即俗稱的 BODMAS,在數學中我們知道會先計算乘法,得到的結果會是 33。如果程式設計師認為先計算的是加法,將會得到與預期不同的結果。像這樣的錯誤就是語義錯誤,是關於其所表達的意義的錯誤而不是結構(語法)方面的錯誤。
給 3 + 5 加上括號之後會得到我們想要的結果。
(3 + 5) * 6
Run-time Errors 運行時錯誤
與語義錯誤一樣,編譯時也不會檢測到運行時錯誤。與語義錯誤不同的是,運行時錯誤會中斷程序,並阻止其進一步執行。它們通常由原始碼中的一些意外計算結果引起。
示例如下:
input = 25
x = 0.8/(Math.sqrt(input) - 5)
上面的代碼片段將成功編譯,但輸入 25 將導致 ZeroDivisionError。這是一個運行時錯誤。另一個流行的例子是 StackOverflowError 或 IndexOutofBoundError。真正重要的是你需要識別到這些錯誤並學習如何處理這些錯誤。
總是存在由於你的源程序在其運行的平臺或環境中使用內存和空間而引起的錯誤。它們也是運行時錯誤。像 OutOfMemoryError 和 HeapError 這樣的錯誤通常是由於你的源程序耗盡資源造成的。良好的算法知識將有助於你編寫更好地使用資源的代碼。
重寫代碼以獲得更好的性能的過程稱為優化(optimization),另一個不太相關的詞是重構(refactoring)。當你花更多的時間編碼時,你也應該考慮到這些。
調試
以下是幾條關於如何調試你代碼的小貼士:
使用 Linters
Linters 是輔助掃描原始碼的工具,用以檢查它們是否符合你所編寫的語言中的預設的標準。許多程式語言都有對應的 linters。一定要找一個你正在學習的語言的版本。
優選 IDE,而不是簡單的編輯器
你可以選擇為你正在學習的語言所設計的 IDE。IDE 代表集成開發環境。它們是用於編寫、調試、編譯和運行代碼的軟體。他們通常帶有強大的調試工具包,支持查看或單步執行代碼。
Jetbrains 創造了很多偉大的 IDE,例如 Webstorm 和 IntelliJ。IDE 還有 NetBeans, Komodo, Qt editor, Android Studio, XCode (已移植到 Mac 上),這裡僅羅列部分。.
大聲地朗讀你的代碼
當你正在查找語義錯誤時,這通常很有用。在大聲朗讀代碼的同時,你很可能會找到錯誤位置。這可能會讓你靈光乍現,發現錯誤所在。
閱讀錯誤日誌
當編譯器給出錯誤時,請確保查看行號或被標記的代碼部分。
未來之路
作為初學者,你將從書籍、在線教程或視頻中學習如何編寫代碼。當你看到代碼時,你會經常輸入它們。
當你正在編寫或運行此類代碼時,下面是你應該做的事情:學會破壞它們。 你怎麼能做到這一點呢?
改動某些內容以查看代碼的行為。這樣做,以防止你對任何事情做假定,你會非常確定你已了解究竟發生了什麼。
小測驗
1 . 請問下面 Python 代碼片段中可能存在的 bug 是什麼?
items = [0,1,2,3,4,5]
print items[8]
//hint: items here is an Array, with 6 items. To retrieve the 4th item for example, you will use items[3]. We start counting from 0.
2. 請問下面 Python 代碼片段中可能存在的 bug 是什麼?
input = Hippo'
if input == 'Hippo':
print 'Hello, Hippo'
本節總結
恭喜!你已經對 bug 這個詞不再陌生,找出 bug 也不再話下。下一步,你需要看看我們每天編寫代碼的通用流程。
小測驗的答案
請問下面 Python 代碼片段中可能存在的 bug 是什麼?
(1) 運行時錯誤:索引越界錯誤
(2) 語法錯誤:第一行缺少起始的引號
第四部分:基本編碼流程
代碼行,表達式和語句
所有原始碼的基本單位是 LOC (Line of Code,代碼行)。最簡單的程序是一行代碼。LOC 可以是一個關鍵字、一個符號或者一個語句。只要代碼位於單獨的一行,它就是 LOC。
讓我們來看看一個簡單的代碼行:
area = 0.5 * base * height
0.5 * base * height 是一個表達式。一個表達式是有運算符和運算子組成的。在上面給出的例子中,運算子是 0.5,base 和 height。你可能會回想到 0.5 是一個浮點型常量,而 base 和 height 是變量。運算符是 *(乘法運算符)。
作為 LOC,表達式單獨存在可能並沒有什麼意義。當我們將表達式的值賦值給另一個變量時,比如在上述代碼中的 area,我們將其稱之為語句。當我們將表達式附加到關鍵字之後時,它仍然是一個聲明,例如:return 0.5 * base * height
在本節的後續部分我們將用符號 S 表示一條語句。在一系列語句或語句集中,第 n 條語句將使用 Sn 表示,
要快速掌握編程,一個很好的起點是理解基本的編碼流程。基本流程也被稱為控制流。一旦你理解了這些流程,你會發現他們在許多你所學習的程式語言中都存在。
請注意,本文中給出的例子都是非常基礎的。你需要參考你正在學習的語言,以深入了解其所提供的關鍵字。
此外,這裡介紹的基本流程與編程中的設計模式是不同的。首先了解這些基本流程。 隨著你學到更多的東西,你可以在編程中慢慢涉及到常見的設計模式。
下面是基本的編程流程:
順序
這是最基本的流程,意指一個語句在另一個語句之後執行。在實際意義上,每一個其他的流程都可以使用一個順序的流程解決(更多的解釋在此後面)。
S1
S2
S3
.
.
.
Sn
在某些程式語言(如JavaScript)中,S3 可能在 S1 之前執行。如果 S1 被某些可能耗時較多的任務阻塞的話,例如資料庫或文件操作,我們通常此類任務稱為異步任務。有很多類似的情況需要了解。不要太擔心,當你開始程式語言學習的時候,這些都是入門要學的知識。
條件/分支
條件/分支是指根據對條件的檢測來執行的語句。這裡用到的關鍵字是 if。它是最常用的代碼流程之一。
下面是最簡單的條件語句:
if (condition) then:
S1
上面的例子中,可能會執行 S1,也可能什麼都不做。S1 僅在給定的條件為真的時候才會執行。
接下來是另一個條件語句的示例:
if (condition) then:
S1
S2
else:
S3
S4
通過閱讀我們知道它會根據條件執行 S1-S2 或 S3-S4。如果條件為真,S1 和 S2 會執行,否則執行的是 S3 的 S4。實際上下面這個是順序流程:
S1
S2
還有多條件分支的樣式:
if (condition1) then:
S1
else if (condition2) then:
S2
else:
S3
這裡,如果 condition1 為真,會執行 S1。否則會檢測 condition2,如果它為真,執行 S2。依此類推。
在多條件語句情況下,多數程式語言都提供了 switch 語句。下面是 switch 語句風格的代碼:
switch value:
case condition1:
S1
break
case condition2:
S2
break
default:
S3
condition1 和 condition2 都會與 switch 語句中的值進行比較,如果其中一個比較結果為真,則對應 case 語句中的代碼塊會被執行。
還有其它一些條件流程。某些是你決定學習的語言所特有的,比如條件運算符(: ?),還有其它增強分支的關鍵字,比如 cycle 和 break。一定要花時間去理解條件/分支流程。
迭代/重複/循環
迭代/重複流程會讓語句在某種條件下運行很長時間,直到給定的條件不再為真才停止執行。
下面是這種模式的示例:
while (condition):
S1
S2
上面的示例中,語句 S1 和 S2 可能只執行一次,也可能執行很多次,也可能根本不會執行。如果給 while 語句的條件 condition 為真,S1 和 S2 就會執行。while 每次都會檢查 condition,只要 condition 為真,S1 和 S2 就會一直執行下去。
直到 condition 變成 false 的時候,對 S1 和 S2 的執行才會停止。
上例如果前三次條件都為真,結果如下:
S1
S2
S1
S2
S1
S2
上面的是什麼流程?如果你回答是順序流,那麼你回答正確。正如我們看到的,其它流程會被解析為順序流。
下面是另一個迭代模式:
do:
S1
S2
while (condition)
這個示例中,S1 和 S2 至少會被執行一次。這是因為執行語句是在條件檢測之前。
多數程式語言中,像 do 和 while 這樣的關鍵字用於實現重複流程。還有一個常用的關鍵字是 for。下面是 for 語句的常見形式。
for (initialvalue; condition; decrement/increment initialvalue):
S1
S2
很多語言還有 foreach 用於遍歷像數組或結構體這類複雜對象的每一個元素。
小測試
識別下列Python代碼片段中的編碼流:
numlist=[]
cnt=0
while cnt >= 0:
m=int(raw_input())
if m < 0:
break
numlist.append(m)
cnt=cnt+1
總結
這裡涵蓋的流程是基本流程。 有一種方法可以將一堆代碼組合在一起,並給它們一個名稱。 這樣一來,您可以在需要時立即調用這一堆代碼。 這被稱為程序。 在一堆代碼執行一些操作並返回值的情況下,您就有了一個函數。
程序和功能的實現方式因語言不同而存在差異。 你不能跳過這些來獲得任何語言的基礎知識。 它們對組織您的代碼非常重要。 實際上,這是代碼開始構建的塊也是被稱為模塊化編程的地方。
還有其他流程,您將在學習函數時學習一個流程,這時想到的就是遞歸。
然而,您會發現在程序和函數中仍然是我們在這裡介紹的令人敬畏的編碼流程 - 順序,條件和循環/迭代流程。
小測驗的答案
在下面 Python 代碼片段中找到其中的編碼流程。
Sequential flow 順序流
Iteration 迭代
while 語句
Conditional 條件
if 語句
繼續前進
現在你已經了解計算機編程最基本的概念。如果你想學更多東西,或者想把軟體開發當作職業,那你還需要深入學習。有很多資源可以幫助你學習。知道如何根據自己的經驗和水平挑選資源非常重要。
儘量不要被你朋友圈中比你更有經驗的程式設計師所說的新詞彙淹沒。你可以使用一個便箋來記錄這些術語,但不要急於搞明白它們的意思。深入學習和實踐之後,你會趕上的。
這裡有一些資源可以幫助你開始編碼生涯,你可以從這裡開始建立自己的編程基礎:
注意:我不推薦過度閱讀同樣的主題。我更相信在將學到的東西付諸實踐,也就是練習。因此我沒在這裡列出大量的資源供你學習。如果你已經不是初學者,可以嘗試基於自己已經學到的東西,從 Google 搜索點別的東西來學習。
————— END —————
李彥宏:如果有機會吞併騰訊和阿里,我一定兩個都要
程式設計師如何提高加速度,兩年做到待遇 20K+?
程式設計師自白:為什麼我們能將月入五萬活得像月薪五千