溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python中None返回值的使用方法

發(fā)布時間:2020-11-09 10:52:55 來源:億速云 閱讀:399 作者:小新 欄目:編程語言

python中None返回值的使用方法?這個問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

None是python中的特殊存在。作為函數(shù),在用到返回值的經(jīng)常使用。今天小編就來講講

一、作為操作類函數(shù)的默認(rèn)返回值

當(dāng)某個操作類函數(shù)不需要任何返回值時,通常就會返回 None。同時,None 也是不帶任何 return 語句函數(shù)的默認(rèn)返回值。

對于這種函數(shù),使用 None 是沒有任何問題的,標(biāo)準(zhǔn)庫里的 list.append()、 os.chdir() 均屬此類。

 

二、作為某些“意料之中”的可能沒有的值

有一些函數(shù),它們的目的通常是去嘗試性的做某件事情。視情況不同,最終可能有結(jié)果,也可能沒有結(jié)果。而對調(diào)用方來說,“沒有結(jié)果”完全是意料之中的事情。對這類函數(shù)來說,使用 None 作為“沒結(jié)果”時的返回值也是合理的。

Python 標(biāo)準(zhǔn)庫里,正則表達(dá)式模塊 re 下的 re.search、 re.match 函數(shù)均屬于此類,這兩個函數(shù)在可以找到匹配結(jié)果時返回 re.Match 對象,找不到時則返回 None。

 

三、作為調(diào)用失敗時代表“錯誤結(jié)果”的值

有時, None 也會經(jīng)常被我們用來作為函數(shù)調(diào)用失敗時的默認(rèn)返回值,比如下面這個函數(shù):

def create_user_from_name(username):
 """通過用戶名創(chuàng)建一個 User 實例"""
 if validate_username(username):
 return User.from_username(username)
 else:
 return None
 
user = create_user_from_name(username)
if user:
user.do_something()

當(dāng) username 不合法時,函數(shù) create_user_from_name 將會返回 None。但在這個場景下,這樣做其實并不好。

不過你也許會覺得這個函數(shù)完全合情合理,甚至你會覺得它和我們提到的上一個“沒有結(jié)果”時的用法非常相似。那么如何區(qū)分這兩種不同情形呢?關(guān)鍵在于:函數(shù)簽名(名稱與參數(shù))與 None 返回值之間是否存在一種“意料之中”的暗示。

讓我解釋一下,每當(dāng)你讓函數(shù)返回 None 值時,請仔細(xì)閱讀函數(shù)名,然后問自己一個問題:假如我是該函數(shù)的使用者,從這個名字來看,“拿不到任何結(jié)果”是否是該函數(shù)名稱含義里的一部分? 

分別用這兩個函數(shù)來舉例: 

  • re.search():從函數(shù)名來看, search,代表著從目標(biāo)字符串里去搜索匹配結(jié)果,而搜索行為,一向是可能有也可能沒有結(jié)果的,所以該函數(shù)適合返回 None

  • create_user_from_name():從函數(shù)名來看,代表基于一個名字來構(gòu)建用戶,并不能讀出一種 可能返回、可能不返回的含義。所以不適合返回 None

對于那些不能從函數(shù)名里讀出 None 值暗示的函數(shù)來說,有兩種修改方式。第一種,如果你堅持使用 None 返回值,那么請修改函數(shù)的名稱。比如可以將函數(shù) create_user_from_name() 改名為 create_user_or_none()。

第二種方式則更常見的多:用拋出異常(raise Exception)來代替 None 返回值。因為,如果返回不了正常結(jié)果并非函數(shù)意義里的一部分,這就代表著函數(shù)出現(xiàn)了“意料以外的狀況”,而這正是 Exceptions 異常 所掌管的領(lǐng)域。 

使用異常改寫后的例子:

class UnableToCreateUser(Exception):
 """當(dāng)無法創(chuàng)建用戶時拋出"""
 
def create_user_from_name(username):
 ""通過用戶名創(chuàng)建一個 User 實例"
 
    :raises: 當(dāng)無法創(chuàng)建用戶時拋出 UnableToCreateUser
    """
 if validate_username(username):
 return User.from_username(username)
 else:
 raise UnableToCreateUser(f'unable to create user from {username}')
 
try:
    user = create_user_from_name(username)
except UnableToCreateUser:
 # Error handling
else:
    user.do_something()

與 None 返回值相比,拋出異常除了擁有我們在上個場景提到的那些特點外,還有一個額外的優(yōu)勢:可以在異常信息里提供出現(xiàn)意料之外結(jié)果的原因,這是只返回一個 None 值做不到的。

感謝各位的閱讀!看完上述內(nèi)容,你們對python中None返回值的使用方法大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI