本節是第五講的第二小節,上節為大家介紹了Python發展歷程、安裝、以及開發工具IDLE的使用等,本節將為大家介紹Python語言的特點,共有8大特點(要素),幫助大家快速了解Python語言。由於內容較多,分為上、下兩部分展示。
控制流語句(Control Flow Statements)#要素5
在Python中,一塊代碼,也就是說一條或多條語句組成的序列,稱為suite。由於 Python中的某些語法要求存在一個suite, Python就提供了關鍵字pass, pass實際上是 一條空語句,不進行任何操作,可以用在需要suite (或者需要指明我們已經考慮了特殊情況)但又不需要進行處理的地方。
if boolean_expression1:
suite1
elif boolean_expression2:
suite2
.
elif boolean_expressionN:
suiteN
else:
else_suite
與if語句對應的可以有0個或多個elif分支,最後的else分支是可選的。如果需要考慮某個特定的情況,但又不需要在這種情況發生時進行處理,那麼可以使用pass 作為該分支的suite。對習慣於C++或Java語法的程式設計師而言,第一個突出的差別是這裡沒有圓括號與方括號,另一個需要注意到的情況是冒號的使用,冒號是上面語法中的一個組成部分,但是最初使用時容易忘記。冒號與else、elif一起使用,實質上在後面要跟隨suite的任意地方也需要使用。
與大多數其他程序設計語言不同的是,Python使用縮排來標識其塊結構。由於suite是使用縮排指明的,因此很自然地帶來的一個問題是:使用哪種縮排?Python風格指南建議的是每層縮排4個空格,並且只有空格(沒有制表符)。大多數現代的文本編輯器可設置為自動處理這一問題(IDLE的編輯器當然也是如此,大多數其他可以感知Python代碼的編輯器也是如此)。
while boolean_expression:
suite
while語句用於0次或多次執行某個suite,循環執行的次數取決於while循環中布爾表達式的狀態,下面給出其語法格式:
while True:
item =get_next_item()
if not item:
break
process_Item(item)
break語句的作用是將控制流導向到break所在的最內層循環也就是說跳出循環;continue語句的作用是將控制流導向到循環起始處。
for variable in iterable:
suite
countries = ["Denmark", "Finland", "Norway」, "Sweden"]
for country in countries:
print(country)
Python的for循環語句重用了關鍵字in (在其他上下文中,in是一個成員操作符), 並使用如下的語法格式。與while循環類似,for循環也支持break語句與continue語句。variable將逐一引用iterable中的每個對象,iterable是可以迭代的任意數據類型, 包括字符串(此時的迭代是逐個字符進行)、列表、元組以及Python的其他組合數據 類型。
Python的很多函數與方法都會產生異常,並將其作為發生錯誤或重要事件的標誌。與Python的其他對象一樣,異常也是一個對象,轉換為字符串時(比如,列印時), 異常會產生一條消息文本。異常處理的簡單語法格式如下:
try:
try_suite
except exception1 as variable1:
exception_suite1
.
except exceptionN as variableN:
exception_suiteN
要注意的是,as variable部分是可選的。我們可以只關心產生了某個特定的異常, 而不關心其具體的消息文本。
異常處理以如下的邏輯工作:如果try塊中的suite都正常執行,而沒有產生異常, 則except模塊將被跳過;如果try塊中產生了異常,則控制流會立即轉向第一個與該異常匹配的suite—這意味著,跟隨在產生異常的語句後面的suite中的語句將不再執行;如果發生了異常,並且給定了 as variable部分,則在異常處理suite內部variable引用的是異常對象。
如果異常發生在處理except塊時,或者某個異常不能與任何一個except塊匹配,Python就會在下一個封閉範圍內搜索一個匹配的except塊。對合適的異常處理模塊的搜索是向外擴展的,並可以延展到調用棧內,直到發現一個匹配的異常處理模塊,或者找不到匹配的模塊,這種情況下,程序將終止,並留下一個未處理的異常,此時, Python會列印回溯信息以及異常的消息文本。
s = input(「enter an integer: 「)
try:
i = int(s)
print(「valid integer entered:」, i)
except ValueError as err:
print(err)
'''
如果用戶輸入的是3.5,那麼輸出為:
invalid literal for int() with base 10: '3.5'
但是如果用戶輸入的是13,那麼輸出為:
valid integer entered: 13
'''
算術操作符(Arithmetic Operators)#要素6
Python提供了完整的算術運算符集,包括用於基本四則數學運算的操作符+、-、 *、/此外,很多Python數據類型可以使用一些增強的賦值操作符,比如+=與*=。在操作數都是整數時,+、-、*等操作符可以分別按正常的加法、減法、乘法進行運算。要注意的是,像大多數程序設計語言一樣,在Python中,-號既可以作為單值操作符(否定),也可以作為二元操作符(減法),Python與一般程序語言不同的地方在於對除法的處理,除法操作符會產生一個浮點值,而不是一個整數值;很多其他程序設計語言都是 產生一個整數值,並剝離掉小數部分。如果需要產生一個整數值結果,我們可以使用 int()進行轉換(或使用剝離操作符//,後面會進行討論)
>>> 12 / 3
4.0
>>> 3 / 2
1.5
>>> a = 5
>>> a
5
>>> a += 8
>>> a
13
第一點需要記住的是,int數據類型是固定的——也就是說,一旦賦值,就不能改變,因此,對固定的對象使用增強的賦值操作符時,實際上是創建一個對象來存儲結果,之後,目標對象引用重新綁定,以便引用上面創建的結果對象,而不再引用以前的對象。根據這一原理,前面的例子中,在執行到a+=8語句時,Python會計算a+8, 將所得結果存儲到新的int對象,之後將a重新綁定為引用這個新的int對象(如果a 正在引用的原始對象沒有其他的對象引用,就會進入垃圾收集流程)。
第二個微妙之處在於,a operator b與a = a operator b並不完全一致。前者只査詢一次a的值,因而具有更快的可能性。此外,如果a是一個複雜的表達式(例如,列表元素的索引位置計算,如items[offset +index]),那麼使用增強的賦值操作符時後者較少出錯。這是因為,如果計算過程需要改變,那麼維護者只需要改變一次,而不是兩次。
Python重載(對不同的數據類型進行重用)了操作符+與將其分別用於字符串與列表,前者表示連接,後者表示追加字符串並擴展(追加另一個字符串)列表:
>>> name = 'John"
>>> name + "Doe"
'JohnDoe'
>>> name += " Doe"
>>> name
'John Doe'
>>> seeds =[「sesame」, "sunflower"]
>>> seeds += ["pumpkin"]
>>> seeds
['sesame', 'sunflower', 'pumpkin']
由於列表是可變的,使用+=後,原始的列表對象會被修改,因此,沒有必要對seeds進行重新綁定。
既然Python語法聰明地隱藏了可變的與固定的數據類型的區別,為什麼還需要規定這兩種數據類型?原因最可能還是在於性能。在實現上,固定的數據類型具有比可變的數據類型更加高效的潛力(因為這些固定的數據類型從不改變)。此外,有些組合 數據類型(比如集合)只能操縱固定的數據類型。另一方面,可變的數據類型使用起來更加方便。
#列表+=操作符右邊的操作數必須是一個iterable,如果不是,就會產生意外
>>> seeds += 5
Traceback (most recent call last):
TypeError: 'int' object is not iterable
#對列表進行擴展的正確方法是使用iterable對象,例如
>>> seeds += [5]
>>> seeds
['sesame', 'sunflower', 'pumpkin', 5]
>>> seeds = ["sesame", "sunflower", 「pumpkin」]
>>> seeds += "durian"
>>> seeds
['sesame', 'sunflower', 'pumpkin', 'd','u','r','i','a','n']
列表的+=操作符會擴展列表,並將給定的iterable中的每一項追加到列表後。由於字符串是一個iterable,這會導致字符串中的每個字符被單獨添加。如果我們使用 append()方法,那麼該參數總是以單獨的項目添加。
輸入/輸出(Input/Output)#要素7
Python提供了內置的input()函數,用於接收來自用戶的輸入。這一函數需要一個可選的字符串參數(並將其在控制臺上列印),之後等待用戶輸入響應信息或按Enter鍵(或 Return鍵)來終止。如果用戶不輸入任何文本,而只是按Enter鍵,那麼input()函數會返回一個空字符串;否則,會返回一個包含了用戶輸入內容的字符串,而沒有任何行終止符。
print("Type integers, each followed by Enter; or just Enter to finish")
total = 0
count = 0
while True:
line = input("integer:")
if line:
try:
number = int(line)
except ValueError as err:
print(err)
continue
total += number
count += 1
else:
break
if count:
print("count =", count, "total =", total, "mean =", total / count)
以下為該程序的運行情況:
Type integers, each followed by Enter; or just Enter to finish
number: 12
number: 7
number: lx
invalid literal for int() with base 10: 'lx'
number: 15
number: 5
number:
count = 4 total = 39 mean = 9.75
儘管這一程序很短,但是程序魯棒性很好。如果用戶輸入的是無法轉換為整數的字符串,那麼這一問題會被異常處理流程捕捉,並列印一條相關信息,之後程序流程轉向到循環的開始處(「繼續循環")。最後一個if語句的作用是:如果用戶不輸入任何數值,那麼摘要不會輸出,並且被0除也會避免。
函數的創建及調用(Creating and Calling Functions)#要素8
Python提供了一種將多個suites封裝為函數的途徑,函數就可以參數化,並通過傳遞不同的參數來調用。下面給出的是用於創建函數的通常語法格式:
def functionName(arguments):
suite
這裡,arguments是可選的;如果有多個參數,就必須使用逗號進行分隔。每個 Python函數有一個返回值,默認情況下為None,除非我們使用語法return value來從函數返回,此時value是實際的返回值。返回值可以是僅僅一個值,也可以是一組值。調用者可以忽略返回值,並簡單地將其丟棄。
要注意的是,def是一條與賦值操作符工作方式類似的語句。執行def時,會創建 一個函數對象,同時創建一個帶有指定名的對象引用(引用該函數對象)。由於函數也是對象,因此可以存儲在組合數據類型中,並作為參數傳遞給其他函數,後續章節中將展示這一點。
在編寫交互式的控制臺應用程式時,一個頻繁的需求是從用戶處獲取整數,下面 給出了一個完成這一功能的函數:
def getint(msg):
while True:
try:
i = int(input(msg))
return i
except ValueError as err:
print(err)
age = getint("enter your age:")
這個函數有一個參數msg,在while循環內部,用戶被要求輸入一個整數,如果輸入無效,則會產生一個ValueError異常,並列印錯誤消息,同時循環也將迭代進行。輸入有效的整數後,會返回給調用者。
Python模塊實際上就是包含Python代碼的.py文件,比如自定義函數與類(自定義數據類型)的定義,有時候還包括變量等。要使用某個模塊內的函數功能,必須先導入該模塊,例如:import sys
要導入一個模塊,必須使用inport語句,其後跟隨.py文件名,但是不需要寫出該擴展名導入一個模塊後,就可以訪問其內部包含的任意函數、類以及變量。例如:print(sys.argv)
sys模塊提供了 argv變量——該變量實際上是一個列表,其首項為該程序的名稱, 第二個參數及後續的參數為該程序的命令行參數。前面兩行構成了完整的echoargs.py 程序。如果在命令行中以echoargs.py -v命令調用該程序,就會在控制臺上列印 ['echoargs.py', '-v']。(在 UNIX 上,第一條目應該是/echoargs.py')
通常,使用模塊中函數的語法格式為moduleName.fimctionName(arguments)。其中使用了我們在要素3中介紹的點(「存取屬性」)操作符。標準模塊的模塊名都是小寫字母,因此,一些程式設計師為自己編寫的模塊使用首字母大寫的名(比如,MyModule),以便區別於標準模塊。
下面看一個實例,random模塊(在標準庫的random.py文件中)提供了很多有用的函數:
import random
x = random.randint(1, 6)
y = random.choice(["apple", "banana", "cherry", "durian"])
在這些語句執行之後,x將包含一個1〜6之間(包含邊界值)的一個整數,y將包含傳遞給random.choice。函數的列表之間的一個字符串。
常規的做法是將所有import語句放在.py文件的起始處,建議程式設計師首先導入標準庫模塊,之後導入第三方庫模塊,最後才導入自己編寫的模塊。
以上內容部分摘自視頻課程05後端編程Python-2快速了解(下),更多實操示例請參照視頻講解。跟著張員外講編程,學習更輕鬆,不花錢還能學習真本領。