在python中关键字表⽰空类型_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 中也被继承了。另外,在 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基础之常⽤关键字总结
前⾔ 到python3.6为⽌,python内置的关键字有33个,⽐python2.7的版本多了2个.下⾯总结⼀下python3的关键字的使⽤. python内置关键字 解释器在加载上下⽂的时候,如果 ...
js的delete和void关键字
delete关键字 delete关键字的作⽤: 删除对象的属性 语法:delete 对象.属性 可以删除没有使⽤var关键字声明的全局变量(直接定义在window上⾯的属性) delete关键字的 ...
Python:笔记(7)——yield关键字
Python:笔记(7)——yield关键字 yield与⽣成器 所谓⽣成器是⼀个函数,它可以⽣成⼀个值的序列,以便在迭代中使⽤.函数使⽤yield关键字可以定义⽣成器对象. ⼀个例⼦ 我们调⽤该函数 ...
C语⾔void关键字的深刻含义
C语⾔void关键字的深刻含义 .概述 本⽂将对void关键字的深刻含义进⾏解说,并详述void及void指针类型的使⽤⽅法与技巧. .void的含义void的字⾯意思是“⽆类型”,void *则为 ...
C语⾔学习笔记--void关键字
1.C语⾔中Void关键字的含义 void 修饰函数返回值和参数——为了表⽰“⽆”,如果函数没有返回值,那么应该将其声明为 void,同样的,如果函数没有参数,也应该声明其参数为 void //f() ...
Python——函数的命名关键字参数
命名关键字参数 对于关键字参数,函数的调⽤者可以传⼊任意不受限制的关键字参数.⾄于到底传⼊了哪些,就需要在函数内部通过kw检查. 仍以person()函数为例,我们希望检查是否有city和job参数: ...
Python学习笔记-Day3-python关键字
1.and 逻辑与
2.assert 判断某个条件是否为真,如果为假,抛出错误
3.break跳出for,while循环
4.class 类定义
6. ...
python函数 位置参数,关键字参数,可变参数优先级
def fun(arg,args=1,*arg,**keywords): python ⼀共有这四类参数,第⼀类最常见,不⽤多说,第⼆类,关键字参数,python能通过关键字到参数,python函数 ...
(转) Python Generators(⽣成器)——yield关键字
随机推荐
java项⽬中读取properties⽂件
这⾥的配置⽂件都放在src下⾯, System.properties的内容 exceptionMapping=exceptionMapping.properties config=config.pro ...
JCIFS是很不稳定的
我以前也试过这样登录失败,第⼆天就能登录成功了. JCIFS是很不稳定的. 如果是域登录可以这样 //DOMAIN_IP 域名服务(其实域名和域名服务器IP可以,不过⽤IP解析速度快很 ...
经常使⽤的正則表達式归纳—JavaScript正則表達式
C#winform程序关闭计算机的正确姿势
/// /// 计算机电源控制类 /// public class EnvironmentCheckClass { [DllImpor ...
openresty 备忘
The problem with: apt-get --yes install $something is that it will ask for a manual confirmation if ...
学习在dos下使⽤gcc来编译
这两年⾥,断断续续的学习和使⽤c,平时都是在CodeBlocks⾥写代码,编译程序,点⼀下按钮就⾏了.对整个编译过程是⼀点⼉都不了解.相⽐当年学习java,真的是选择了两个不同的路,当年学习java的 ...
SDI初识
SDI初识 SDI接⼝,即“数字分量串⾏接⼝(Serial Digital Interface)”.按照速率可以分为: 标准清晰度SD-SDI,速率为270Mb/s; ⾼清标准HD-SDI,速率为1. ...
C#Redis 常⽤key操作
⼀.前戏 在该系列的前⼏篇博客中,主要讲述的是与Redis数据类型相关的命令,如String.List.Set.Hashes和Sorted-Set.这些命令都具有⼀个共同点,即所有的操作都是针对与Ke ...
textarea标签内容为(英⽂或数字不⾃动换⾏)的解决⽅法
text函数什么意思textarea 显⽰⼀串英⽂时不会发⽣换⾏. 以下是两种解决⽅法:1.限制textarea的⼤⼩ width 设置为 00px (不要设置为00%)cols 设置为30+ (也有类似效果) 2. ...
数据结构之队列(Python 版)
数据结构之队列(Python 版) 队列的特点:先进先出(FIFO) 使⽤链表技术实现 使⽤单链表技术,在表⾸尾两端分别加⼊指针,就很容易实现队列类. 使⽤顺序表list实现 # 队列类的实现 cla ...
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论