Py学习  »  Python

在python代码中使用pass语句的目的是什么?[复制品]

Ranjith Udayakumar • 4 年前 • 1162 次点击  

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

但我还是不完全明白这意味着什么。有人能告诉我一个简单/基本的情况吗 通过 将使用语句,为什么需要它?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40194
 
1162 次点击  
文章 [ 14 ]  |  最新文章 4 年前
Kamil Cuk
Reply   •   1 楼
Kamil Cuk    5 年前

pass指的是ignore….尽管很简单….如果给定条件为true,下一条语句为pass,则忽略该值或迭代并继续下一行….. 例子

For i in range (1,100):
    If i%2==0:
                  Pass 
    Else:
                  Print(i)

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

这是因为偶数模等于零,因此它忽略这个数并继续到下一个数,因为奇数模不等于零,所以执行循环的其他部分并打印它

DGKarlsson M.K.DHEERAJ
Reply   •   2 楼
DGKarlsson M.K.DHEERAJ    7 年前

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!

如果字母值为“h”,则前面的代码不执行任何语句或代码。当您创建了代码块但不再需要它时,pass语句很有帮助。

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

Edward Tyler
Reply   •   3 楼
Edward Tyler    8 年前

这里有一个例子,我从一个列表中提取特定的数据,在这个列表中,我有多个数据类型(这就是我在r中所说的——如果命名错误的话很抱歉),我只想提取整数/数字,而不是字符数据。

数据看起来像:

>>> a = ['1', 'env', '2', 'gag', '1.234', 'nef']
>>> data = []
>>> type(a)
<class 'list'>
>>> type(a[1])
<class 'str'>
>>> type(a[0])
<class 'str'>

我想删除所有的字母字符,所以我让机器通过对数据进行子集和“传递”字母数据来完成这项工作:

a = ['1', 'env', '2', 'gag', '1.234', 'nef']
data = []
for i in range(0, len(a)):
    if a[i].isalpha():
        pass
    else:
        data.append(a[i])
print(data)
['1', '2', '1.234']
Cameron Sparr
Reply   •   4 楼
Cameron Sparr    11 年前

就像书上说的,我只把它当作临时占位符,

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

然后再填写场景 var == 2000

Usagi
Reply   •   5 楼
Usagi    6 年前

老实说,我认为 official Python docs 请详细描述并举例说明:

这个 通过 声明不起作用。当语句在语法上是必需的但程序不需要操作时,可以使用它。例如:

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

这通常用于创建最小类:

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

另一个地方 通过 可用于在处理新代码时作为函数或条件体的占位符,允许您在更抽象的层次上进行思考。这个 通过 被默默忽略:

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

Harsha Biyani yooknoweb
Reply   •   6 楼
Harsha Biyani yooknoweb    8 年前

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

Deepak Dixit
Reply   •   7 楼
Deepak Dixit    6 年前

你可以这么说 通过 方法 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 "

但是您的代码将给出错误,因为它需要在 否则如果 . 以下是 通过 关键字。

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 "

现在我想你明白了。

nmagerko Arijit
Reply   •   8 楼
nmagerko Arijit    7 年前

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): # programmer wants to implement the body of the function later
       pass

通过 主要用于程序员现在不想给出实现,但仍然想创建一个特定的类/函数/条件语句,以便以后使用。由于python解释器不允许空白或未实现的类/函数/条件语句,因此它会给出一个错误:

缩进错误:需要缩进的块

通过 可以在这种情况下使用。

dm03514
Reply   •   9 楼
dm03514    11 年前

如果你不知道要在某个代码块中放入什么

try:
   int(someuserinput)
except ValueError:
   pass

我也喜欢在做测试的时候用它。我经常意识到我想测试什么,但不知道怎么做。测试示例与sebastian_oe建议的类似

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass
Tibo
Reply   •   10 楼
Tibo    11 年前

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

class Error(Exception):
    pass

所以你可以举起来抓住 Error 例外情况。这里重要的是异常的类型,而不是内容。

Schilcote
Reply   •   11 楼
Schilcote    10 年前

最好最准确的思考方式 pass 是一种明确告诉翻译什么也不做的方法。以同样的方式执行以下代码:

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

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

def bar():
    pass

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

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

例如,在我最近编写的一段代码中,有必要对两个变量进行除法,除数可能为零。

c = a / b

很明显,如果b为零,将产生一个零分错误。在这种特殊情况下,在b为零的情况下,将c保留为零是所需的行为,因此我使用了以下代码:

try:
    c = a / b
except ZeroDivisionError:
    pass

