2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

7段代碼帶你玩轉(zhuǎn)Python條件語句

 風(fēng)聲之家 2019-09-06

導(dǎo)讀:條件語句通過一個(gè)或多個(gè)布爾表達(dá)式的執(zhí)行結(jié)果(真值或假值)決定下一步的執(zhí)行方向。所謂布爾表達(dá)式,即對(duì)某個(gè)對(duì)象進(jìn)行布爾運(yùn)算,產(chǎn)生一個(gè)bool值。條件語句的運(yùn)行邏輯為:如果條件被滿足(返回真值),可以做某件事情;如果條件不滿足(返回假值),就做另一件事情,或什么也不做。

作者 | 李明江 張良均 周東平 張尚佳
來源 | 大數(shù)據(jù)(ID:hzdashuju)

通過圖1,可以對(duì)條件語句的運(yùn)行機(jī)制作有一個(gè)簡單的了解。虛線框內(nèi)是一個(gè)選擇結(jié)構(gòu),此結(jié)構(gòu)中包含一個(gè)判斷條件和兩條執(zhí)行語句,以及連接各部分的流向線。根據(jù)判斷條件(布爾表達(dá)式)返回值的情況,程序?qū)⑦x擇執(zhí)行語句1或語句2。

▲圖1 條件語句結(jié)構(gòu)
在Python中,實(shí)現(xiàn)選擇結(jié)構(gòu)最普遍的工具是if語句。此外,try語句專門用于異常處理,其內(nèi)在邏輯也符合選擇結(jié)構(gòu)。
01 if、elif與else

if語句中包含3種條件判斷句式,即if、elif和else。其中,if與elif部分都包含判斷條件,當(dāng)判斷條件都不成立時(shí),程序才能執(zhí)行else部分的代碼。

if語句最基礎(chǔ)的形式是if-else,其基本語法格式如下。

if 條件表達(dá)式:
    操作語句1
else
    操作語句2
if-else語句常用的參數(shù)及說明:
  • 條件表達(dá)式:接收布爾表達(dá)式,表示判斷條件是否成立。無默認(rèn)值

  • 操作語句:接收操作語句,表示執(zhí)行一段代碼。無默認(rèn)值

if-else語句執(zhí)行時(shí),程序首先判斷if部分條件表達(dá)式的真假。如果條件表達(dá)式返回真值,則執(zhí)行操作語句1;如果返回假值,則執(zhí)行操作語句2。
if-else語句的形式很簡單,通過條件判斷的結(jié)果即可決定下一步的執(zhí)行方向,具有兩條分支。以編寫一個(gè)賬戶密碼登錄界面為例,介紹該語句的使用,如代碼清單①所示。
  • 代碼清單① if-else語句實(shí)現(xiàn)登錄界面

In[1]:    name = input ('請(qǐng)輸入用戶名:')
    password = input ('請(qǐng)輸入密碼:')
    if name == "Lucy" and password == "123456":
        print ('****登錄成功,歡迎!*****')
    else:
        print ('-----您的輸入有誤,登錄失??!-----')    

Out[1]:    請(qǐng)輸入用戶名:Lucy
    請(qǐng)輸入密碼:123
    -----您的輸入有誤,登錄失??!-----  

In[2]:    name = input ('請(qǐng)輸入用戶名:')
    password = input ('請(qǐng)輸入密碼:')
    if name == "Lucy" and password == "123456":
        print ('****登錄成功,歡迎!*****')
    else:
        print ('-----您的輸入有誤,登錄失??!-----')    

Out[2]:    請(qǐng)輸入用戶名:Lucy
    請(qǐng)輸入密碼:123456
    ****登錄成功,歡迎!*****   

在代碼清單①中,使用input函數(shù)以支持交互式的輸入,并在函數(shù)括號(hào)內(nèi)插入文字進(jìn)行了輸入提示,增強(qiáng)了登錄界面的人性化。在if部分的條件判斷式中,使用and運(yùn)算符進(jìn)行且運(yùn)算,只有賬戶和密碼都輸入正確才能成功登錄,從而增加了安全性。

if-else語句可以縮減為單行形式,其基本語法格式如下。

