关于java:Python-为什么没有-void-关键字

9次阅读

共计 2338 个字符,预计需要花费 6 分钟才能阅读完成。

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 中也被继承了。另外,在 Javascript 中也有 void 的身影,只不过它成了一种操作符,起到了齐全不同的作用,此处不表。

然而,Python 从头到尾都没有 void 关键字。

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

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

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

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

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

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

  • 办法一,即申明该函数为 void 类型,像 C 和其它语言所做的那样,只有能通过类型查看即可
  • 办法二,则是 Python 所用的办法,即令解释器隐式地返回一个 None 对象,也就是令函数默认失去一个 NoneType 类型,再用于类型查看(PS:Javascript 也相似,只不过它默认返回的是 undefined,它不是一个对象,而是一种示意“未定义”的类型,相似于 void)

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

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

这样做的益处至多有两点: 一是没有引入新的 void 类型和关键字;二是不须要程序员在函数前申明返回类型,这就跟有显式返回值的写法放弃了统一。

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

总体而言,Python 仿佛认为 void 空类型不是那么有存在的必要,仿佛 NoneType 类型就足够了,而当短少返回值时,让解释器对立注入是极为不便的,因而才呈现了咱们看到的现状。

至此,文章题目的问题算是圆满答复了。

最初,让咱们开始进入 ending 吧:本文化面上是以“Python 为什么没有 void 关键字”为切入点,然而,它实际上瞄准的却是“Python 为什么须要返回 None”的问题。

在《Python 函数为什么会默认返回 None?》这篇文章中,我介绍了 Python 中函数默认返回 None 的机制,它是属于“how can”的内容。然而为什么要默认返回 None 呢?这则是属于“why need”或者“why should”的问题,而它须要从 void 关键字的缺失开始谈起……

那么,为什么 Python 没有 void 关键字呢?请往上翻,从新浏览本文……

本文属于“Python 为什么”系列(Python 猫出品),该系列次要关注 Python 的语法、设计和倒退等话题,以一个个“为什么”式的问题为切入点,试着展示 Python 的迷人魅力。所有文章将会归档在 Github 上,我的项目地址:https://github.com/chinesehuazhou/python-whydo

正文完
 0