另一个不太标准的用法是为调试器放置断点。例如,我想要一些代码在for的第20次迭代中进入调试器…在声明中。所以:

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

在传递时使用断点。

Micah Walter
Reply   •   12 楼
Micah Walter    9 年前

除了用作未实现函数的占位符之外, 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 而不是分配,但在需要突变的情况下,这是最好的。

使用 通过 这里特别有助于提醒未来的维护人员(包括您自己!)不要把多余的步骤放在条件语句之外。在上面的例子中, flag 在两个特别提到的案例中设置,但在 else -病例。不使用 通过 ,未来的程序员可能会 flag = True 从而设置 旗帜 在里面 全部的 病例。


另一个例子是在文件底部经常看到的样板函数:

if __name__ == "__main__":
    pass

在一些档案里,把它放在那里可能会更好 通过 允许以后更容易地编辑,并明确表示当文件单独运行时不会发生任何事情。


最后,如其他答案中所述,在捕获异常时不执行任何操作可能很有用:

try:
    n[i] = 0
except IndexError:
    pass
Zero Piraeus
Reply   •   13 楼
Zero Piraeus    6 年前

python的语法要求是在 if , except , def , class 等)不能为空。然而,空代码块在各种不同的上下文中都很有用,例如下面的示例,这是我见过的最常见的用例。

因此,如果代码块中不应该发生任何事情,则 pass 需要这样一个块才能不产生 IndentationError . 或者,任何语句(包括要评估的术语,如 Ellipsis 字面意义的 ... 或者可以使用字符串,通常是docstring),但是 通过 明确表示实际上什么都不应该发生,也不需要实际评估和(至少暂时)存储在内存中。

  • 忽略(全部或)某种类型的 Exception (示例来自 xml ):

    try:
        self.version = "Expat %d.%d.%d" % expat.version_info
    except AttributeError:
        pass # unknown
    

    注: 忽略所有类型的引发,如下例所示 pandas ,通常被认为是不好的做法,因为它还捕获可能应传递给调用方的异常,例如。 KeyboardInterrupt SystemExit (甚至) HardwareIsOnFireError 你怎么知道你没有在一个定义了特定错误的自定义框上运行,一些调用应用程序会想知道这些错误?).

    try:
        os.unlink(filename_larry)
    except:
        pass
    

    而是至少使用 except Error: 或者在这种情况下最好 except OSError: 被认为是更好的做法。对我安装的所有python模块的快速分析使我发现 except ...: pass 语句捕获所有异常,因此它仍然是python编程中的常见模式。

  • 派生不添加新行为的异常类(例如 scipy ):

    class CompileError(Exception):
        pass
    

    类似地,作为抽象基类的类通常有一个显式的空 __init__ 或者子类应该派生的其他方法。(例如) pebl )

    class _BaseSubmittingController(_BaseController):
        def submit(self, tasks): pass
        def retrieve(self, deferred_results): pass
    
  • 在不关心结果的情况下(从 mpmath ):

    for x, error in MDNewton(mp, f, (1,-2), verbose=0,
                             norm=lambda x: norm(x, inf)):
        pass
    
  • 在类或函数定义中,通常docstring已经作为 强制性声明 作为街区里唯一的东西被处决。在这种情况下,块可以包含 通过 此外 对于docstring,为了表示“这实际上是为了什么也不做”。 聚乙二醇 :

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
    
  • 在某些情况下, 通过 用作占位符来表示此方法/类/if块/…尚未实现,但这将是执行它的地方,尽管我个人更喜欢 省略 字面意义的 为了严格区分这一点和前一个示例中的故意“不操作”。 例如,如果我用粗笔画写一个模型,我可能会写

    def update_agent(agent):
        ... 
    

    其他人可能有的地方

    def update_agent(agent):
        pass
    

    之前

    def time_step(agents):
        for agent in agents:
            update_agent(agent)
    

    以提醒您填写 update_agent 稍后运行函数,但已运行一些测试,以查看其余代码是否按预期运行。(本案的第三种选择是 raise NotImplementedError . 这在两种情况下尤其有用:或者 这个抽象方法应该由每个子类实现,在这个基类中没有通用的方法来定义它 –此函数的名称尚未在此版本中实现,但它的签名将是这样的– )

theUtherSide sebastian_oe
Reply   •   14 楼
theUtherSide sebastian_oe    5 年前

假设您正在设计一个新类,其中包含一些您还不想实现的方法。

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

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

如果你不考虑 pass ,代码无法运行。

然后你会得到:

IndentationError: expected an indented block

总而言之, 通过 语句没有什么特别的功能,但它可以充当占位符,如这里所示。