原标题:Python 为什么没有 void 关键字?

void 是编程语言中最常见的关键字之一,从字面上理解,它是“空的、空集、空白”的意思,最常用于表示函数的一种返回值类型。

维基百科上有一个定义:

The void type, in several programming languages derived from C and Algol68, is the type for the result of a function that returns normally, but does not provide a result value to its caller.

在 C、Algol68 及它们所派生的几种编程语言中,void 类型是函数正常返回的一种类型,但是不会给调用者返回一个值。

简单来说,void 是一种类型(type),但是没有具体的值(value)。

这到底是什么意思呢?

以 Python 的几种常见类型为例,我们可以从对比中看出规律:int 是一种表示整数的类型,它有无限个可能的整数值;bool 是一种布尔类型,它有两个可能的值(True 和 False);NoneType 是一种表示 None 的类型,它只有一个值(None)。

至于 void,它是一种更为抽象的特殊类型,但是不包含任何值。

介绍完概念上的含义,我们就可以进入正题了。标题中的问题可以进一步分解成两个:

其它语言为什么要使用 void 关键字?

Python 为什么不设计出 void 关键字?

对于第一个问题,我们以 C/C++ 为例,先看看 void 的两种使用场景(PS:此处只考虑函数的用法,不考虑指针的用法,因为 Python 没有指针):

当 void 用在函数的参数位置时,它表示该函数不需要传参。

最初 C 语言的 f 表示参数数量不确定,为了另外表达“不需要参数”的语义,所以引入 f(void) 作为限定。后来的语言(包括 Python)基本不在参数中使用 void,而是直接用 f 表示不需传参。C++ 为了兼容 C,所以才同时支持这两种语法。

当 void 用在函数前作修饰时,它表示该函数没有返回值。

在 C 语言中,若不声明返回类型,则 f 函数在编译后会返回整型的值。为了避免混乱,当不需要返回值时,就使用 void f 来作限定。

同时,更主要的是,它还起到了占位符的作用,表明一个函数的类型是已知的,这对代码可读性和编译都有所帮助。

void 作为函数的空返回值类型,这种用法在 C++/Java 中也被继承了。另外,在 Java 中也有 void 的身影,只不过它成了一种操作符,起到了完全不同的作用,此处不表。

但是, Python 从头到尾都没有 void 关键字。

为什么会这样?难道是因为在 Python 中不存在其它语言所面对的问题么?还是说,Python 中有自己的一套解决方案?

仍以跟函数相关的两种用法为例作分析吧。

在表示函数不需传参时, f(void)这种写法根本就是多余的,所以 Python使用了最简单明了的无参式写法 f 。

至于返回值类型的用法,在我们定义出一个函数时,例如最简单的 def func:pass ,为了让它的调用结果 func 是一个合法的对象,那它必须具有一个有效的类型(type)。

这应该是以类型为基的编程语言都会遇到的共性问题,Python 也不例外。

这个时候,如果函数本身没有显式地 return 出一个对象的话,就有两种可能的解决办法:

方法一,即声明该函数为 void 类型,像 C 和其它语言所做的那样,只要能通过类型检查即可

方法二,则是 Python 所用的方法,即令解释器隐式地返回一个 None 对象,也就是令函数默认得到一个 NoneType 类型,再用于类型检查(PS:Java 也类似,只不过它默认返回的是 undefined,它不是一个对象,而是一种表示“未定义”的类型,类似于 void)

简单而言,Python 的设计思路是直接复用已有的 NoneType 类型,并让解释器来填补缺失掉的函数类型。

关于 Python 解释器的这个隐式填补过程,我已在上一篇《 Python 函数为什么会默认返回 None? 》文章详细分析过,感兴趣的同学可去查阅。

这样做的好处至少有两点: 一是没有引入新的 void 类型和关键字;二是不需要程序员在函数前声明返回类型,这就跟有显式返回值的写法保持了一致。

试想一下,如果 Python 不让函数默认有返回值的话,就可能要写成 void def func:... 这样的形式,那它就变成了函数定义时的一种特例。与另一种特例函数相比,即异步函数 asyc def func:... ,就可能引起混乱。

总体而言,Python 似乎认为 void 空类型不是那么有存在的必要,似乎 NoneType 类型就足够了,而当缺少返回值时,让解释器统一注入是极为方便的,因此才出现了我们看到的现状。

至此,文章标题的问题算是圆满回答了。返回搜狐,查看更多

责任编辑:

