我一直在学习python大约一周,下面是问题:
代码
def Foo():
pass
def Bar():
return None
用法
a = Foo()
print(a)
# None
b = Bar()
print(b)
# None
问题: 1.当我们已经返回无时,为什么我们需要传递?是否有某些情况返回无无法处理但传递可以吗?
答案 0 :(得分:11)
pass
是一个“空”命令,但return
会停止函数/方法。
示例:
def func():
do_something() #executed
pass
do_something_else() #also executed
但:
def func2():
do_something() #executed
return None
do_something_else() #NOT executed
在第二种情况下,return None
是:“停止该函数并返回None”。
但pass
就像“转到下一行”
答案 1 :(得分:7)
在像Python这样的语言中,您有两种类型的“事物”被评估:表达式和语句。表达式是表达式,用于评估到的某些东西。例如,1
,1+1
或f(x)
都是表达式,对某些内容进行评估。
相比之下,陈述并非“返回”任何东西,相反,它们“依赖于环境”。例如,x=3
将变量x
设置为值3
。 def f(x): return x + 1
将f
的值设置为函数。这不会“评估”任何东西,它会修改评估事物的当前环境。
考虑到这一点,您有时需要空语句。出于语法原因,Python中有些地方你需要一个语句,但是如果你不想在这里发生任何事情,你可能想要表达所发生的事情恰恰是“没有”。一种方法是评估表达式并对其无效:
def f():
1
但随便一眼就可以看出这个函数返回 1
:相反,你可以使用pass
作为明确地说明:'什么都不做':
def f():
pass
现在,又有一个问题:我之前提到f(x)
是一个表达式。但是在上面的两个例子中,我没有放任何return
,那么这些评价是什么呢?答案是:函数调用返回(即求值为)None
,除非另有说明。所以:
def f():
pass
def g(x):
if x > 2:
return x
def h():
return None
f() # None
g(3) # 3 -> we explicitely say `return x`
g(1) # None -> no return specified for that path
h() # None -> we explicitely say `return None`
其他人提到过pass可以在其他地方使用(例如在空类中,在异常处理中......)。原因是所有这些都需要一些语句,而pass
允许指定一个空语句。除了另外指定的函数返回None
这一事实之外,还会导致您观察到的行为(尽管它们在概念上是不同的)。
答案 2 :(得分:3)
应该回答这两个问题的例子:
Pass可用于异常处理:
try:
something()
except:
pass # does not return
this_still_executes()
Pass可用于声明没有任何新元素的类:
class CustomError(Exception):
pass
答案 3 :(得分:1)
Python return None
中的所有函数/方法/ callable最后,除非你手动返回任何其他值,当然。您可以想象在所有自定义代码之后,每个函数都有一个隐式return None
语句。如果您使用自己的return
语句提前退出该函数,则它无法到达且无效。另外,没有值的裸return
会自动返回None
作为默认值。
这种语言需要pass
语句("什么都不做"),因为我们使用不同的缩进级别定义代码块而不使用括号(例如C中的{ ... }
, Java等)或关键字(例如Bash中的if ... fi
)。
因此,如果你需要一个空代码块(函数还没有做任何事情,空类,空异常捕获器......),在其他语言中你只需在开始和结束括号之间放置任何内容或者关键词。在Python中,您需要一段缩进的代码,否则会出现语法错误。因此我们有pass
- 什么都不做,尽管我们必须在那个地方编写代码。
一些例子:
class MyPersonalException(Exception):
# simple exception without any additional information or functionality
# 'return None' would not work.
pass
def lazy_function():
# too lazy to do anything...
# often used if a method needs to be implemented to match an interface,
# but should not do anything.
# 'return None' would work here as well.
try:
# [do something here]
catch:
# we don't have to do anything if it fails, just catch and suppress the exception
pass
所以pass
只是意味着什么也不做,只是继续处理下一行。
要点:
return None
总是隐含地添加到每个函数定义的最后一行之下(或者可以想象)。它也只能出现在函数中并立即退出它们,返回一个值(默认为None
)。
pass
没有语义含义,不会以任何方式解释。它的唯一目的是允许创建空代码块,这在Python中是不可能的,因为我们不使用括号等来围绕块。它可以写在任何地方,并且总是一样:没有。
答案 4 :(得分:0)
另一种情况是pass
表示目前尚未实施,但将来会实施。例如,在编写实际逻辑之前,您需要定义一些API:
def get():
pass
def post():
pass
def put():
pass
...
这种语义含义不能被return None
取代。就像viraptor所说,如果你使用return None
而不是pass
,有时会出现语法错误。
答案 5 :(得分:0)
>>> import dis
>>> dis.dis(Foo)
2 0 LOAD_CONST 0 (None)
3 RETURN_VALUE
>>> dis.dis(Bar)
2 0 LOAD_CONST 0 (None)
3 RETURN_VALUE
正如您所看到的那些完全相同的功能。除了样式之外没有理由使用一个(在这个具体的例子中)并且可能告诉其他编码人员该功能的意图是什么。
一般情况下会有所不同。 return
语句会中断当前函数的执行,而pass
则不会。