練習(xí) 1. 第一個(gè)程序
警告! |
---|
如果你跳過了練習(xí) 0,那你就沒有按照這本書的正確學(xué)習(xí)方式來。另外,也不要使用 IDLE 或者 IDE。如果你跳過了練習(xí) 0,拐回去重新學(xué)習(xí)。 |
你可能已經(jīng)花費(fèi)了大量時(shí)間在練習(xí) 0 上,學(xué)習(xí)如何安裝一個(gè)文本編輯器,運(yùn)行編輯器以及 Terminal,并且學(xué)習(xí)如何操作它們。如果你還沒有做這些,就不要繼續(xù),否則你會(huì)后悔的。這種練習(xí)前的警告我再說最后一次:不要擅自跳過練習(xí)自己往前學(xué)。
把下面的本文輸入到一個(gè)名為 ex1.py
單個(gè)文件中,python 文件一般以 .py
為后綴。
ex1.py
1 print("Hello World!")
2 print("Hello Again")
3 print("I like typing this.")
4 print("This is fun.")
5 print('Yay! Printing.')
6 print("I'd much rather you 'not'.")
7 print('I "said" do not touch this.')
你的 Atom 文本編輯器應(yīng)該看起來像這樣:
如果你的編輯器看起來不完全一樣也不用擔(dān)心,只要大體一致就行。
當(dāng)你敲這個(gè)文件時(shí),你得明白:
- 左邊這些數(shù)字不是我敲上去的,它印在書上是為了講解的時(shí)候方便說明。比如“看第 5 行...”之類,所以不要把行數(shù)敲進(jìn) Python 腳本里。
- 我輸出的結(jié)果跟我在練習(xí) 1 的
ex1.py
中讓你們輸入的內(nèi)容是一模一樣的,而不是大致相同。所以每一個(gè)字符你都要嚴(yán)格按照我的要求來輸入,當(dāng)然顏色無所謂。
在終端這樣輸入就可以運(yùn)行你的 Python 文件:
python3.6 ex1.py
如果你都做對了,你就會(huì)看到和我一樣的結(jié)果,如果沒有,你肯定是哪里出錯(cuò)了。不,相信我,不是電腦的問題。
你應(yīng)該看到
在 MacOS 的 Terminal 上你應(yīng)該看到這樣的結(jié)果:
在 Windows 的 Powershell 上你應(yīng)該看到這樣的結(jié)果:
你可能會(huì)在 python3.6 命令行前面看到不同的名字,這不重要,重要的是你輸入的命令要輸出跟我一樣的結(jié)果。
如果你出錯(cuò)了你可能會(huì)看到這個(gè):
$ python3.6 python/ex1.py
File "python/ex1.py" , line 3
print (" I like typing this.
^
SyntaxError : EOL while scanning string literal
能讀懂這些錯(cuò)誤信息很重要,因?yàn)槟憬酉聛砜赡軙?huì)出現(xiàn)很多這種錯(cuò)誤,我也是。讓我們一行一行來看。
- 我們在 Terminal 運(yùn)行
ex1.py
腳本。- Python 告訴我們
ex1.py
文件的第三行出錯(cuò)了。- 它把第三行的代碼打印出來以便我們查看。
- 然后它放了一個(gè)
^
(插入符號)來指出哪里出了問題。注意到那個(gè)缺失的"
了嗎?- 最后,它輸出“SyntaxError”,并告訴我們可能的錯(cuò)誤信息。通常這些錯(cuò)誤信息都比較隱晦,但是如果你用搜索引擎搜索以下,你就會(huì)發(fā)現(xiàn)別人也遇到過這樣的錯(cuò)誤,然后你很可能就會(huì)找到問題的解決辦法。
課后練習(xí)
這個(gè)課后練習(xí)包括一些你應(yīng)該嘗試去做的東西,如果你不會(huì),可以先跳過,隨后再拐回來做。
對于這個(gè)練習(xí),試試以下操作:
- 讓你的腳本再打印出一行。
- 讓你的腳本只打印一行。
- 在任一行的開頭放一個(gè)
#
,看看會(huì)發(fā)生什么?試著弄明白這個(gè)符號的作用。
從現(xiàn)在開始,我不會(huì)解釋每個(gè)練習(xí)都是如何工作的,除非遇到特殊情況。
常見問題
以下是實(shí)際學(xué)習(xí)本節(jié)練習(xí)過程中學(xué)生們經(jīng)常會(huì)問到的一些問題:
我能用 IDLE 嗎?不,你應(yīng)該用 Terminal 或者 Powershell。如果你不知道怎么用,就去學(xué)習(xí)附錄 A 的命令行速成教程。
我怎么才能像你一樣編輯代碼時(shí)有顏色?先把你的文件另存為 .py
,比如 ex1.py
。然后你在輸入的時(shí)候就會(huì)有顏色了。
我在運(yùn)行 ex1.py
時(shí)遇到了 SyntaxError:invalid syntax
提示。你很可能是已經(jīng)運(yùn)行了 Python,然后又輸了一次 python
。關(guān)閉 Terminal,重新打開,然后只輸入 python3.6 ex1.py
。
我遇到了 can't open 'ex1.py': [Errno 2] No such file or directory.
(“無法打開‘ex1.py’:[錯(cuò)誤號 2] 沒有該文件或目錄”)。你需要和你創(chuàng)建的文件在同一個(gè)目錄(文件夾)下。你要先使用 cd
命令切換到了那個(gè)目錄下。比如,如果你把你的文件保存在 lpthw/ex1.py
,那你就應(yīng)該在運(yùn)行 python3.6 ex1.py
之前先用 cd lpthw/
切換到 lpthw/
目錄下。如果這段你看不懂,去學(xué)附錄 A 的命令行速成教程。
我的文件不運(yùn)行,我只是返回了提示符,沒有任何輸出。 你很可能以為我讓你輸入 print("Hello World!")
只是讓你輸 "Hello World!"
。并不是,你要完整地、一字不差地把代碼敲出來。
練習(xí) 2 注釋和井號
注釋在程序中非常重要,它們可以用自然語言告訴你某段代碼的功能時(shí)什么,還能在你想要暫時(shí)移除某段代碼時(shí)禁用程序的一部分。以下是如何在 Python 中使用注釋:
ex2.py
1 # A comment, this is so you can read your program later.
2 # Anything after the # is ignored by python. 3
4 print("I could have code like this.") # and the comment after 5
6 # You can also use a comment to "disable" or comment out code
7 # print("This won't run.") 8
9 print("This will run.")
從現(xiàn)在開始,我都會(huì)這樣寫代碼。你得明白不是所有的東西都得在字面上保持一致,你的屏幕和程序可能看起來跟我的不一樣,但是只要你在編輯器里輸入的文本一樣就行。事實(shí)上,我用任何文本編輯器都可以輸出同樣的結(jié)果。
你應(yīng)該看到
練習(xí) 2 會(huì)話
$ python3.6 ex2.py
I could have code like this. This will run.
再說一次,我之后可能不會(huì)將所有的截圖都貼出來,你得明白第一個(gè) $
和最后一個(gè) $
之間的內(nèi)容才是你應(yīng)該關(guān)注的。
課后練習(xí)
- 弄清楚
#
符號的作用,而且記住它的名字。(中文為井號,英文為 octothorpe 或者 pound character)。- 打開你的
ex2.py
文件,從后往前逐行檢查每個(gè)單詞,與要求輸入的內(nèi)容進(jìn)行對比。- 有沒有發(fā)現(xiàn)什么錯(cuò)誤?有的話就改正過來.
- 讀你寫的習(xí)題,把每個(gè)字符都讀出來。有沒有發(fā)現(xiàn)更多錯(cuò)誤?有的話改正過來。
常見問題
為什么在 print("Hi # there.")
里 #
就沒有被忽略? 因?yàn)? #
在一個(gè)字符串里,計(jì)算機(jī)會(huì)打印引號之間字符串的所有內(nèi)容, #
在字符串里被認(rèn)為是一個(gè)字符,而不是注釋符號。
我如何把很多行變成注釋? 在每一行前面加一個(gè) #
。
為什么我要倒著檢查代碼? 這是一個(gè)讓你的大腦不專注于每行代碼意思的小技巧,這樣做能夠讓你更準(zhǔn)確地檢查出錯(cuò)誤,可以說是一個(gè)很好用的糾錯(cuò)技巧了。
練習(xí) 3 數(shù)字和數(shù)學(xué)
每一種編程語言都得和數(shù)字、數(shù)學(xué)打交道。不用擔(dān)心:程序員總是自詡為數(shù)學(xué)天才,其實(shí)事實(shí)并非如此。如果他們是數(shù)學(xué)天才,他們就會(huì)去研究數(shù)學(xué),而不是去寫那些 bug 連篇的網(wǎng)站框架以便能開上豪車。
這個(gè)練習(xí)包含了很多數(shù)學(xué)符號。讓我們看看它們的名字,在你輸入的時(shí)候,試著說出名字,直到你爛熟于心為止。以下是這些符號的名字:
?
+
plus,加號
?-
minus,減號
?/
slash,斜杠
?*
asterisk,星號
?%
percent,百分號
?<
less-than,小于號
?>
greater-than,大于號
?<=
less-than-equal,小于等于號
?>=
greater-than-equal,大于等于號
有沒有注意到以上只是些符號,沒有運(yùn)算操作呢?寫完下面的練習(xí)代碼后,再回到上面的列表,弄明白每個(gè)符號的作用。例如 +
是用來做加法運(yùn)算的。
ex3.py
1 print("I will now count my chickens:")
2
3 print("Hens", 25 + 30 / 6)
4 print("Roosters", 100 - 25 * 3 % 4)
5
6 print("Now I will count the eggs:")
7
8 print(3 + 2 + 1 - 5 + 4 % 2 - 1 / 4 + 6)
9
10 print("Is it true that 3 + 2 < 5 - 7?")
11
12 print(3 + 2 < 5 - 7)
13
14 print("What is 3 + 2?", 3 + 2)
15 print("What is 5 - 7?", 5 - 7)
16
17 print("Oh, that's why it's False.")
18
19 print("How about some more.")
20
21 print("Is it greater?", 5 > -2)
22 print("Is it greater or equal?", 5 >= -2)
23 print("Is it less or equal?", 5 <= -2)
確保你在運(yùn)行它之前準(zhǔn)確輸入了每一行代碼,和我的要求做一下對比檢查。
你應(yīng)該看到
練習(xí) 3 會(huì)話
$ python3.6 ex3.py
I will now count my chickens: Hens 30.0
Roosters 97
Now I will count the eggs: 6.75
Is it true that 3 + 2 < 5 - 7? False
What is 3 + 2? 5
What is 5 - 7? -2
Oh, that's why it's False. How about some more.
Is it greater? True
Is it greater or equal? True
Is it less or equal? False
課后練習(xí)
- 在每一行上面,用
#
寫一句注釋,向自己解釋這行代碼的作用。- 還記得你在練習(xí) 0 中是如何啟動(dòng) Python 3.6 的嗎?再次啟動(dòng)它,把 Python 當(dāng)成一個(gè)計(jì)算器來做一些數(shù)學(xué)運(yùn)算。
- 找一些你需要計(jì)算的東西,然后寫一個(gè)新的
.py
文件。- 用浮點(diǎn)數(shù)重新寫一下
ex3.py
,讓它更精確一些,比如 20.0 就是一個(gè)浮點(diǎn)數(shù)。
常見問題
為什么 %
是一個(gè)模數(shù),而不是百分比? 這很可能只是設(shè)計(jì)者們選用的一個(gè)符號。在正常情況下你可以把它讀作百分號,但是,在編程中 %
只是一個(gè)符號。
%
是如何工作的? 可以這樣講,x 除以 y 余 J。比如 100 除以 16 余 4,%
求的就是余數(shù) J。
運(yùn)算順序是怎樣的? 在美國我們遵循 PEMDAS 規(guī)則,即“括號,指數(shù),乘,除,加,減(Parentheses Exponents Multiplication Division Addition Subtraction)。Python 也遵循這樣的規(guī)則。很多人對 PEMDAS 規(guī)則存在誤解,認(rèn)為它們是嚴(yán)格按照先后次序來的,其實(shí)并不是,乘除是同時(shí)的,加減也是同時(shí)的,所以這個(gè)規(guī)則可能寫成 PE(M&D)(A&S)
更合適。