我在学习Python的过程中,我已经到了关于pass语句的部分。我正在使用的指南将其定义为通常用作占位符的空语句。
但我还是不太明白这是什么意思。pass语句将被使用的简单/基本情况是什么?为什么需要它?
我在学习Python的过程中,我已经到了关于pass语句的部分。我正在使用的指南将其定义为通常用作占位符的空语句。
但我还是不太明白这是什么意思。pass语句将被使用的简单/基本情况是什么?为什么需要它?
当前回答
假设您正在设计一个新类,其中包含一些您还不想实现的方法。
class MyClass(object):
def meth_a(self):
pass
def meth_b(self):
print "I'm meth_b"
如果您省略了传递,代码将无法运行。
然后你会得到一个:
IndentationError: expected an indented block
总之,pass语句不做任何特殊的事情,但它可以充当占位符,如下所示。
其他回答
pass语句什么也不做。当语法上需要语句,但程序不需要操作时,可以使用它。
除了“我不想要任何东西到这里”的“主要”用途之外,我刚刚发现了一个,假设gen是一个迭代器:
i = 0
obj = None
for i, obj in enumerate(gen):
pass
这将在一次传递中获得gen生成的最后一个对象和gen的长度。(有点类似于C语言中以分号结尾的while循环,仔细想想吧。)
最好和最准确的理解pass的方式是显式地告诉解释器什么都不做。以同样的方式输入以下代码:
def foo(x,y):
return x+y
意思是“如果我调用函数foo(x, y),将标签x和y所代表的两个数字相加并返回结果”,
def bar():
pass
意思是“如果我调用函数栏(),什么都不做。”
其他答案都很正确,但它也适用于一些不涉及占位的事情。
例如,在我最近编写的一段代码中,有必要对两个变量进行除法,并且除数可能为零。
c = a / b
显然,如果b为零,将产生一个ZeroDivisionError。在这种特殊情况下,在b为零的情况下,让c为零是理想的行为,所以我使用了以下代码:
try:
c = a / b
except ZeroDivisionError:
pass
另一种不太标准的用法是为调试器放置断点。例如,我想要一段代码在For语句的第20次迭代时进入调试器。在声明。所以:
for t in range(25):
do_a_thing(t)
if t == 20:
pass
在传递时使用断点。
除了用作未实现函数的占位符外,pass还可以用于填充if-else语句(“显式比隐式好”)。
def some_silly_transform(n):
# Even numbers should be divided by 2
if n % 2 == 0:
n /= 2
flag = True
# Negative odd numbers should return their absolute value
elif n < 0:
n = -n
flag = True
# Otherwise, number should remain unchanged
else:
pass
当然,在这种情况下,可能会使用return而不是赋值,但在需要突变的情况下,这种方法效果最好。
在这里使用pass特别有用,可以警告未来的维护者(包括您自己!)不要将多余的步骤放在条件语句之外。在上面的例子中,在特别提到的两种情况中设置了flag,但在其他情况中没有设置。如果不使用pass,未来的程序员可能会将flag = True移到条件之外,从而在所有情况下设置flag。
另一种情况是经常出现在文件底部的样板函数:
if __name__ == "__main__":
pass
在某些文件中,最好将其与pass一起保留,以便稍后更容易地进行编辑,并明确表示当文件单独运行时不期望发生任何事情。
最后,正如在其他回答中提到的,当异常被捕获时,什么都不做是很有用的:
try:
n[i] = 0
except IndexError:
pass
Pass指忽略…就是这么简单。如果给定的条件为真,并且下一个语句是通过的,它将忽略该值或迭代并继续执行下一行。
例子:
for i in range (1, 100):
if i%2 == 0:
pass
else:
print(i)
输出:输出1-100之间的所有奇数
这是因为一个偶数的模量等于零,因此它会忽略这个数字,继续下一个数字。由于奇数的模量不等于零,循环的else部分被执行并打印出来。