目錄 | 上一節 (1.1 Python) | 下一節 (1.3 數字)python
本節討論有關如何建立一個程序、運行解釋器和調試的基礎知識。git
Python 程序始終在解釋器中運行。程序員
解釋器是一個「基於控制檯」的應用程序,一般從命令行 shell 啓動。github
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 終端仍然是一項有必要了解的技能。shell
當啓動 Python 時,能夠進入一種交互的模式,在這種模式下,能夠進行編程實驗。編程
若是輸入代碼完畢,這些代碼將會立刻運行。沒有 edit/compile/run/debug 等流程。bash
>>> 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)
)沒有縮進,因此不屬於循環。空行只是爲了可讀性,並不影響程序的執行。
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
關鍵字。
if a > b: pass else: print('Computer says false')
pass
語句也稱爲 「無操做」 語句,它什麼也不作。它用做語句的佔位符,可能之後會被添加。
這是須要建立 Python 文件而且運行這個文件的第一組練習。從如今開始,假定你正在編輯的文件位於practical-python/Work/
目錄。爲了幫您找到合適的 位置,已經建立了許多具備合適的文件名的空的啓動文件。請找到在第一個練習中使用的Work/bounce.py
文件。
一個橡膠球從 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
下面的代碼片斷包含來自於西爾斯大廈問題 的代碼,它還有一個 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
)。