pythonnone用法_python中None返回值如何使用?

None是python中的特殊存在。作為函數,在用到返回值的經常使用。今天小編就來講講None作為函數返回值時,會出現的三種情況。

一、作為操作類函數的默認返回值

當某個操作類函數不需要任何返回值時,通常就會返回 None。同時,None 也是不帶任何 return 語句函數的默認返回值。

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

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

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

在 Python 標準庫里,正則表達式模塊 re 下的 re.search、 re.match 函數均屬于此類,這兩個函數在可以找到匹配結果時返回 re.Match 對象,找不到時則返回 None。

三、作為調用失敗時代表“錯誤結果”的值

有時, None 也會經常被我們用來作為函數調用失敗時的默認返回值,比如下面這個函數:def create_user_from_name(username):

"""通過用戶名創建一個 User 實例"""

if validate_username(username):

return User.from_username(username)

else:

return None

user = create_user_from_name(username)

if user:

user.do_something()

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

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

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

分別用這兩個函數來舉例:re.search():從函數名來看, search,代表著從目標字符串里去搜索匹配結果,而搜索行為,一向是可能有也可能沒有結果的,所以該函數適合返回 None

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

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

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

使用異常改寫后的例子:class UnableToCreateUser(Exception):

"""當無法創建用戶時拋出"""

def create_user_from_name(username):

""通過用戶名創建一個 User 實例"

:raises: 當無法創建用戶時拋出 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 返回值相比,拋出異常除了擁有我們在上個場景提到的那些特點外,還有一個額外的優勢:可以在異常信息里提供出現意料之外結果的原因,這是只返回一個 None 值做不到的。

以上就是None作為函數返回值時會出現的三種情況。更多Python學習推薦:PyThon學習網教學中心。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446148.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446148.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446148.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ Byte轉十六進制字符串輸出