操作語句1 if 條件表達(dá)式 else 操作語句2
if-else語句單行形式語法格式中的參數(shù)說明與圖1一致。如果條件表達(dá)式返回的結(jié)果為真,則執(zhí)行if前面的操作語句1,否則執(zhí)行else后面的操作語句2。
if-else語句使用單行形式的目的主要在于增加代碼的簡潔性,其基本使用方法如代碼清單②所示。
  • 代碼清單② if-else語句的單行形式

In[3]:    num1, num2 = 1190
    print('num1加num2為百分?jǐn)?shù)'if 1000 > num1 + num2 >100 else 
            print('num1加num2不為百分?jǐn)?shù)'

Out[3]:    num1加num2為百分?jǐn)?shù)
if-else語句有明顯的缺陷,即只能實(shí)現(xiàn)兩條分支。實(shí)際工作中需要用到的條件分支數(shù)目可能難以想象,擴(kuò)展if語句的分支需要用到elif句式。elif是“else if”的縮寫,即“下一條件是否成立?”。
使用elif有簡潔、減少過分縮排的效果。將elif代碼塊放在if和else之間,就組成了if-elif-else語句。理論上,if語句中的elif可以無限多。if-elif-else語句與if-else語句其實(shí)是等價(jià)的,后者相當(dāng)于前者中elif個(gè)數(shù)為0或不執(zhí)行的情況。由于if-elif-else語句能提供更多條件分支,因此被普遍使用,其基本語法格式如下。
if 條件表達(dá)式1:
    操作語句1
elif 條件表達(dá)式2:
    操作語句2
else
    操作語句3
if-elif-else語句語法格式中的參數(shù)與上文說明一致。該語句執(zhí)行時(shí),按照從上到下的順序,依次檢查每個(gè)條件表達(dá)式返回值的情況,任何一個(gè)條件表達(dá)式返回真值,就執(zhí)行該表達(dá)式下面的操作語句。若所有條件表達(dá)式都返回假值,則執(zhí)行else下面的操作語句。
if-elif-else語句相對(duì)于if-else語句優(yōu)勢明顯,可以實(shí)現(xiàn)更為復(fù)雜的功能。使用if-elif-else語句實(shí)現(xiàn)年齡段的判斷,如代碼清單③所示。
  • 代碼清單③ 使用if-elif-else語句實(shí)現(xiàn)年齡段的判斷

In[4]:    age = input('請(qǐng)輸入您的年齡:')
    age = int(age)
    if age < 18:
        print('未成年人!')
    elif age >= 18 and age <= 25:
        print('青年人!')
    elif age > 25 and age <= 60:
        print('中年人!')
    else:
        print('老年人!')   

Out[4]:    請(qǐng)輸入您的年齡: 20
    青年人!    
代碼清單③通過比較運(yùn)算符實(shí)現(xiàn)了年齡段劃分,并能區(qū)分年齡段界限,避免邏輯出錯(cuò)。input函數(shù)將接收的任何數(shù)據(jù)類型都默認(rèn)為str,如果不在該代碼中插入轉(zhuǎn)換接收數(shù)據(jù)類型的語句,程序?qū)o法執(zhí)行。這是因?yàn)?,接收的年齡數(shù)據(jù)會(huì)被用于和后續(xù)的年齡數(shù)值比較,而number與str是無法比較的。
需要說明,if語句還有一種形式是if-if-else,這一形式中的if可以有多個(gè),從而實(shí)現(xiàn)多分支。與if-elif-else語句相比,差異不僅僅存在于形式上,性能上也同樣有區(qū)別,使用多個(gè)if的效率更低,它實(shí)際上是多重if語句。
if語句支持嵌套,即在一個(gè)if語句中嵌入另一個(gè)if語句,從而構(gòu)成不同層次的選擇結(jié)構(gòu)。嵌套的意義在于實(shí)現(xiàn)多層選擇結(jié)構(gòu)。使用嵌套對(duì)條件語句的功能有升華作用,這與elif是相似的,elif將有限的條件分支擴(kuò)展,嵌套則提供了建立多層選擇結(jié)構(gòu)的工具,兩者分別在不同的維度上提升了if語句的功能性。使用嵌套需要以不同的縮進(jìn)長度劃分代碼結(jié)構(gòu)的層次,因此嵌套時(shí)要特別注意縮進(jìn)的規(guī)范性。
嵌套選擇結(jié)構(gòu)具有很廣的應(yīng)用場景,以下給出一個(gè)例子。假設(shè)系統(tǒng)中存儲(chǔ)了5個(gè)用戶的身份信息,分別是:來自英國的Tom,35歲;來自法國的Frank,35歲;來自德國的Bob,35歲;來自澳大利亞的Washington,51歲;來自南非的Jane,21歲。
設(shè)計(jì)一個(gè)程序,詢問用戶的部分信息,在對(duì)方不說出自己名字的情況下識(shí)別其身份,如代碼清單④所示。
  • 代碼清單④ 嵌套if-elif-else語句

In[5]:    age = input('請(qǐng)輸入你的年齡:')
    age = int(age)
    if age == 35:
        nation = input('請(qǐng)輸入你的國籍:')
        if nation == '英國':
            print('你是Tom! ')
        elif (nation == '法國'):
            print('你是Frank! ')
        else:
            print('你是Bob! ')
    elif age == 21:
       print('你是Jane,來自南非! ')
    elif age == 51:
       print('你是Washington,來自澳大利亞! ')
    else:
       print('請(qǐng)輸入正確年齡值! ')  

Out[5]:    請(qǐng)輸入你的年齡:35
    請(qǐng)輸入你的國籍:法國
    你是Frank!    
從代碼清單④可以看到,該程序具有兩層選擇結(jié)構(gòu)。第1層用于詢問年齡,程序通過接收的年齡,可以判斷輸入者是Jane、Washington或其他3個(gè)同齡人中的一個(gè);若收到的值不在這5人年齡范圍中,則提示輸入出錯(cuò);若收到的值是3個(gè)同齡人的歲數(shù),則進(jìn)入下一層選擇結(jié)構(gòu),即詢問國籍;通過詢問國籍,程序可以準(zhǔn)確報(bào)出輸入者的信息。
使用if語句時(shí),需要注意以下幾點(diǎn)。
  1. 條件判斷語句應(yīng)盡量簡單,若語句復(fù)雜則應(yīng)當(dāng)將運(yùn)算先放到一個(gè)變量中。

  2. Python的條件語句中允許常用的數(shù)值比較運(yùn)算(==,!=,>,>=,<,<=)。

  3. Python允許無限次if語句嵌套,但實(shí)際編程中如果必須用到3級(jí)到4級(jí)嵌套,建議考慮用其他方法編寫代碼,嵌套超過兩層會(huì)使程序的運(yùn)行效率大打折扣。


