好冷的Python--pass和它的备胎们
原文链接:http://www.juzicode.com/archives/659
先看一段代码,这个代码里定义了一个func()函数,但是函数体内部没有任何语句,结果解释器在解析到”def func():”后面时,提示IndentationError异常:
def func():
if __name__ == '__main__':
func()
==========结果:
File "E:\juzicode\test.py", line 5
if __name__ == '__main__':
^
IndentationError: expected an indented block
在条件、循环语句的下级缩进中,有时具体业务并不是需要马上实现;或者定义函数时,先只是取了一个函数名称,函数内部还没有想好怎么实现,这个时候就可以使用pass语句先占着位置,避免程序执行的时候抛异常。
if a==10:
pass
def func():
pass
常见的用法是在下一层缩进中使用pass语句进行"占位",除了用pass语句还可以使用”...”来代替:
def func():
...
你可能会有疑问,”...”是个什么东东?先上type()函数检查类型试试:
>>>type(...)
<class 'ellipsis'>
原来 ”...” 是一种叫做ellipsis的class,在Python中一切皆对象,既然可以用一种ellipsis类的实例来占位,是不是也可以用一个其他类的实例呢?
def func():
()
def func():
[]
def func():
3.14
def func():
'todo'
def func():
0
def func():
None
用上面这些函数代替最前面例子中的func()函数,运行都没有问题,所以用int,str,list等数据类型做占位语句也都是可行的。
下面的例子则是用自定义class的一个实例作为占位语句也没有问题。
class ABC():
def __init__(self):
self.a=10
def func():
ABC()
if __name__ == '__main__':
func()
结论:
1.通常使用“pass”作为占位语句;
2.也可以使用“...”作为占位语句;
3.任何内置或自定义类的实例也可以作为占位语句。
下面这段代码摘自Python内置operator模块的源码(安装路径根目录下的"lib\operator.py"文件),这些函数每个return语句前面都有一段“悬挂”的字符串,你还会觉得惊讶吗?
# Comparison Operations *******************************************************#
def lt(a, b):
"Same as a < b."
return a < b
def le(a, b):
"Same as a <= b."
return a <= b
def eq(a, b):
"Same as a == b."
return a == b
def ne(a, b):
"Same as a != b."
return a != b
def ge(a, b):
"Same as a >= b."
return a >= b
def gt(a, b):
"Same as a > b."
return a > b
我们在写注释的时候,可以用一对 ''' '''(三个引号)将注释内容包含起来,比如在函数定义的下一行写三引号注释必须要缩进,就像下面这个例子,聪明的你知道下面这2段代码为什么前者正确,后者会报IndentationError错误了吗?
>>> def func():
... '''todo'''
...
>>>
>>> def func():
... '''todo'''
File "<stdin>", line 2
'''todo'''
^
IndentationError: expected an indented block
如果你想及时接收到更冷的Python知识,记得微信扫一扫关注“桔子code”。