代碼 例子一 typedef std::vector<unsigned char> bytes; std::string BytesToStr(const bytes& in) {bytes::const_iterator from in.cbegin();bytes::const_iterator to in.cend();std::ostringstream oss;for (; from ! to; from)oss << std::hex <&…

frame中src怎么設置成一個變量_Go 語言設計哲學之七:變量聲明須一致

Go 語言&#xff0c;使用變量之前需要先進行變量的聲明。var s string “Golang"n : 666Go 語言有兩類變量包級別(package varible)&#xff1a;在 package 級別可見的變量。如果是導出變量&#xff0c;該變量也可以被視為全局變量&#xff1b;局部變量(local varible)&a…

數據填充規則之PKCS7

程序輸入的數據全部使用Hex 十六進制的格式 IV 00000000000000000000000000000000Source(加密數據) char input_date[] {a,a,a,a,.......} Ascll編碼 需要轉16進制input_data 303030303030303030303030303030CC CC表示此位無數據注意事項&#xff1a;考慮到程序采用 PKCS…

getdevicecaps在哪個頭文件里_一招定勝負,while (true) 和 for (;;) 到底哪個更快

在JDK8u的jdk項目下做個很粗略的搜索&#xff1a;mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for (s?;s?;" . | wc -l 369mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "while (true" . | wc -l 323并沒有差多少。其次&#…

SM4 ECB加密模式 數據對比試驗論證

程序如下 開啟服務器密碼機&#xff0c;調用SM4加密函數&#xff0c;需要注意的是程序輸入的數據全部使用Hex 十六進制的格式 Key IV Data IV 00000000000000000000000000000000Source(加密數據) char input_date[] {a,a,a,a,.......} Ascll編碼 需要轉16進制input_data …

二分法查找c語言程序_C語言的那些經典程序 第十四期

戳“在看”一起來充電吧!C語言的那些經典程序 第十四期本期小C給大家帶來三個用C語言解決實際問題的典例。如果全都理解&#xff0c;相信肯定能給大家帶來收獲&#xff01;接下來讓我們看看是哪些程序吧&#xff01;1字符查找源程序&#xff1a;運行結果&#xff1a;程序分析:該…

C++ puts函數 打印字符串很方便

參考鏈接 c puts函數_在C / C 中使用puts&#xff08;&#xff09;函數_從零開始的教程世界-CSDN博客

centos網絡隔一段時間就斷_計算機網絡總結

POST跟GET的區別作用GET用于獲取資源&#xff0c;而POST用于傳輸實體參數GET的參數以字符串的格式出現在URL中&#xff0c;而POST的參數存儲在請求實體中。因為URL只支持ASCII碼&#xff0c;故GET的參數如果存在中文等字符就需要先進行編碼&#xff0c;POST參考支持標準字符集。…

C++/C++11中std::runtime_error的使用

參考鏈接 C/C11中std::runtime_error的使用_網絡資源是無限的-CSDN博客_runtimeerror

有python基礎學java_Python基礎學習篇

導讀Python是一種解釋型、面向對象、動態數據類型的高級程序設計語言。Python由Guido van Rossum于1989年底發明&#xff0c;第一個公開發行版發行于1991年。像Perl語言一樣, Python 源代碼同樣遵循 GPL(GNU General Public License)協議。一. 列表1.1 列表的介紹列表是python的…

使用wireshark抓包,本地環回測試通信數據已經通過SM4國密算法加密

具體操作 本實驗采用 本地環回測試開啟wireshark抓包工具&#xff0c;設定端口號 tcp.port 5099 &#xff08;5099為服務端對外開啟服務的端口號&#xff09;&#xff0c;不可以使用ip.addr指定ip地址&#xff0c;因為本地環回測試&#xff0c;相關信息太多&#xff0c;使用端…

public 函數_UE4精品教程 | 渲染編程(C++篇)【第三卷:從仿函數到std::function再到虛幻4Delegate】...

本文轉載于YivanLee知乎作者專題目錄鏈接&#xff1a;https://zhuanlan.zhihu.com/p/67694999這幾天研究了一下虛幻4的delegate&#xff0c;但是想要理解這個&#xff0c;還得從仿函數說起。下面是一段代碼例子&#xff1a;class MyFunctor{ public: int operator()(int …

C語言深度剖析書籍學習記錄 第一章 關鍵字

C語言標準定義了32個關鍵字 union聲明聯合數據類型 Union declaration - cppreference.com維護足夠的空間來置放多個數據成員中的“一種”&#xff0c;而不是為每一個數據成員配置空間&#xff0c;在 union 中所有的數據成員共用一個空間&#xff0c;同一時間只能儲存其中一個…

js頁面自適應屏幕大小_移動端自適應布局方法的calc()與vw

前端人員在處理移動端自適應布局時&#xff0c;目前前端最流行的方法應該就是使用媒體查詢&#xff0c;來設置HTML的字體大小&#xff0c;然后用rem為單位對Dom的寬高進行設置&#xff0c;這個方法的優勢在于兼容性方面很好&#xff0c;劣勢則在于當前市場上不同的機型太多&…

C語言深度剖析書籍學習記錄 第二章 符號

\ 連接符號&#xff0c;// \ 可以把下一行也注釋調編譯器 刪除注釋時&#xff0c;會使用空格進行替代

詳細描述三個適于瀑布模型的項目_IT項目管理筆記——方法選擇和軟件評估

一、管理需求為什么要管理需求&#xff1f;避免失敗&#xff0c;提高項目的成功率和需求管理所帶來的其他好處軟件生命周期中&#xff0c;一個錯誤發現得越晚&#xff0c;修復錯誤的費用越高許多錯誤是潛伏的&#xff0c;并且在錯誤產生后很長一段時間才被檢查出來在需求階段&a…

Socket通信 客戶端加密數據,傳遞數據密文到服務端,服務端解密密文 輸出明文

server // sdf_cpp_warpper.cpp : 此文件包含 "main" 函數。程序執行將在此處開始并結束。 // server端#ifndef UNICODE #define UNICODE #endif#define WIN32_LEAN_AND_MEAN#include <iostream> #include <string> #include <sstream> #include …

主進程中發生了一個javascript錯誤_知道html5 Web Worker標準嗎?能實現JavaScript的多線程?

js為什么是單線程&#xff1f;主要是因為最開始javascript是單純的服務于瀏覽器的一種腳步語言(那時候沒有nodejs)。瀏覽器是為了渲染網頁&#xff0c;通過dom與用戶交互&#xff0c;如果一個線程需要給dom執行click事件&#xff0c;而另一個進程要刪除這個dom&#xff0c;這2個…

C語言深度剖析書籍學習記錄 第三章 預處理

宏 _LINE_ 表示正在編譯的文件的行號_FILE_ 表示正在編譯的文件的名字_DATE_ 表示編譯時刻的日期字符串&#xff0c;例如: "25 Dec 2007"_TIME_ 表示編譯時刻的時間字符串&#xff0c;例如: "12:30:55"_STDC_ 判斷該文件是不是定義成標準 C 程序宏名的書寫…

js正則限制字符串長度_正則筆記(3)萬字長文,慎點。

正則講了很久&#xff0c;也拖了很久&#xff0c;今天看看怎么用吧&#xff0c;后續更文應該會比較準勤快了。:-)書接上文【正則筆記(2)】。這次我們來看看正則的使用&#xff1a;(注&#xff1a;斜體表示為對應規則寫出的正則表達式)一、 常用的正則表達式&#xff1a;1. 驗證…