02 try、except與else
如果運(yùn)行途中發(fā)生錯(cuò)誤事件,程序的執(zhí)行將中斷,并創(chuàng)建異常對(duì)象。異常是程序在正常流程控制以外采取的動(dòng)作,當(dāng)它被引發(fā)時(shí),計(jì)算機(jī)將自動(dòng)尋找異常處理程序,以幫助程序恢復(fù)正常運(yùn)行。
要保證程序的正常運(yùn)行,就需要排除錯(cuò)誤,錯(cuò)誤要么是語法上的,要么是邏輯上的。語法錯(cuò)誤的出現(xiàn)表明程序在結(jié)構(gòu)上出現(xiàn)了問題,可以在程序執(zhí)行前加以糾正。邏輯錯(cuò)誤可能是缺少輸入或輸入不正確,某些情況下,也可能是根據(jù)輸入無法生成預(yù)期的結(jié)果。邏輯錯(cuò)誤難以預(yù)防,必須使用異常處理程序來應(yīng)對(duì)。
計(jì)算機(jī)語言針對(duì)可能出現(xiàn)的錯(cuò)誤定義了異常類型,某種錯(cuò)誤引發(fā)對(duì)應(yīng)的異常時(shí),異常處理程序?qū)⒈粏?dòng),從而恢復(fù)程序的正常運(yùn)行。Python中定義的異常類型大致分為數(shù)值計(jì)算錯(cuò)誤、操作系統(tǒng)錯(cuò)誤、無效數(shù)據(jù)查詢、Unicode相關(guān)的錯(cuò)誤和警告等幾類,如下所示。
Python異常類:
  • BaseException:所有異常的基類

  • Exception:常規(guī)異常的基類

  • StandardError:所有的內(nèi)建標(biāo)準(zhǔn)異常的基類

  • ArithmeticError:所有數(shù)值計(jì)算異常的基類

  • FloatingPointError:浮點(diǎn)計(jì)算異常

  • OverflowError:數(shù)值運(yùn)算超出最大限制

  • ZeroDivisionError:除零

  • AssertionError:斷言語句失敗

  • AttributeError:對(duì)象不包含某個(gè)屬性

  • EOFError:沒有內(nèi)建輸入,到達(dá)EOF標(biāo)記

  • EnvironmentError:操作系統(tǒng)異常的基類

  • IOError:輸入/輸出操作失敗

  • OSError:操作系統(tǒng)異常

  • WindowsError:系統(tǒng)調(diào)用失敗

  • ImportError:導(dǎo)入模塊/對(duì)象失敗

  • KeyboardInterrupt:用戶中斷執(zhí)行

  • LookupError:無效數(shù)據(jù)查詢的基類

  • IndexError:序列中沒有此索引

  • KeyError:映射中沒有這個(gè)鍵

  • MemoryError:內(nèi)存溢出異常

  • NameError:未聲明/初始化對(duì)象

  • UnboundLocalError:訪問未初始化的本地變量

  • ReferenceError:弱引用試圖訪問已經(jīng)垃圾回收了的對(duì)象

  • RuntimeError:一般的運(yùn)行時(shí)異常

  • NotImplementedError:尚未實(shí)現(xiàn)的方法

  • SyntaxError:語法錯(cuò)誤導(dǎo)致的異常

  • IndentationError:縮進(jìn)錯(cuò)誤導(dǎo)致的異常

  • TabError:Tab和空格混用

  • SystemError:一般的解釋器系統(tǒng)異常

  • TypeError:對(duì)類型無效的操作

  • ValueError:傳入無效的參數(shù)

  • UnicodeError:Unicode相關(guān)的異常

  • UnicodeDecodeError:Unicode解碼時(shí)的異常

  • UnicodeEncodeError:Unicode編碼錯(cuò)誤導(dǎo)致的異常

  • UnicodeTranslateError:Unicode轉(zhuǎn)換錯(cuò)誤導(dǎo)致的異常

  • Warning:警告的基類

  • DeprecationWarning:關(guān)于被棄用的特征的警告

  • FutureWarning:關(guān)于構(gòu)造將來語義會(huì)有改變的警告

  • UserWarning:用戶代碼生成的警告

  • PendingDeprecationWarning:關(guān)于特性將會(huì)被廢棄的警告

  • RuntimeWarning:可疑的運(yùn)行時(shí)行為(runtime behavior)的警告

  • SyntaxWarning:可疑語法的警告

  • ImportWarning:用于在導(dǎo)入模塊過程中觸發(fā)的警告

  • UnicodeWarning:與Unicode相關(guān)的警告

  • BytesWarning:與字節(jié)或字節(jié)碼相關(guān)的警告

  • ResourceWarning:與資源使用相關(guān)的警告

異常體系內(nèi)部有層次關(guān)系,即某些異常屬于某個(gè)異常的子類,該異常又可能是另一異常的子類。較低層次、更具細(xì)節(jié)的異常是某些異常的子類,這些高層次的異常則稱為基類,子類和基類是相對(duì)的。Python異常體系中的部分關(guān)系如圖2所示。
▲圖2 Python常見異常體系
在圖2中,越下面的異常,其層次越低,細(xì)節(jié)更明顯,它們總有更高層次的基類。
Python使用try語句處理異常,該語句一般包括try、except和else三個(gè)句式,組成try-except-else的形式。try部分包含一個(gè)嘗試執(zhí)行的代碼塊,except部分是特定異常的處理對(duì)策,else部分則在程序運(yùn)行正常時(shí)執(zhí)行。
try語句可以視為一種條件分支,與if語句的區(qū)別是try語句并不包含條件判斷式,執(zhí)行的流向也不取決于條件表達(dá)式,而依賴于代碼塊能否執(zhí)行。但其內(nèi)在邏輯和運(yùn)行流程與if語句是相似的,符合條件分支的特征,其基本語法格式如下。
try:
    操作語句1
except 錯(cuò)誤類型1:
    操作語句2
except 錯(cuò)誤類型2:
    操作語句3
else:
    操作語句4
try語句常用的語法格式及其參數(shù)說明如下所示。
try-except-else語句常用的語法格式及其參數(shù)說明:
  • 錯(cuò)誤類型:接收Python異常名,表示符合該異常則執(zhí)行下面語句。無默認(rèn)值

  • 操作語句:接收操作語句,表示執(zhí)行一段代碼。無默認(rèn)值