python表示空类型的关键字_Python 为什么没有 void 关键字?相关推荐

  1. python表示空类型的关键字_Python基本数据类型

    Python中包括以下常用数据类型:数字.布尔值. 字符串.列表.元组.字典.集合.collention系列 一.数字 关键字:int 数字的常用操作方法: a = "123" p ...

  2. python中表示空类型的是_python中怎么表示空值

    首先了解python对象的概念 python中,万物皆对象,所有的操作都是针对对象的. 那什么是对象?5是一个int对象,'oblong'是一个str对象,异常也是一个对象,抽象一点是,人,猫,够也是 ...

  3. python中表示空类型的是_python中什么表示空类型

    python中什么表示空类型? python中None表示空类型.表示该值是一个空对象,空值是Python里一个特殊的值,用None表示.None不能理解为0,因为0是有意义的,而None是一个特殊的 ...

  4. python return用法_Python 为什么没有 void 关键字?

    void 是编程语言中最常见的关键字之一,从字面上理解,它是"空的.空集.空白"的意思,最常用于表示函数的一种返回值类型. 维基百科上有一个定义: The void type, i ...

  5. python系统关键字_Python基础教程 - global关键字及全局变量的用法

    Python中global关键字主要作用是声明变量的作用域. 在C语言中,由于变量一定是先声明,后使用,所以我们可以清楚的知道,现在使用的变量是全局还是局部,比如: int a = 5; void t ...

  6. python定义变量类型为数字_python 学习(四)- 变量类型

    一.变量的定义和使用 为什么需要变量?当然是通过变量来存储数据,而存储的数据类型可能是数字.字符串.字符等等,将这些数据存储在变量中,可以方便我们去使用,除了变量之外还有一个常量,区别就是,常量是不可 ...

  7. python创建空字典什么意思_Python创建空列表的字典2种方法详解

    如果要在 Python 中创建键值是空列表的字典,有多种方法,但是各种方法之间是否由区别?需要作实验验证,并且分析产生的原因.本文针对两种方法做了实验和分析. 如果要在 Python 中创建一个键值都 ...

  8. c语言所有关键字作用,void_C语言void关键字详解

    void类型修饰符(type specifier)表示"没有值可以获得".因此,不可以采用这个类型声明变量或常量.void 类型可以用于下面各小节所描述的目的. void用于函数声 ...

  9. python计算空类型_python的变量 类型和存储

    表达式(创建处理对象) => 语句 => 模块 => 程序 变量 创建: 第一次赋值时生成, 规则: -1包含字母数字下划线 -2 只能以字母下划线开头 -3 不能有空格 -4 避免 ...

最新文章

  1. jetty作为内嵌服务器自启动
  2. html5 网页游戏 开源,HTML5 网页游戏,基于 WebGL 打造
  3. freebsd ports安装mysql_FreeBSD Ports 方式安装MySQL及注意事项
  4. java11正式发布了,让java代码更完美
  5. linux用dd测试磁盘速度
  6. ConstraintLayout 学习笔记
  7. 分享21个丰富多彩的 HTML5 小游戏
  8. C++ 四种类型转换运算符
  9. 【Python】求n!
  10. HTTP 和 WebSocket的区别
  11. 链接选项 rpath 的原理和应用
  12. FlasCC例子研究之bitmapdata
  13. IT人士易犯4大职业病 鼠标手居第一位
  14. jupyter中subplots_adjust()调整子图大小无效、子图溢出和日期标签遮挡坐标轴刻度的问题解决
  15. 理解的三极管输出特性曲线图的放大区和饱和区,利用∆Ic小于∆βIb差值比较曲线左移右移关系
  16. 三点式女青年和免费的笔记本电脑
  17. 读钱钟书的《写在人生边上 人生边上的边上 石语》(一)
  18. Hdu4939 Stupid Tower Defense
  19. jarsigner签名APK完整步骤
  20. 多场景项目实战 (总结有点多今天)

热门文章

  1. 给孩子一束安全的光 明基WiT MindDuo亲子共读灯首发评测
  2. php5.3 延迟静态绑定 static关键字
  3. iOS 技术官方 QA
  4. 一个网卡绑定多个IP
  5. x264编码参数大测试:08 subme与指定码率(1000Kbps)
  6. Container.ItemIndex 获取reapeater行号
  7. Spark应用日志级别设置
  8. Eclipse集成svn后出现Failed to load JavaHL Library的解决办法
  9. Spring IOC容器-自动装配
  10. python非法语句是_python 如何优雅的处理大量异常语句?