415

我正在学习 Python,我已经到了关于pass语句的部分。我正在使用的指南将其定义为通常用作占位符的空语句。

我仍然不完全理解这意味着什么。将使用该语句的简单/基本情况pass是什么?为什么需要它?

4

15 回答 15

496

假设您正在设计一个带有一些您还不想实现的方法的新类。

class MyClass(object):
    def meth_a(self):
        pass

    def meth_b(self):
        print "I'm meth_b"

如果您省略pass,则代码将无法运行。

然后你会得到:

IndentationError: expected an indented block

总而言之,该pass语句没有什么特别的作用,但它可以充当占位符,如此处所示。

于 2012-12-14T21:02:09.703 回答
243
于 2014-03-24T14:51:43.987 回答
24

除了用作未实现函数的占位符外,它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是在两个特别提到的情况下设置的,但在 - 情况下没有设置else。如果不使用pass,未来的程序员可能会移到flag = True条件之外——因此flag所有情况下都设置。


另一种情况是文件底部经常出现的样板函数:

if __name__ == "__main__":
    pass

在某些文件中,最好将其留在那里pass以便以后更轻松地编辑,并明确说明当文件单独运行时不会发生任何事情。


最后,正如其他答案中提到的,当捕获到异常时什么都不做可能很有用:

try:
    n[i] = 0
except IndexError:
    pass
于 2013-07-10T19:25:10.840 回答
21

最好和最准确的思考pass方式是明确告诉解释器什么都不做。以同样的方式下面的代码:

def foo(x,y):
    return x+y

意思是“如果我调用函数 foo(x, y),将标签 x 和 y 代表的两个数字相加并返回结果”,

def bar():
    pass

意思是“如果我调用函数 bar(),什么都不做。”

其他答案非常正确,但对于一些不涉及占位的事情也很有用。

例如,在我最近编写的一段代码中,需要将两个变量相除,除数可能为零。

c = a / b

如果 b 为零,显然会产生 ZeroDivisionError。在这种特殊情况下,在 b 为零的情况下,将 c 保留为零是所需的行为,因此我使用了以下代码:

try:
    c = a / b
except ZeroDivisionError:
    pass

另一种不太标准的用法是为调试器放置断点的方便位置。例如,我想要一些代码在 for...in 语句的第 20 次迭代中闯入调试器。所以:

for t in range(25):
    do_a_thing(t)
    if t == 20:
        pass

断点通过。

于 2014-01-12T21:21:38.603 回答
10

一个可以“按原样”使用的常见用例是重写一个类只是为了创建一个类型(在其他方面与超类相同),例如

class Error(Exception):
    pass

因此,您可以引发和捕获Error异常。这里重要的是异常的类型,而不是内容。

于 2012-12-14T21:09:06.313 回答
8

pass在 Python 中基本上什么都不做,但与注释不同,解释器不会忽略它。因此,您可以通过使其成为占位符来在很多地方利用它:

1:可在课堂上使用

class TestClass:
    pass

2:可用于循环和条件语句:

if (something == true):  # used in conditional statement
    pass

while (some condition is true):  # user is not sure about the body of the loop
    pass

3:可用于功能:

def testFunction(args): # The programmer wants to implement the body of the function later
    pass

pass主要用于程序员目前不想给出实现,但仍想创建某个类/函数/条件语句以供以后使用。由于 Python 解释器不允许空白或未实现的类、函数或条件语句,它会给出错误:

IndentationError:需要一个缩进块

pass可以在这样的场景中使用。

于 2015-12-10T05:49:39.167 回答
7

您可以说pass意味着NOP(无操作)操作。在这个例子之后你会得到一个清晰的画面:

C程序

#include<stdio.h>

void main()
{
    int age = 12;
  
    if( age < 18 )
    {
         printf("You are not adult, so you can't do that task ");
    }
    else if( age >= 18 && age < 60)
    {
        // I will add more code later inside it 
    }
    else
    {
         printf("You are too old to do anything , sorry ");
    }
}

现在你将如何用 Python 编写它:

age = 12

if age < 18:

    print "You are not adult, so you can't do that task"