運(yùn)行try-except-else語句時(shí),程序首先執(zhí)行try代碼塊,即可能出錯(cuò)的試探性語句,這可能導(dǎo)致致命性錯(cuò)誤使得程序無法繼續(xù)執(zhí)行;如果try代碼塊確實(shí)無法執(zhí)行,就可能執(zhí)行某個(gè)except代碼塊。
執(zhí)行一個(gè)except代碼塊的條件是,系統(tǒng)捕捉的異常類型和該代碼塊標(biāo)識(shí)的類型相符合;如果try代碼塊的語句正常執(zhí)行,就接著執(zhí)行else代碼塊的語句。
如果try部分無法執(zhí)行,也沒有找到相應(yīng)的except代碼塊,就將異常消息發(fā)送給程序調(diào)用端,如Python Shell,Python Shell對(duì)異常消息的默認(rèn)處理則是終止程序的執(zhí)行并打印具體的出錯(cuò)信息。這也是在Python Shell中執(zhí)行程序錯(cuò)誤后所出現(xiàn)的出錯(cuò)打印信息的由來。
在try語句中,except與else代碼塊都是可選的。except代碼塊可以有0或多個(gè);else代碼塊可以有0或1個(gè)。但要注意,else語句的存在必須以except語句的存在為前提,在沒有except語句的try語句中使用else語句,會(huì)引發(fā)語法錯(cuò)誤。
try語句中沒有else時(shí),就構(gòu)成try-except語句,如代碼清單⑤所示。
  • 代碼清單⑤ try語句處理除零異常

In[6]:    number = 0
    # 以變量number作被除數(shù),嘗試運(yùn)行除法操作
    try:
        print('1.0 / number ='1.0 / number)
    # 如果異常是除零異常,輸出提示信息
    except ZeroDivisionError:
        print('***除數(shù)為0***'

Out[6]:    ***除數(shù)為0***
在代碼清單⑤中,由于0不能做除數(shù),因此引發(fā)了除零異常。except代碼塊由于給出了ZeroDivisionError的解決方案,因此被執(zhí)行,程序得以完整地運(yùn)行。
代碼清單⑤所展示的異常之間的層次差別是有意義的,這在程序執(zhí)行過程中可以體現(xiàn),如代碼清單⑥所示。
  • 代碼清單⑥ Python異常層次差異

In[7]:    dict1={'a'1'b'2'v'22}
    # 嘗試索引賦值dict中不存在的值
    try:
        x = dict1['y']
    except LookupError:
        print('查詢錯(cuò)誤')
    except KeyError:
        print('鍵錯(cuò)誤')
    else:
        print(x)    

Out[7]:    查詢錯(cuò)誤    

In[8]:    # 調(diào)換LookupError和KeyError處理代碼塊的順序
    dict2={'a'1'b'2'v'22}
    # 嘗試索引賦值dict中不存在的值
    try:
        x = dict2['y']
    except KeyError:
        print('鍵錯(cuò)誤')
    except LookupError:
        print('查詢錯(cuò)誤')
    else:
        print(x)    

Out[8]:    鍵錯(cuò)誤 
代碼清單⑥展示的try-except-else語句嘗試查詢不在dict中的鍵值對(duì),從而引發(fā)了異常。這一異常準(zhǔn)確地說應(yīng)屬于KeyError,但由于KeyError是LookupError的子類,且在代碼清單⑥中將LookupError置于KeyError之前,因此程序優(yōu)先執(zhí)行該except代碼塊。所以,使用多個(gè)except代碼塊時(shí),必須堅(jiān)持對(duì)其規(guī)范排序,要從最具針對(duì)性的異常到最通用的異常。
除自然發(fā)生的異常外,Python中的raise語句可用于故意引發(fā)異常。使用該語句引發(fā)異常時(shí),只需在raise后輸入異常名即可,如代碼清單⑦所示。
  • 代碼清單⑦ raise語句

In[9]:    # 嘗試引發(fā)IndexError
    try:
        raise IndexError
    except KeyError:
        print ('in KeyError except')
    except IndexError:
        print('in IndexError except')
    else:
        print('no exception')   

Out[9]:    in IndexError except
本文摘編自Python3智能數(shù)據(jù)分析快速入門,經(jīng)出版方授權(quán)發(fā)布。

(*本文為Python大本營轉(zhuǎn)載文章,轉(zhuǎn)載請(qǐng)聯(lián)系原作者)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多