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.mzph.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. 验证…