翻譯:《實用的Python編程》01_02_Hello_world
目錄 | 上一節 (1.1 Python) | 下一節 (1.3 數字)
1.2 第一個程序
本節討論有關如何創建一個程序、運行解釋器和調試的基礎知識。
運行 Python
Python 程序始終在解釋器中運行。
解釋器是一個“基于控制臺”的應用程序,通常從命令行 shell 啟動。
python3
Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
老練的程序員以這種方式使用解釋器時通常都沒有問題,但對于初學者來說,這種方式并不是那么友好。您可能會使用一個為 Python 提供不同接口的環境,但是學習學會如何運行 Python 終端仍然是一項有必要了解的技能。
交互模式
當啟動 Python 時,可以進入一種交互的模式,在這種模式下,可以進行編程實驗。
如果輸入代碼完畢,這些代碼將會馬上運行。沒有 edit/compile/run/debug 等流程。
>>> print('hello world')
hello world
>>> 37*42
1554
>>> for i in range(5):
... print(i)
...
0
1
2
3
4
>>>
這就是所謂的“讀取-求值-輸出-循環”(譯者注:簡寫為 REPL,也有人譯為 “交互式解釋器”,正像 Python 這個詞一樣,為了更好地理解,這里不翻譯。),對于代碼調試和探索非常有用。
暫停:如果您不知道如何與 Python 進行交互,先停止您正在做的事情,然后弄清楚如何與 Python 進行交互。如果您正在使用的是集成開發環境(IDE),它可能隱藏在一個菜單選項或者其它窗口后面。本課程的許多部分都假定您能與解釋器進行交互。
讓我們仔細看看 REPL 的元素:
>>>提示符用于開始一個新的語句。...提示符用于繼續一個語句,輸入一個空行表示全部輸入結束,并運行所輸入的代碼。
... 提示符可能會顯示,也可能不會顯示,這取決于使用的環境。對于本課程,將 ... 提示符顯示為空白,以便于剪切、粘貼示例代碼。
下劃線 _ 保存最后的結果。
>>> 37 * 42
1554
>>> _ * 2
3108
>>> _ + 50
3158
>>>
僅在交互模式下如此(指下劃線 _ 保存最后的結果),永遠不要在程序中使用這種方式。
創建程序
程序寫在 .py 文件中。
# hello.py
print('hello world')
你可以使用你最喜歡的文本編輯器來創建這些 .py 文件。
運行程序
要執行程序,請在終端中使用 python 命令執行它。示例,在 Unix 系統的命令行中是這樣執行一個 Python 程序的:
示例,在 Unix 系統的命令行中執行程序:
bash % python hello.py
hello world
bash %
或者,從 Windows shell 中執行一個 Python 程序:
C:\SomeFolder>hello.py
hello world
C:\SomeFolder>c:\python36\python hello.py
hello world
注意:在 Windows 系統上,可能需要指定 Python 解釋器的完整路徑,例如 c:\python36\python。但是,如果 Python 是以通常的方式安裝的,可能只需要輸入程序文件名即可,例如 hello.py。
示例程序
讓我們解決以下的問題:
一天早上,您走出去,在芝加哥的西爾斯大廈旁的人行道上放 1 美元鈔票。從那以后的每一天,您放的鈔票都是前一天的兩倍。這疊鈔票需要多長時間才能超過塔的高度。
這是答案:
# sears.py
bill_thickness = 0.11 * 0.001 # Meters (0.11 mm)
sears_height = 442 # Height (meters)
num_bills = 1
day = 1
while num_bills * bill_thickness < sears_height:
print(day, num_bills, num_bills * bill_thickness)
day = day + 1
num_bills = num_bills * 2
print('Number of days', day)
print('Number of bills', num_bills)
print('Final height', num_bills * bill_thickness)
當執行 sears.py 程序的時候,會得到下面的輸出:
bash % python3 sears.py
1 1 0.00011
2 2 0.00022
3 4 0.00044
4 8 0.00088
5 16 0.00176
6 32 0.00352
...
21 1048576 115.34336
22 2097152 230.68672
Number of days 23
Number of bills 4194304
Final height 461.37344
使用此程序作為指南,您可以學到許多重要的關于 Python 的核心概念。
語句
一個 Python 程序是由一系列的語句組成。
a = 3 + 4
b = a * 2
print(b)
每個語句以換行符終止。語句會一個接一個地執行,直到控制流達到文件的末尾。
注釋
注釋是不會被解釋器執行的文本。
a = 3 + 4
# This is a comment
b = a * 2
print(b)
注釋由 # 號表示,并延伸到行的末尾。
變量
變量是一個值的名稱。可以使用從 a 到 z 的字母(小寫和大寫都可以)表示,也可以使用下劃線 _ 符號表示。數字也可以作為變量名的一部分,但第一個字符除外。
height = 442 # valid
_height = 442 # valid
height2 = 442 # valid
2height = 442 # invalid
類型
變量不需要使用值的類型進行聲明。類型與右側的值關聯,而不是變量名。
height = 442 # An integer
height = 442.0 # Floating point
height = 'Really tall' # A string
Python 是動態語言。當程序執行時,變量的感知“類型”可能會發生改變,這取決于賦給變量的當前值。
大小寫敏感
Python 語言是大小寫敏感的(即區分大小寫),大寫字母和小寫字母被認為是不同的字母。下面這些都是不同的變量:
name = 'Jake'
Name = 'Elwood'
NAME = 'Guido'
Python 語言自帶的語句總是小寫:
while x < 0: # OK
WHILE x < 0: # ERROR
循環
while 語句執行一個循環:
while num_bills * bill_thickness < sears_height:
print(day, num_bills, num_bills * bill_thickness)
day = day + 1
num_bills = num_bills * 2
print('Number of days', day)
只要 while 之后的表達式的值是 true ,while 下面縮進的語句就會被執行。
縮進
縮進用于表示放在一起的語句組。考慮前面的示例:
while num_bills * bill_thickness < sears_height:
print(day, num_bills, num_bills * bill_thickness)
day = day + 1
num_bills = num_bills * 2
print('Number of days', day)
縮進將下面的語句分組為一個重復的操作:
print(day, num_bills, num_bills * bill_thickness)
day = day + 1
num_bills = num_bills * 2
因為在末尾的 print() 語句(即 print('Number of days', day))沒有縮進,所以不屬于循環。空行只是為了可讀性,并不影響程序的執行。
縮進的最佳實踐
- 使用空格(spaces)而不是制表符(tabs)。
- 每級使用四個空格。
- 使用支持 Python 的編輯器。
Python 唯一的要求就是同一代碼塊內的縮進必須一致。例如,下面的縮進是錯誤的:
while num_bills * bill_thickness < sears_height:
print(day, num_bills, num_bills * bill_thickness)
day = day + 1 # ERROR
num_bills = num_bills * 2
條件語句
if 語句用來執行一個條件:
if a > b:
print('Computer says no')
else:
print('Computer says yes')
為了檢查多個條件,可以使用 elif來添加額外的檢查。
if a > b:
print('Computer says no')
elif a == b:
print('Computer says yes')
else:
print('Computer says maybe')
輸出
print 函數將傳入的參數值輸出成一行文本。
print('Hello world!') # Prints the text 'Hello world!'
也可以將變量進行輸出。輸出的文本將是變量的值,而不是變量的名字。
x = 100
print(x) # Prints the text '100'
如果將兩個以上的值傳遞給 print 函數,它們在輸出的時候被空格分開。
name = 'Jake'
print('My name is', name) # Print the text 'My name is Jake'
print() 函數總是將換行符放在最后。
print('Hello')
print('My name is', 'Jake')
上面的代碼會輸出如下的內容:
Hello
My name is Jake
額外的換行符可以被抑制:
print('Hello', end=' ')
print('My name is', 'Jake')
上面的代碼將會輸出如下內容:
Hello My name is Jake
用戶輸入
要讀取一行類型化的用戶輸入,可以使用 input() 函數:
name = input('Enter your name:')
print('Your name is', name)
input()函數向用戶輸出一句提示,并且返回他們的響應。
這對于一個簡短的程序、學習練習或者簡單的調試是非常有用的。
但這并未廣泛應用于實際的程序中。
pass 語句
有時候需要指定一個空的代碼塊,那么可以使用 pass 關鍵字。
if a > b:
pass
else:
print('Computer says false')
pass 語句也稱為 “無操作” 語句,它什么也不做。它用作語句的占位符,可能以后會被添加。
習題
這是需要創建 Python 文件并且運行這個文件的第一組練習。從現在開始,假定你正在編輯的文件位于practical-python/Work/ 目錄。為了幫您找到合適的 位置,已經創建了許多具有合適的文件名的空的啟動文件。請找到在第一個練習中使用的Work/bounce.py文件。
習題 1.5: 彈跳球
一個橡膠球從 100 米高的地方落下來,球每次撞到地面時彈到原來高度的 3/5 。編寫一個程序 bounce.py ,輸出一張表格,顯示前 10 次反彈的高度。
程序生成的表格大概像下面這樣:
1 60.0
2 36.0
3 21.599999999999998
4 12.959999999999999
5 7.775999999999999
6 4.6655999999999995
7 2.7993599999999996
8 1.6796159999999998
9 1.0077695999999998
10 0.6046617599999998
注意:如果使用 round() 函數,可以使輸出稍微簡潔一些。請嘗試使用 round() 函數將輸出四舍五入到 小數點后 4 位。
1 60.0
2 36.0
3 21.6
4 12.96
5 7.776
6 4.6656
7 2.7994
8 1.6796
9 1.0078
10 0.6047
習題 1.6: 調試
下面的代碼片段包含來自于西爾斯大廈問題 的代碼,它還有一個 bug:
# sears.py
bill_thickness = 0.11 * 0.001 # Meters (0.11 mm)
sears_height = 442 # Height (meters)
num_bills = 1
day = 1
while num_bills * bill_thickness < sears_height:
print(day, num_bills, num_bills * bill_thickness)
day = days + 1
num_bills = num_bills * 2
print('Number of days', day)
print('Number of bills', num_bills)
print('Final height', num_bills * bill_thickness)
將上面顯示的代碼復制并粘貼到一個名為 sears.py的新程序中。當執行 sears.py 里的代碼時,將會收到一條導致程序奔潰的錯誤信息。錯誤信息如下所示:
Traceback (most recent call last):
File "sears.py", line 10, in <module>
day = days + 1
NameError: name 'days' is not defined
讀取錯誤信息是 Python 代碼的重要組成部分。如果程序奔潰,則回溯消息的最后一行是程序為什么奔潰的實際原因。在此(NameError: name 'days' is not defined)之上,你應該可以看到源代碼片段( day = days + 1)、可識別的文件名( sears.py)和錯誤代碼的行號( line 10)。
- 哪行是錯誤的?
- 錯誤是什么?
- 解決錯誤。
- 成功運行程序。Run the program successfully
浙公網安備 33010602011771號