你曾經想知道計算機是如何工作的嗎?儘管我們不能在一篇文章裡面教會你所有的東西,但是可以通過學習如何寫出你自己的程式來獲得一個良好的開端。在這篇Python教程中,你將會學到計算機程式設計的基礎知識,使用對新手來說最棒的程式語言之一。
什麼是程式設計?
儘可能簡單的講,程式設計是編寫程式碼,命令計算機去完成某項任務的藝術。這裡講的某項任務,可以是簡單的兩數相加,或是像把飛船送入軌道這樣的複雜任務!
一個程式裡面,最小的組成部分被稱作語句(statement)——代表了對計算機做出的一條指令。
當你完成了自己的程式後,編譯器會把你寫的程式碼轉換為機器碼——計算機語言的最底層。機器碼指示中央處理器工作(central processing unit),或者叫做CPU,這裡麵包含一些諸如載入某個值或是做數學運算的步驟。
如果你曾經聽過某人說:“我編譯了我的程式”,那代表他們已經把程式碼轉換成了機器碼。
為什麼不直接寫機器碼呢?原因很顯然,程式碼具有可讀性。下面比較了Python版的程式和其對應的機器碼:
Python程式碼
1 2 3 |
print "Hello, World!" ... "Hello, World!" |
對應的機器碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
c7 3c 2a 3c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 64 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... "Hello, World!" |
很明顯為什麼你不會想要直接編寫機器碼了。但是,確實有一些人會去寫機器碼——蘿蔔白菜各有所愛嘛!
上面我們忽略了一個小問題。Python是一種解釋型語言;你並不會像上面我們暗示的那樣,把它直接編譯成為機器碼。
實際上是這樣的,Python使用一個叫做直譯器的東西。直譯器是另外一個程式,把程式碼編譯成叫做二進位制碼的東西,然後再程式執行的時候再轉換成機器碼。你等下會學到更多和直譯器有關的內容。
當你最終執行程式的時候,你剛編譯的那些機器碼會被載入到記憶體中,CPU會讀取它並執行程式。
然而,在剛開始學習使用Python程式設計的時候,你並不需要完全理解編譯器的內部工作原理,但是你必須確保你已經安裝了Python。
準備開始
如果你在使用Mac,你走運了——Python已經預裝在Mac中了。在Mac中使用Python直譯器,開啟**終端**(**Terminal.app**);你可以再應用程式/工具資料夾下找到它,或者在Spotlight中輸入,像這樣:
開啟終端後,輸入下面的指令然後按下回車:
1 |
$ python |
你會看到類似下面這樣的結果:
注意:如果你沒有得到上面的結果,把輸出結果複製到論壇,我們會盡力幫助你的!**
Windows
在Windows上,這一過程稍微有點複雜——但是還是要說,大部分的東西還是在Windows!上:]
首先,在瀏覽器中訪問Python官網的下載頁面。
滾動頁面跳過所有的Python 3.x.x版本,直接到Python 2.7.x。下載Windows安裝包(Windows installer),執行,按照指引來做,接受預設的選項。
一旦安裝包安裝完成,你就可以啟動它了。
在Windows Vista或者Windows 7上,這樣啟動:
1. 點選左下角的開始選單。
2. 點選所有程式
3. 開啟Python資料夾
4. 雙擊IDLE直譯器
如果你使用Windows 8,這樣啟動:
1. 點選左下角開始選單
2. 在搜尋框中輸入IDLE
3. 點選IDLE(Python GUI)
不管你是如何啟動直譯器的,你應該確保它能夠工作,在終端中輸入如下命令,或者是在Windows的命令提示符中輸入如下指令並按回車:
1 |
print “Hello World!” |
儘管看上去並不像,但是你已經寫完你第一個Python程式了!在學習大多數語言的時候,列印出Hello, World被認為是一個起點。
python
命令指示計算機在螢幕上輸出後面的字元——而不是在你的印表機上列印!注意“Hello World”兩邊的引號,引號中的任何東西都被看做常規的文字兒不會被解釋為一個指令。
變數
變數,是在計算機記憶體中存放資料的一種方式;在你的程式中你會經常用到它們。在一些語言中,變數有特定的型別,指明瞭這些變數屬於那些類。
在Python中,你不需要宣告變數的型別。現在暫時不需要在意這些細節;在本教程稍後的章節中你會學到關於這個內容的知識。
在直譯器中輸入如下命令並按回車:
1 |
hello = "Hello World!" |
這麼做宣告瞭hello變數並且把Hello World賦值類了它。現在,你不需要在程式中需要“Hello World”的地方輸入這個字串了,取而代之的是,你可以使用hello這個變數。
在直譯器中輸入如下命令並按回車:
1 |
print hello |
這個指令會產生和Hello World例子相同的結果,但是它是列印出了hello這個變數的值。
變數同樣也可以用來儲存數字。在直譯器中輸入如下命令:
1 2 3 4 5 |
x = 5 print x y = 10 z = x + y print z |
注意:從現在起,你可能要輸入多行語句,只需要在每行末尾輸入回車即可**
先猜猜看上面的程式碼會做些上面,再看下面的答案:
這段程式碼會列印5,然後列印15.第一個print
語句列印了被你賦值為5的變數x。然後它列印了y+x的結果。因為y被賦值為10,x是5,所以列印了15。
對於你生命中的絕大部分程式變數是其核心。在你學習本教程的過程中,你會對變數變得非常熟悉。
變數型別
在之前的教程中你已經遇到了變數,但是我們並沒有仔細的介紹它。不同的變數型別儲存不同型別的值。
注意:對於全部的內建型別,請檢視Python官方文件
到目前為止,你僅僅和Python中兩個基本型別打過交道:整型(integers
)和字串型(strings
),你還會遇到布林型別(boolean
),你可以用它來儲存True
或者False
。
下面有關於這些變數型別的一點介紹:
整型
一個整型數,是一個整數。整型數的範圍,在32位機上是-2147483648 到 2147483647 ,在64位機上是 -9223372036854775808 to 9223372036854775807。
你可以像這樣簡單的輸入一個數字來建立整型,不需要任何引號:
1 |
foo = 5 |
字串型
字串是一串字元;你可以使用字串來表示很多東西,從螢幕上的任何文字到整個網頁請求。
通過用引號包含一串字元來建立字串,就像下面一樣:
布林型別
布林型別代表了True或False。
你通過使用大寫開頭的True或False 來建立布林型別,不需要引號,就像下面這樣:
1 |
`isFoo = True` |
變數兩邊沒有引號;如果你用引號包含了True,你則是建立了一個字串型別!
字串連線和整數相加
Python讓兩個字串鉤在一起變得很容易,我們也稱之為字串連線。你可以使用str()
把一個整數型別轉換成字串,相反,你也可以使用int()
把一個字串轉換為整型。
在你的直譯器中輸入下面指令:
1 2 3 |
"1" + "1" 1 + 1 1 + int("1") |
下面解釋上面程式碼做了些什麼:
- – 第一條語句連線了兩個字串;引號確保了這兩個數字被當做字串除了。結果就是”11″。
- – 第二條語句把兩個數作為整數相加,結果是2.
- – 最後一條語句把一個整數和另一個被轉換為整數的字串相加,結果還是2。
if 語句
if語句檢查某個條件是不是真,如果是,則執行一段程式碼。條件語句通常是這樣的形式值 - 操作符 - 值
,通常是比較兩個值。
比如,你可以使用x == 0
評價一個值是不是等於0,==
是等於操作符。
下面是Python中的一些常見比較
1 2 3 4 5 6 |
a == b: #Checks if a and b are equal a != b: #Checks if a and b are not equal a > b: #Checks if a is greater than b a < b: #Checks if a is less than b a >= b: #Checks if a is greater than or equal to b a <= b: #Checks if a is less than or equal to b |
if語句是如下的形式:
1 2 |
if conditional: do_statements_here |
注意到在這裡執行某些語句
這行是如何縮排的。這是你在Python宣告程式碼塊的方式。同一個程式碼塊中的每一行都必須和其他所有行縮排相同的製表符或是空格;這是語言強制規定的。換句話說,不要混合使用製表符和空格。建立一個if語句,在直譯器中輸入如下命令:
迎接你的是神祕的提示符...
;這表示直譯器在等待你輸入程式碼塊的內容,按下Tab鍵,輸入第二行:
再次按下回車,你的游標回到了控制檯的最左邊。要想再輸入一個程式碼塊語句,只需要再按Tab。如果你輸入完了,按下回車告訴直譯器你的程式碼塊已經完成。
看一下下面的例子:
1 2 3 4 5 6 |
x = 10 y = 10 if x == 10: print "x equals 10!" if x == y: print "x equals y!" |
第一條語句判斷x是不是等於10,如果是的話,列印x equals 10!
。另外一個if語句判斷x是否等於y,如果是的話,列印"x equals y!"
.
for迴圈
for迴圈再Python中遍歷列表中的專案並且把當前專案賦值給變數。一個列表幾乎可以是任何東西的集合!
輸入下面的程式碼,並且像下面這樣縮排:
1 2 |
for x in range(10): print x |
在這個例子中,range(10)
生成了數字0到9的一個列表。for迴圈一次把範圍內的數字賦值給x。就像if語句一樣,for迴圈執行它下面縮排中的每個語句。在上面的例子中,縮排的程式碼塊裡面只包含了一個單獨的語句。
因為print被呼叫了10次,對於列表中的每個專案呼叫一次,這個程式會列印0到9的數字。
函式
函式是可以重用的程式碼塊,用來完成某個特定的程式碼塊。比如說,你可以寫一個函式用來把兩個數相加,或是列印一個字串。你可以像下面例子展示的一樣定義並呼叫函式。
1 2 3 4 |
def hello(): print "Hi" for x in range(3): hello() |
在執行前,你可以猜猜看這個程式的輸出是什麼嗎?答案見下文:
它會列印出“Hi”三次,因為for迴圈會呼叫這個hello函式三次。
縮排的程式碼塊定義了你呼叫函式時要執行的語句。因為print "Hi"
是這個函式裡唯一縮排的語句,所以當呼叫函式時也是唯一被執行的語句,而不是下面的幾行。
你可以通過輸入結尾帶有一對括號的函式名來呼叫函式,像之前展示的那樣,hello()
呼叫了你上面呼叫的函式。函式有點類似有圍牆的花園:它們不能看到它們那一畝三分地意外的世界。這個被稱作變數作用域
。如果你想要讓一個函式和外界的資料協同工作,你需要把這些資料傳遞給函式。
使用引數
(arguments)可以達到這一目的——不不不,函式之間是不會相互爭吵(argue)的!
引數是一個你傳遞給函式的一個變數;然後函式就可以在內部使用這個引數的值了。
你可以像下面這樣宣告一個帶參函式:
1 2 |
def add(a, b): print a + b |
上面的函式定義了兩個引數,a和b,放在括號裡面,用逗號相互隔開。當你呼叫這個函式的時候,直譯器會吧a和b的值設定為你傳入變數的值。
看一下下面這個例子:
1 2 3 |
def add(a, b): print a + b add(1,2) # prints 3! |
在上面的例子中,add(1,2)
這條語句把a和b分別設定為1和2。然後函式列印了你傳入的兩個數的和。上面的例子列印了計算結果——但是如果你想要用這個計算結果做些事情呢?如果你想要把這個函式的結果加上別的一個值呢?
為了做到這一點,你需要給你的函式加一個return 語句
。
考慮如下程式碼:
1 2 3 |
def add(a,b): return a + b print add(2, 2) + 1 |
在上面的例子中,你的函式像之前一樣把兩數相加,但是return
(返回)語句把兩數和傳回了函式呼叫語句。
這意味著上面的print
語句得到了add(2,2)返回的值然後把它加1,最後會給你的結果是5。
While 迴圈
while迴圈和for迴圈類似。for迴圈一直進行,直到到達列表的末尾,但是while迴圈會不定的迴圈,直到給定條件的值等於False。一個while迴圈的典型結構是下面這樣:
1 2 |
while (conditional): run_statement |
通常,條件變數會在迴圈執行過程中更新。在直譯器中輸入下面的程式,來看看這一過程:
1 2 3 4 |
x = 0 while x < 10: print x x += 1 |
這個程式的行為類似於上面的for迴圈,但是使用了while迴圈。這是上面程式所做的事情:
1. 給x賦值0
2. 檢查是否滿足 x < 10
3. 如果x < 10
的值是True
, 執行下面的程式碼塊. 如果是 False
退出迴圈
4. 列印x
5. 把 x
值加1
使用while迴圈需要注意一件事,就是不要建立死迴圈。
在直譯器中輸入下面的程式,來看看死迴圈是什麼樣的:
1 2 3 4 |
x = 0 while True: print x x += 1 |
哇啊——終端瘋了吧?按Ctrl+C來終止程式吧。
剛才發生了什麼?如果你仔細看,你會發現while迴圈的條件,True永遠無法變成False,所以這段程式碼會以CPU能夠執行的最快的速度列印數字。
這個故事告訴我們:當寫while迴圈的時候要時刻保持小心,因為你程式碼裡面的無限迴圈,對於真實世界來講,不太會是什麼好事!
使用True作為while迴圈的條件是有可能的,尤其是當你不知道要迴圈多少次的時候。但是你需要一些技巧來退出這個迴圈。
在直譯器中輸入下面的程式碼:
1 2 3 4 5 6 |
x = 0 while True: print x x += 1 if x > 10: break |
這樣就好多了!上面的程式碼會列印0到10然後退出。這裡用到的技巧是break語句,它會直接跳出迴圈。不論出於何種原因,如果你想要在for迴圈中提前跳出,也可以使用這個技巧。
捕獲使用者輸入
Python中一件很酷的事情是可以非常簡便的以文字的方式獲取輸入使用者輸入。輸入是指任何從外部提供給程式的資料,比如文字或者是其他會影響程式行為的指令。
在你的直譯器中輸入下面程式碼:
1 2 |
name = raw_input("What is your name? ") print "Hello, " + name |
上面的程式碼首先會讓你進行輸入;一旦使用者輸入了問題的答案,程式會把它賦值給name變數。這一過程完成後,程式會連線字串“Hello,”和變數name 的內容。
raw_input()函式是Python內建函式;它完成列印從控制檯輸入字串的工作,捕獲使用者輸入的文字,然後把它們作為函式值返回。
利用上面捕獲輸入的技術,你可以建立簡單的計算器。在你的直譯器中輸入下面的程式碼:
1 2 3 |
a = raw_input("Number 1: ") b = raw_input("Number 2: ") print int(a) + int(b) |
首先,你捕獲了兩個使用者輸入的值然後把它們分別賦值給a和b。然後你把他們轉換成了整型並相加。
為什麼要有轉換這一步呢?僅僅是因為直譯器中所有的輸入都是以字串形式進行的,而你是希望吧兩個整數的值相加。
如果你不轉換這些字串為整數,你覺得會怎樣呢?沒錯,程式會連線你輸入的字串,這並不是你想要的!
匯入
在我們深入研究匯入之前,介紹一下Python的模組是必要的。一個模組,是一組Python函式的集合,你希望在不同的程式中重用它們。匯入一個模組等價於從一個模組中把所有的程式碼取出來放到你自己的程式裡面所以你可以在任何時候去使用他們,但是又不需要去剪下和複製,哪怕是一行程式碼!
在Python社群中,存在著大量的模組,但是目前來講,你僅會接觸到隨機數模組(random module)。
要匯入模組,在直譯器中輸入下面的程式碼:
1 |
import random |
一旦匯入了模組,你就可以像下面這樣使用它了:
1 |
print random.randint(0, 100) |
這將會列印0到100間隨機的整數;很直觀的東西。到目前為止你已經學到很多知識了,足以把他們揉在一個小程式裡來練習一下你目前學到的知識了!
猜謎遊戲
這將是你辛苦學習Python程式設計得到的回報。你將創造屬於你自己的猜謎遊戲!
首先,你需要一個與在直譯器中一句一句直接執行程式相比更好的方式。
為了做到這一點,你需要建立Python檔案。
Mac
在Mac系統下建立Python檔案,在終端中輸入下面的命令:
1 2 |
$ touch guess.py $ open -t guess.py |
這將會使用touch
命令建立一個空的guess.py
檔案,然後通過open -t
命令,使用預設的文字編輯器開啟它,
一旦你的Python檔案中有了一些內容後,你就可以在終端中輸入python guess.py
來執行它。
Windows
在Windows系統下,點選IDLE中的檔案按鈕(File) 找到新建檔案(New File)。你會發現一個文字編輯器映入眼簾,你可以在裡面輸入你的新程式。
再次點選檔案按鈕,選擇儲存。把檔名命名為guess.py
然後把它儲存在你想要儲存的地方。
執行你的程式,在選單中選擇RunRun,就像這樣:
遊戲時間!
猜謎遊戲將會生成一個隨機數,然後在一個迴圈中,反覆詢問遊戲者他們的猜測結果。如果使用者猜中,則結束迴圈;否則程式會提醒使用者他們的猜測是過高還是過低並繼續詢問結果直到猜中。
1 2 |
import random number = random.randint(0, 100) |
上面這段程式會匯入隨機數模組,然後生成一個0到100之間的隨機數並把它儲存在變數number中。
接下來,你需要詢問遊戲者他們的答案。把這些程式碼加到程式的後面:
1 |
guess = raw_input("Guess the Number: ") |
這段程式碼,和你猜的一樣,讓使用者輸入它們的答案並且把它儲存在guess變數中。記住,現在這個變數是一個字串,你需要把它轉換為整型。
在程式中新增下面的程式碼,就加在上面的程式碼後面:
1 |
guess_int = int(guess) |
這個程式碼把使用者輸入的字串轉換為整型然後賦值給guess_int變數。
下面你需要比較使用者猜測的值和隨機數的大小。
在程式結尾新增下面的程式碼:
1 2 3 4 5 6 |
if number > guess_int: print "Too low!" if number < guess_int: print "Too high!" if number == guess_int: print "You got it!" |
點選選單按鈕的RunRun Module或是在終端中輸入python guess.py
來執行程式;當程式提示你的時候,輸入數字。發生了什麼?程式在你輸入數字後會把結果顯示到螢幕上然後就停止了。哎呀!
你想讓程式迴圈的詢問你結果直到你猜中。你需要用一個running變數來新增這個功能。
1 |
running = True |
running會被用在while迴圈中來控制你程式的迴圈。當使用者輸入正確的答案,程式會把running變數賦值為False然後while就會停止。
在你讓使用者輸入結果的前面新增下面這段程式碼:
1 2 3 |
while running: guess = raw_input("Guess the Number: ") ...etc |
下面,縮排剩下的程式碼到同一層,這樣while迴圈才能認出它們是迴圈中的程式碼塊。
最後,你需要新增使用者獲勝時,把running賦值為False的語句:
1 2 3 |
if number == guess_int: print "You got it!" running = False |
確保if下面的兩行程式碼被縮排兩層。
執行你的程式,現在再試一下。你需要多少回才能猜中正確答案?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Guess the number: 50 Too Low! Guess the number: 75 Too Low! Guess the number: 87 Too High! Guess the number: 80 Too Low! Guess the number: 82 Too Low! Guess the number: 84 Too High! Guess the number: 83 You Got It! |
你最終的程式看上去是這個樣子的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import random running = True number = random.randint(0, 100) while running: guess = raw_input("Guess the Number: ") guess_int = int(guess) if number > guess_int: print "Too low!"? if number < guess_int: print "Too high!" if number == guess_int: print "You got it!" running = False |
恭喜你——你已經寫出了你的第一個Python程式。別不是那麼難,對吧?
從這裡,到何方?
現在你已經完成了Python新手教程,我打賭你一定渴望一次挑戰。嘗試在你的程式中新增如下功能:
- 猜測次數統計
- 更大的隨機數產生範圍
- 一個電腦操控的遊戲對手
如果你想要做一個稍微複雜一點的遊戲,請看我的另一個教程:《Beginning Game Programming for Teens with Python》(伯樂線上翻譯組已翻譯上篇。)
如果你有任何的評論或是反饋,請到論壇分享!
打賞支援我翻譯更多好文章,謝謝!
打賞譯者
打賞支援我翻譯更多好文章,謝謝!
任選一種支付方式