你曾經想知道電腦是如何工作的嗎?儘管我們不能在一篇文章裡面教會你所有的東西,但是可以通過學習如何寫出你自己的程式來獲得一個良好的開端。在這篇Python教程中,你將會學到電腦編程的基礎知識,使用對新手來說最棒的程式設計語言之一。
什麼是編程?
儘可能簡單的講,編程是編寫代碼,命令電腦去完成某項任務的藝術。這裡講的某項任務,可以是簡單的兩數相加,或是像把飛船送入軌道這樣的複雜任務!
一個程式裡面,最小的組成部分被稱作語句(statement)——代表了對電腦做出的一條指令。
當你完成了自己的程式後,編譯器會把你寫的代碼轉換為機器碼——電腦語言的最底層。機器碼指示中央處理器工作(central processing unit),或者叫做CPU,這裡麵包含一些諸如載入某個值或是做數學運算的步驟。
如果你曾經聽過某人說:“我編譯了我的程式”,那代表他們已經把代碼轉換成了機器碼。
為什麼不直接寫機器碼呢?原因很顯然,程式碼具有可讀性。下面比較了Python版的程式和其對應的機器碼:
Python代碼
print "Hello, World!"..."Hello, World!"
對應的機器碼
c7 3c 2a 3c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 285c 2a 2b 2a 5c 3c 28 5c 2a 2b 2a 5c 3c 28 5c 2a2b 2a 00 00 01 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 64 48 65 6c 6c 6f 2c 20 576f 72 6c 64 21 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000 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中輸入,像這樣:
開啟終端後,輸入下面的指令然後按下斷行符號:
你會看到類似下面這樣的結果:
注意:如果你沒有得到上面的結果,把輸出結果複製到論壇,我們會儘力協助你的!**
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的命令提示字元中輸入如下指令並按斷行符號:
儘管看上去並不像,但是你已經寫完你第一個Python程式了!在學習大多數語言的時候,列印出Hello, World被認為是一個起點。
`python` 命令指示電腦在螢幕上輸出後面的字元——而不是在你的印表機上列印!注意“Hello World”兩邊的引號,引號中的任何東西都被看做常規的文本兒不會被解釋為一個指令。
變數
變數,是在電腦記憶體中存放資料的一種方式;在你的程式中你會經常用到它們。在一些語言中,變數有特定的類型,指明了這些變數屬於那些類。
在Python中,你不需要聲明變數的類型。現在暫時不需要在意這些細節;在本教程稍後的章節中你會學到關於這個內容的知識。
在解譯器中輸入如下命令並按斷行符號:
這麼做聲明了hello變數並且把Hello World賦值類了它。現在,你不需要在程式中需要“Hello World”的地方輸入這個字串了,取而代之的是,你可以使用hello這個變數。
在解譯器中輸入如下命令並按斷行符號:
這個指令會產生和Hello World例子相同的結果,但是它是列印出了hello這個變數的值。
變數同樣也可以用來儲存數字。在解譯器中輸入如下命令:
x = 5print xy = 10z = x + yprint 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。
你可以像這樣簡單的輸入一個數字來建立整型,不需要任何引號:
字串型
字串是一串字元;你可以使用字串來表示很多東西,從螢幕上的任何文本到整個網頁請求。
通過用引號包含一串字元來建立字串,就像下面一樣:
布爾類型
布爾類型代表了True或False。
你通過使用大寫開頭的True或False 來建立布爾類型,不需要引號,就像下面這樣:
變數兩邊沒有引號;如果你用引號包含了True,你則是建立了一個字串類型!
字串串連和整數相加
Python讓兩個字串鉤在一起變得很容易,我們也稱之為字串串連。你可以使用`str()`把一個整數類型轉換成字串,相反,你也可以使用`int()`把一個字串轉換為整型。
在你的解譯器中輸入下面指令:
"1" + "1"1 + 11 + int("1")
下面解釋上面代碼做了些什麼:
- 第一條語句串連了兩個字串;引號確保了這兩個數字被當做字串除了。結果就是”11″。
- 第二條語句把兩個數作為整數相加,結果是2.
- 最後一條語句把一個整數和另一個被轉換為整數的字串相加,結果還是2。
if 語句
if語句檢查某個條件是不是真,如果是,則執行一段代碼。條件陳述式通常是這樣的形式`值 – 操作符 – 值`,通常是比較兩個值。
比如,你可以使用`x == 0`評價一個值是不是等於0,`==` 是等於操作符。
下面是Python中的一些常見比較
a == b: #Checks if a and b are equala != b: #Checks if a and b are not equala > b: #Checks if a is greater than ba < b: #Checks if a is less than ba >= b: #Checks if a is greater than or equal to ba <= b: #Checks if a is less than or equal to b
if語句是如下的形式:
if conditional: do_statements_here
注意到`在這裡執行某些語句` 這行是如何縮排的。這是你在Python聲明代碼塊的方式。同一個代碼塊中的每一行都必須和其他所有行縮排相同的定位字元或是空格;這是語言強制規定的。換句話說,不要混合使用定位字元和空格。建立一個if語句,在解譯器中輸入如下命令:
迎接你的是神秘的提示符`…`;這表示解譯器在等待你輸入代碼塊的內容,按下Tab鍵,輸入第二行:
再次按下斷行符號,你的游標回到了控制台的最左邊。要想再輸入一個代碼塊語句,只需要再按Tab。如果你輸入完了,按下斷行符號告訴解譯器你的代碼塊已經完成。
看一下下面的例子:
x = 10y = 10if 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中遍曆列表中的項目並且把當前項目賦值給變數。一個列表幾乎可以是任何東西的集合!
輸入下面的代碼,並且像下面這樣縮排:
for x in range(10): print x
在這個例子中,`range(10) ` 產生了數字0到9的一個列表。for迴圈一次把範圍內的數字賦值給x。就像if語句一樣,for迴圈執行它下面縮排中的每個語句。在上面的例子中,縮排的代碼塊裡面只包含了一個單獨的語句。
因為print被調用了10次,對於列表中的每個項目調用一次,這個程式會列印0到9的數字。
函數
函數是可以重用的代碼塊,用來完成某個特定的代碼塊。比如說,你可以寫一個函數用來把兩個數相加,或是列印一個字串。你可以像下面例子展示的一樣定義並調用函數。
def hello(): print "Hi"for x in range(3): hello()
在運行前,你可以猜猜看這個程式的輸出是什麼嗎?答案見下文:
它會列印出“Hi”三次,因為for迴圈會調用這個hello函數三次。
縮排的代碼塊定義了你調用函數時要執行的語句。因為`print “Hi”` 是這個函數裡唯一縮排的語句,所以當調用函數時也是唯一被執行的語句,而不是下面的幾行。
你可以通過輸入結尾帶有一對括弧的函數名來調用函數,像之前展示的那樣,`hello()` 調用了你上面調用的函數。函數有點類似有圍牆的花園:它們不能看到它們那一畝三分地意外的世界。這個被稱作`變數範圍`。如果你想要讓一個函數和外界的資料協同工作,你需要把這些資料傳遞給函數。
使用`參數`(arguments)可以達到這一目的——不不不,函數之間是不會相互爭吵(argue)的!
參數是一個你傳遞給函數的一個變數;然後函數就可以在內部使用這個參數的值了。
你可以像下面這樣聲明一個帶參函數:
def add(a, b): print a + b
上面的函數定義了兩個參數,a和b,放在括弧裡面,用逗號相互隔開。當你調用這個函數的時候,解譯器會吧a和b的值設定為你傳入變數的值。
看一下下面這個例子:
def add(a, b): print a + badd(1,2) # prints 3!
在上面的例子中,`add(1,2)` 這條語句把a和b分別設定為1和2。然後函數列印了你傳入的兩個數的和。上面的例子列印了計算結果——但是如果你想要用這個計算結果做些事情呢?如果你想要把這個函數的結果加上別的一個值呢?
為了做到這一點,你需要給你的函數加一個`return 語句`。
考慮如下代碼:
def add(a,b): return a + bprint add(2, 2) + 1
在上面的例子中,你的函數像之前一樣把兩數相加,但是`return`(返回)語句把兩數和傳回了函數調用語句。
這意味著上面的`print` 語句得到了add(2,2)返回的值然後把它加1,最後會給你的結果是5。
While 迴圈
while迴圈和for迴圈類似。for迴圈一直進行,直到到達列表的末尾,但是while迴圈會不定的迴圈,直到給定條件的值等於False。一個while迴圈的典型結構是下面這樣:
while (conditional): run_statement
通常,條件變數會在迴圈運行過程中更新。在解譯器中輸入下面的程式,來看看這一過程:
x = 0while 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迴圈需要注意一件事,就是不要建立死迴圈。
在解譯器中輸入下面的程式,來看看死迴圈是什麼樣的:
x = 0while True: print x x += 1
哇啊——終端瘋了吧?按Ctrl+C來終止程式吧。
剛才發生了什嗎?如果你仔細看,你會發現while迴圈的條件,True永遠無法變成False,所以這段代碼會以CPU能夠執行的最快的速度列印數字。
這個故事告訴我們:當寫while迴圈的時候要時刻保持小心,因為你代碼裡面的無限迴圈,對於真實世界來講,不太會是什麼好事!
使用True作為while迴圈的條件是有可能的,尤其是當你不知道要迴圈多少次的時候。但是你需要一些技巧來退出這個迴圈。
在解譯器中輸入下面的代碼:
x = 0while True: print x x += 1 if x > 10: break
這樣就好多了!上面的代碼會列印0到10然後退出。這裡用到的技巧是break語句,它會直接跳出迴圈。不論出於何種原因,如果你想要在for迴圈中提前跳出,也可以使用這個技巧。
捕獲使用者輸入
Python中一件很酷的事情是可以非常簡便的以文本的方式擷取輸入使用者輸入。輸入是指任何從外部提供給程式的資料,比如文本或者是其他會影響程式行為的指令。
在你的解譯器中輸入下面代碼:
name = raw_input("What is your name? ")print "Hello, " + name
上面的代碼首先會讓你進行輸入;一旦使用者輸入了問題的答案,程式會把它賦值給name變數。這一過程完成後,程式會連接字串“Hello,”和變數name 的內容。
raw_input()函數是Python內建函數;它完成列印從控制台輸入字串的工作,捕獲使用者輸入的文本,然後把它們作為函數值返回。
利用上面捕獲輸入的技術,你可以建立簡單的計算機。在你的解譯器中輸入下面的代碼:
a = raw_input("Number 1: ")b = raw_input("Number 2: ")print int(a) + int(b)
首先,你捕獲了兩個使用者輸入的值然後把它們分別賦值給a和b。然後你把他們轉換成了整型並相加。
為什麼要有轉換這一步呢?僅僅是因為解譯器中所有的輸入都是以字串形式進行的,而你是希望吧兩個整數的值相加。
如果你不轉換這些字串為整數,你覺得會怎樣呢?沒錯,程式會串連你輸入的字串,這並不是你想要的!
匯入
在我們深入研究匯入之前,介紹一下Python的模組是必要的。一個模組,是一組Python函數的集合,你希望在不同的程式中重用它們。匯入一個模組等價於從一個模組中把所有的代碼取出來放到你自己的程式裡面所以你可以在任何時候去使用他們,但是又不需要去剪下和複製,哪怕是一行代碼!
在Python社區中,存在著大量的模組,但是目前來講,你僅會接觸到隨機數模組(random module)。
要匯入模組,在解譯器中輸入下面的代碼:
一旦匯入了模組,你就可以像下面這樣使用它了:
print random.randint(0, 100)
這將會列印0到100間隨機的整數;很直觀的東西。到目前為止你已經學到很多知識了,足以把他們揉在一個小程式裡來練習一下你目前學到的知識了!
猜謎遊戲
這將是你辛苦學習Python編程得到的回報。你將創造屬於你自己的猜謎遊戲!
首先,你需要一個與在解譯器中一句一句直接執行程式相比更好的方式。
為了做到這一點,你需要建立Python檔案。
Mac
在Mac系統下建立Python檔案,在終端中輸入下面的命令:
$ 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,就像這樣:
遊戲時間!
猜謎遊戲將會產生一個隨機數,然後在一個迴圈中,反覆詢問遊戲者他們的猜測結果。如果使用者猜中,則結束迴圈;否則程式會提醒使用者他們的猜測是過高還是過低並繼續詢問結果直到猜中。
import randomnumber = random.randint(0, 100)
上面這段程式會匯入隨機數模組,然後產生一個0到100之間的隨機數並把它儲存在變數number中。
接下來,你需要詢問遊戲者他們的答案。把這些代碼加到程式的後面:
guess = raw_input("Guess the Number: ")
這段代碼,和你猜的一樣,讓使用者輸入它們的答案並且把它儲存在guess變數中。記住,現在這個變數是一個字串,你需要把它轉換為整型。
在程式中添加下面的代碼,就加在上面的代碼後面:
這個代碼把使用者輸入的字串轉換為整型然後賦值給guess_int變數。
下面你需要比較使用者猜測的值和隨機數的大小。
在程式結尾添加下面的代碼:
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變數來添加這個功能。
running會被用在while迴圈中來控制你程式的迴圈。當使用者輸入正確的答案,程式會把running變數賦值為False然後while就會停止。
在你讓使用者輸入結果的前面添加下面這段代碼:
while running: guess = raw_input("Guess the Number: ") ...etc
下面,縮排剩下的代碼到同一層,這樣while迴圈才能認出它們是迴圈中的代碼塊。
最後,你需要添加使用者獲勝時,把running賦值為False的語句:
if number == guess_int: print "You got it!" running = False
確保if下面的兩行代碼被縮排兩層。
運行你的程式,現在再試一下。你需要多少回才能猜中正確答案?
你最終的程式看上去是這個樣子的:
import randomrunning = Truenumber = 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》