我正在学习Python,并且已经到达有关该pass
语句的部分。我正在使用的指南将其定义Null
为通常用作占位符的语句。
我仍然不完全明白那是什么意思。有人可以告诉我一个简单/基本的情况下使用该pass
语句以及为什么需要该语句吗?
pass
,该except
块非常有用。
我正在学习Python,并且已经到达有关该pass
语句的部分。我正在使用的指南将其定义Null
为通常用作占位符的语句。
我仍然不完全明白那是什么意思。有人可以告诉我一个简单/基本的情况下使用该pass
语句以及为什么需要该语句吗?
pass
,该except
块非常有用。
Answers:
假设您正在使用尚未实现的某些方法设计一个新类。
class MyClass(object):
def meth_a(self):
pass
def meth_b(self):
print "I'm meth_b"
如果您不使用pass
,则代码将无法运行。
然后,您将获得:
IndentationError: expected an indented block
总而言之,该pass
语句没有什么特别的,但是可以充当占位符,如此处所示。
pass
,但我仍然不太了解它的作用。生产代码中有此用途吗?从您的示例中,我选择仅在准备好实现该方法之前才添加该方法,否则我只会这样做return
。
Python有句法的要求,即代码块(后if
,except
,def
,class
等等)不能为空。但是,空代码块在各种不同的上下文中都很有用,例如下面的示例,这是我见过的最常见的用例。
因此,如果在代码块中什么也不会发生,pass
则需要a 来使该块不产生IndentationError
。或者,可以使用任何语句(仅包括要求值的术语,如Ellipsis
文字...
或字符串,通常是文档字符串),但要说明的pass
是,实际上不应该发生任何事情,不需要实际求值,并且(至少暂时)存储在内存中。
忽略(全部或)某种类型的Exception
(例如来自xml
):
try:
self.version = "Expat %d.%d.%d" % expat.version_info
except AttributeError:
pass # unknown
注意:忽略所有类型的加薪,如下面的示例中所示pandas
,通常被认为是不好的做法,因为它还会捕获可能应该传递给调用者的异常,例如KeyboardInterrupt
or SystemExit
(或HardwareIsOnFireError
- 甚至您如何知道自己不是在定义了特定错误的自定义框上运行,某些调用应用程序可能想知道这些错误?)。
try:
os.unlink(filename_larry)
except:
pass
替代地,至少except Error:
或在这种情况下优选地except OSError:
被认为是更好的实践。快速分析我安装的所有python模块后,我发现所有except ...: pass
语句中有10%以上会捕获所有异常,因此在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
在类或函数定义中,通常已经有一个文档字符串,作为强制性语句要作为块中唯一的内容执行。在这种情况下,该块可能包含pass
除文档字符串之外的其他内容,以便说“这确实是无所事事。”,例如pebl
:
class ParsingError(Exception):
"""Error encountered while parsing an ill-formed datafile."""
pass
在某些情况下,pass
用作占位符时说“此方法/类/ if-block / ...尚未实现,但这将是执行此操作的地方”,尽管我个人更喜欢该Ellipsis
文字...
,以便在前面的示例中,请严格区分此内容和故意的“无操作”。(请注意,省略号文字仅在Python 3中才是有效的表达式。)
例如,如果我用粗笔写出一个模型,我可能会写
def update_agent(agent):
...
其他人可能有的地方
def update_agent(agent):
pass
之前
def time_step(agents):
for agent in agents:
update_agent(agent)
提醒您update_agent
稍后再填写该功能,但已经运行了一些测试以查看其余代码是否按预期运行。(这种情况的第三个选项是raise NotImplementedError
。这在两种情况下特别有用:“每个子类都应实现此抽象方法,在此基类中没有定义它的通用方法”,或“此函数具有此名称尚未在此版本中实现,但这是其签名将显示为的样子”)
除了将其用作未实现函数的占位符外,它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
here对警告将来的维护者(包括您自己!)不要在条件语句之外放置多余的步骤特别有用。在上面的示例中,flag
在两个具体提到的情况下设置了,但在else
-case中没有设置。如果不使用pass
,将来的程序员可能会转移flag = True
到该条件之外,因此flag
在所有情况下都应如此。
另一种情况是通常在文件底部看到样板函数:
if __name__ == "__main__":
pass
在某些文件中,最好保留其中的内容pass
,以便以后进行更轻松的编辑,并明确表明在单独运行文件时不会发生任何事情。
最后,如其他答案中所述,捕获异常时不执行任何操作可能很有用:
try:
n[i] = 0
except IndexError:
pass
flag = False
在if ... elif
块之前设置,以防止稍后出现模糊的“ NameError:未定义名称'flag'”错误。关于第二个示例,似乎必须将pythonzar添加if __name__ == "__main__": pass
到大多数直接执行时不执行任何操作的Python文件中(在编写模块化代码时就是这种情况)。在Python> = 3.0的情况下,您应该使用...
(省略号)而不是pass
表示“稍后完成”块。
最好和最准确的思考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
断点通过。
def bar(): pass
不做“绝对不做”。它仍然None
隐式返回。
可以“按原样”使用的常见用例是重写类,仅是为了创建类型(否则与超类相同),例如
class Error(Exception):
pass
因此,您可以引发并捕获Error
异常。这里重要的是异常的类型,而不是内容。
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
pass
通常在程序员不愿提供实现但仍希望创建某个类/函数/条件语句(以后可以使用)时使用。由于Python解释器不允许空白或未实现的类/函数/条件语句,因此会产生错误:
IndentationError:应缩进的块
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 "
现在,我认为这很清楚。
&&
运营商并不在Python存在
pass语句不执行任何操作。当在语法上需要一条语句但该程序不需要任何操作时,可以使用它。
老实说,我认为Python的官方文档对此进行了很好的描述并提供了一些示例:
该通语句什么也不做。当在语法上需要一条语句但该程序不需要任何操作时,可以使用它。例如:
>>> while True: ... pass # Busy-wait for keyboard interrupt (Ctrl+C) ...
这通常用于创建最少的类:
>>> class MyEmptyClass: ... pass ...
当您在处理新代码时,可以使用另一个地方通行证作为函数或条件主体的占位符,从而使您可以继续进行更抽象的思考。该通被自动忽略:
>>> def initlog(*args): ... pass # Remember to implement this! ...
如书中所述,我只曾将其用作临时占位符,即
# code that does something to to a variable, var
if var == 2000:
pass
else:
var += 1
然后填写场景 var == 2000
传递是指忽略...。就这么简单....如果给定条件为真,并且下一条语句通过,它将忽略该值或迭代并继续执行下一行.....示例
For i in range (1,100):
If i%2==0:
Pass
Else:
Print(i)
输出:打印1-100中的所有奇数
这是因为偶数的模数等于零,因此它忽略该数并继续到下一个数字,因为奇数模数不等于零,则执行循环的其他部分并将其打印出来
SyntaxError
。另外,这也不是一个好用处,pass
因为您可以简单地做一下for i in range(1,100):print(i)if i%2else""
这是一个示例,其中我从具有多种数据类型的列表中提取特定数据(这就是我在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']
在语法上需要语句但您不希望执行任何命令或代码时,使用Python中的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语句一起保留,以免干扰代码的其他部分。
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
pass
想当您想重写子类中的方法而不执行任何操作时,它会很有用。