Python中的pass语句,看似简单(只有4个字母),即使是没有任何编程经验的初学者也能很快掌握它的用法。官方文档的介绍很简单。简单的说,pass就是空操作。解释器在执行的时候,除了检查语法是否合法,什么都不做,直接跳过。与return、break、continue、yield等非空操作相比,最大的区别在于不改变程序的执行顺序。就像我们写的注释一样,只是占了一行代码,对它所在的范围没有任何影响。但是,如果你有其他语言的基础,你可能会好奇:为什么Python有这么独特的pass语句,其他语言却没有?Python这么设计的原因是什么?是为了解决一个大多数编程语言都要面对的通病,还是因为它有自己的新发现,创造了一个新的特性?换句话说:为什么Python有pass语句,它解决了什么问题(好),没有它会导致什么问题(坏)?接下来,本文将从两个维度进行分析。1.致人:作为空格占位符,我把它看做一种简明扼要的注释方式,相当于说“先在这里预留位置,后面再添加具体的代码实现”。比如在多层if-elif-else结构中,我们可以先写判断条件,然后把pass写在对应的block里,后面再逐步完善。比如上面给出的例子,我们可以先写类/函数名及其入参,然后跳过(pass)主要代码,后面再慢慢补上。pass好写,而且因为是关键字,IDE会给出显眼的颜色区分,所以比我们写注释内容方便多了。pass作为空格占位符,主要是方便我们构思局部代码结构,具有一定的辅助提醒作用。不过作为注释的方式,显得太单薄了,还不如写“#todo:xxxx”,同样会被IDE用颜色高亮显示,意思更明确。写起来简单的同时,也引入了一个看似多余的关键字pass。因此,从空间占位符的角度来看,pass并不是编程语言中必要的设计元素。有了它,我们可以表达“这里有些东西,但暂时跳过它”的语义,但没有它,可以使用评论的内容代替。2.对于机器:为了语法的完整性,对于前项的用法,pass在代码中的位置理论上是无限的。但是,我们最常使用pass的时候,基本上是在冒号的下一行,这一层的缩进代码块中只有这条语句。(见前面3个例子,为了方便,我们只以空函数为例。)我们可以想象如果不写会怎样?答案是会报缩进错误:IndentationError:expectedanindentedblock#去掉函数体的pass,会报错deffunc():func()因为Python使用缩进来划分代码块,以及冒号标记了一个新的缩进代码块,所以这个例子将报告缺少缩进代码块。如果我们用上面提到的注释替换它呢?#将函数体的pass换成注释deffunc():#todo:这里有东西,以后如果加上func(),也会报错:IndentationError:expectedanindentedblock。原因是注释不是有效的语法内容。它会被Python解释器忽略(ignore),不像pass语句那样是“有效的语法内容,但被跳过”。换句话说,缩进的代码块必须包含语法内容。下面的例子都是有效的:deffunc():"""Thisisastring"""deffunc2():123456Python在定义函数时,必须包含函数体,即同时包含声明和定义语义,并且不能写成voidtest();像一些只能使用声明语义的语言。但是由于Python不使用花括号,所以不能像某些语言那样直接定义一个空函数,即写成voidtest(){}。基于以上分析,Python在定义空函数时,必须要有合法的函数体,所以设计了代表空操作的pass语句。它是为了句法完整性而添加的,与冒号一起在其他语言中相当于一对空花括号。从语法完整性的维度来说,它是一个必要的设计元素,如果没有,就必须用类似的空语句或特殊符号来代替。从人的角度来说,pass可以表示“暂时跳过”,作为一个临时的占位符,最终会被实际的代码实现所取代;在机器端,可以表示“直接跳过”,只是为了完成语法逻辑,不会被其他代码代替。其他语言并没有专门的语句或符号来表示这种占位符(即缺乏语义),但它们不需要费心去设计关键字来完成语法的完整性(即语法做完了)。回到本文开头的问题:为什么Python要有pass语句,它解决了什么问题(好),没有它又会造成什么问题(坏)?Python使用pass语句来支持纯空操作的代码块(空函数、空类、空循环控制块等),有了它,它还可以额外表达一个占位符语义。前者是机器所必需的,相当于其他语言中空花括号的作用;后者对于人类来说不是必需的,可以在注释中表达,但是由于Python设计了这个语句,所以这种用法有时还是相当方便的。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享
