&引用;通行证;同「;返回“无”;用Python?

&引用;通行证;同「;返回“无”;用Python?,python,python-2.7,Python,Python 2.7,我已经学习python大约一周了,下面是一个问题: 代码 def Foo(): pass def Bar(): return None a = Foo() print(a) # None b = Bar() print(b) # None 用法 def Foo(): pass def Bar(): return None a = Foo() print(a) # None b = Bar() print(b) # None 问题: 1.既然我们已经一无

我已经学习python大约一周了,下面是一个问题:

代码

def Foo():
    pass

def Bar():
    return None
a = Foo()
print(a)
# None
b = Bar()
print(b)
# None
用法

def Foo():
    pass

def Bar():
    return None
a = Foo()
print(a)
# None
b = Bar()
print(b)
# None
问题
1.既然我们已经一无所获,为什么还需要通行证?是否存在返回None不能处理但传递can的场景?

应回答这两个问题的示例:

Pass可用于异常处理:

try:
    something()
except:
    pass  # does not return
this_still_executes()
Pass可用于声明没有新元素的类:

class CustomError(Exception):
    pass

另一种情况是
pass
意味着现在还没有实现,但将来会实现。例如,在编写实际逻辑之前,您定义了一些API:

def get():
    pass

def post():
    pass

def put():
    pass

...
此语义不能替换为
返回None
。正如viraptor所说,如果使用
returnnone
而不是
pass
,有时会出现语法错误

pass
是一个“空”命令,但是
return
停止函数/方法

示例:

def func():
    do_something()      #executed
    pass
    do_something_else() #also executed
但是:

在第二种情况下,
returnnone
是:“停止函数并返回None”。 但是
pass
就像“转到下一行”

如您所见,这些函数完全相同。除了样式,或者告诉其他程序员函数的意图之外,没有理由使用一个而不是另一个(在这个具体的例子中)


但总的来说是有区别的
return
语句中断当前函数的执行,而
pass
语句则不中断当前函数的执行。

在Python等语言中,有两种类型的“东西”被计算:表达式和语句。表达式是,嗯,表达式,它的计算结果是。例如
1
1+1
,或
f(x)
都是表达式,计算结果都有一定的意义

相比之下,语句不是“返回”任何东西,而是“作用于环境”。例如,
x=3
将变量
x
设置为值
3
def f(x):返回x+1
设置函数的
f
值。它不会“评估”任何东西,它会修改当前的评估环境

考虑到这一点,您有时需要一个空语句。出于语法方面的原因,Python中有些地方需要一个语句,但如果您不希望在这里发生任何事情,您可能希望表示发生的事情恰恰是“无”。一种方法是对表达式求值,而不对其进行任何处理:

def f():
    1
但随便一看,这可能表明此函数返回
1
:相反,您可以使用
pass
作为明确声明:“什么也不做”:

def f():
    pass
现在,还有另一个问题:我前面提到,
f(x)
是一个表达式。但是在上面的两个例子中,我没有输入任何
返回值
,那么这些值是用来做什么的呢?答案是:除非另有规定,否则函数调用返回(即计算为)
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(除非另有规定)这一事实,导致了您观察到的行为(尽管它们在概念上不同)。

Python中的所有函数/方法/可调用项最终都返回None(无),当然,除非您手动返回任何其他值。您可以想象,在所有自定义代码之后,每个函数都有一个隐式的
returnnone
语句。如果您更早地使用自己的
return
语句退出该函数,则无法访问该函数,也没有任何效果。另外,没有值的裸
返回
也会自动返回默认值
None


在这种语言中需要
pass
语句(“DoNothing”),因为我们使用不同的缩进级别定义代码块,而不使用括号(例如C、Java等中的
{…}
)或关键字(例如Bash中的
if…fi

因此,如果您需要某个空代码块(尚未执行任何操作的函数、空类、空异常捕捉器等),在其他语言中,您只需在开始和结束括号或关键字之间放置任何内容。在Python中,需要一段缩进的代码,否则就是语法错误。因此,我们必须传递——什么也不做,尽管我们必须在那个地方编写代码

一些例子:

  • 类MyPersonalException(异常):
    #没有任何附加信息或功能的简单异常
    #“不返回”不起作用。
    通过
    
  • def lazy_函数():
    #懒得做任何事。。。
    #通常在需要实现方法以匹配接口时使用,
    #但不应该做任何事情。
    #“不返回”在这里也适用。
    
  • 试试看:
    #[在这里做点什么]
    捕获:
    #如果它失败了,我们不必做任何事情,只要捕获并抑制异常即可
    通过
    
所以
pass
的意思就是什么都不做,继续处理下一行


总结:

return None
总是隐式添加到每个函数定义的最后一行下面。它也只能出现在函数中并立即退出,返回一个值(或默认值为
None


pass
没有语义含义,它不会以任何方式被解释。它的唯一目的是允许创建空代码块,这在Python中是不可能的,因为我们不使用括号等来包围代码块。它可以写在任何地方,而且总是这样:什么都不做。

我发现瓦尔的回答更详细,我想