elif age >= 18 and age < 60:

else:

    print "You are too old to do anything , sorry "

但是您的代码会出错,因为它需要在elif之后缩进块。这里是pass关键字的作用。

age = 12

if age < 18:

    print "You are not adult, so you can't do that task"

elif age >= 18 and age < 60:
    
    pass

else:

    print "You are too old to do anything , sorry "

现在我想你很清楚了。

于 2017-05-08T06:43:44.617 回答
4

pass 语句什么都不做。当语法上需要语句但程序不需要操作时,可以使用它。

于 2015-05-27T13:51:29.437 回答
4

老实说,我认为官方 Python 文档描述得很好,并提供了一些示例:

pass语句什么都不做。当语法上需要语句但程序不需要操作时,可以使用它。例如:

>>> while True: ... pass # Busy-wait for keyboard interrupt (Ctrl+C) ...

这通常用于创建最小类:

>>> class MyEmptyClass: ... pass ...

当您处理新代码时,可以使用另一个位置通道作为函数或条件体的占位符,让您可以在更抽象的层面上继续思考。pass被默默地忽略:

>>> def initlog(*args): ... pass # Remember to implement this! ...

于 2018-03-08T01:42:23.837 回答
1

如果你想导入一个模块,如果它存在,忽略导入它,如果那个模块不存在,你可以使用下面的代码:

try:
    import a_module
except ImportError:
    pass
# The rest of your code

如果您避免编写pass语句并继续编写其余代码,则会引发 IndentationError,因为打开 except 块后的行没有缩进。

于 2020-09-05T15:45:49.073 回答
0

正如书中所说,我只将它用作临时占位符,即

# code that does something to to a variable, var
if var == 2000:
    pass
else:
    var += 1

然后在后面填写场景var == 2000

于 2012-12-14T21:05:06.307 回答
0

除了“我不想让任何东西去这里”的“主要”用法之外,这是我刚刚找到的一个,假设genIterator

i = 0
obj = None

for i, obj in enumerate(gen):
    pass

这将获得最后一个yielded的对象gen和 的长度gen,一次完成。(类似于while在 C 中以分号结尾的循环,想想看。)

于 2021-09-11T04:48:02.293 回答
-1

Python 中的 pass 语句用于语法上需要语句但您不希望执行任何命令或代码时。

pass 语句是一个空操作;执行时没有任何反应。pass 在你的代码最终会去但尚未编写的地方也很有用(例如,在存根中):

例子:

#!/usr/bin/python

for letter in 'Python':
   if letter == 'h':
      pass
      print 'This is pass block'
   print 'Current Letter :', letter

print "Good bye!"

这将产生以下结果:

Current Letter : P
Current Letter : y
Current Letter : t
This is pass block
Current Letter : h
Current Letter : o
Current Letter : n
Good bye!

如果 letter 的值为 'h',上述代码不会执行任何语句或代码。当您创建代码块时, pass 语句很有帮助,但不再需要它。

然后,您可以删除块内的语句,但让块保留 pass 语句,这样它就不会干扰代码的其他部分。

于 2016-06-10T05:37:54.143 回答
-1

Pass 指的是忽略……就这么简单。如果给定条件为真并且下一条语句为pass,它会忽略该值或迭代并继续下一行。

例子:

for i in range (1, 100):
    if i%2 == 0:
        pass
    else:
        print(i)

输出:打印 1-100 的所有奇数

这是因为偶数的模等于零,因此它忽略该数字并继续下一个数字。由于奇数的模数不等于 0,循环的else部分被执行并被打印出来。

于 2019-01-09T18:52:36.410 回答
-2

pass 用于避免 Python 中的缩进错误。

如果我们采用 C、C++ 和 Java 等语言,它们的大括号如下:

 if(i==0)
 {}
 else
 {//some code}

但是在 Python 中,我们使用缩进而不是大括号,因此为了避免此类错误,我们使用pass

记得当你在做一个测验和

if(dont_know_the_answer)
    pass

示例程序,

for letter in 'geeksforgeeks':
    pass
print 'Last letter: ', letter
于 2019-05-19T03:45:04.577 回答