在Python中是否有一种方法可以返回“字面上的”什么也没有?

53

我正在学习Python,我想知道是否有一种方法可以编写代码,做到如下功能:

def f(x):
    if x>1:
       return(x)
    else:
        # don't return anything

我询问代码的else部分。如果x<=1,则不需要返回任何内容,返回None是不可接受的。


2
调用代码会是什么样子? - cppguy
3
当你仅仅离开函数时,它会返回None。避免它的唯一方法是抛出异常或者有一个非终止的函数。 - zch
1
为什么返回 None 是不可接受的?你可以忽略函数的返回值。 - Russell Borogove
6
你没有说明为什么"None"是不可接受的,但这可能是由于误解。在函数结束时,必须通过返回值或引发异常来结束函数。 - Ned Batchelder
2
当你写var = foo()并且函数“返回实际上什么都没有”的时候,你希望var绑定到什么?你必须使用raise并添加错误处理给调用者。 - wim
显示剩余3条评论
13个回答

79
在Python中,不存在“返回空值”的概念。每个函数都会返回一些值(除非它引发异常)。如果没有使用明确的return语句,则Python将其视为返回None
因此,您需要考虑什么对于您的函数最为适当。要么返回None(或其他后续处理标识),并在调用代码中添加适当的逻辑来检测它,要么引发异常(如果调用代码希望这样做,可以捕获异常)。

5
尽管技术上可以仅使用“不返回”(而不是“返回None”)来实现同样的效果,但这会伤害我的感情。 - user166390
在编程语言中,Nonenothingnullnil 用于表示无内容:https://nshipster.com/nil/。这意味着返回 None 是正确的答案。 - Adam Erickson

25

要想字面上返回“nothing”,可以使用pass,如果将其放在函数中,则基本上返回值为None(函数必须返回一个值,为什么不是“nothing”呢?)。您也可以显式地这样做:return None

所以,您可以选择:

if x>1:
    return(x)
else:
    pass
或者
if x>1:
    return(x)
else:
    return None

能够解决问题。


4
这两个例子与根本没有else块是完全相同的。 - Blckknght
确实,但为了完整起见,为什么不把它放在那里呢? - Sinkingpoint
"OP表示返回None不可接受"。 是的,但这没有意义,而且OP也没有解释他所指的是什么。 - Ned Batchelder
2
“pass” 并不是 “基本上返回值 None”;它实际上什么也不做。在那个代码示例中发生的 None 返回是因为控制流到达函数的结尾。else: pass 等同于在 每种 情况下省略 else 块,即使在完整的 if 块之后还有更多的代码。 - Karl Knechtel

5

没有什么比只返回你想要的更好了,但这可以通过使用一个空的return语句来实现。它会返回一个None

下面是一个例子:

if 'account' in command:
    account()

def account():
    talkToMe('We need to verify your identity for this. Please cooperate.')
    talkToMe('May I know your account number please?')
    acc_number = myCommand()
    talkToMe('you said your account number is '+acc_number+'. Is it right?')
    confirmation = myCommand()
    if confirmation!='yes' or 'correct' or 'yeah':
        talkToMe('Let\'s try again!')
        account()
    else:
        talkToMe('please wait!')
    return

这将不会返回任何东西给调用函数,但会停止执行并返回到调用函数。


如果确认不是'yes'或'correct'或'yeah',那么这个语句并不能实现你想要的功能,而通过递归调用account()函数来“重新启动”函数是不明智的。 - Karl Knechtel
@KarlKnechtel 这是我正在开发的一个项目中的代码片段。该代码在项目方面是正确的,并且回答了所提出的问题。 - Hrishikesh Shukla

4

这个怎么样?

def function(x):
     try:
         x = x+1
         return (x)
     except:
         return ('')

所以这是所有这些网页中唯一有意义的东西,出于某种原因。我真的甚至不想返回一个空字符串,但它可以工作,因为我现在不想看到“None”被打印出来。 - user3553260
1
"但它能工作是因为我现在不想看到打印出None。这里存在一个 XY 问题,原始问题没有正确澄清问题。" - Karl Knechtel

2

除了所有答案之外,不返回函数的唯一实际方法是引发异常。至少,在程序需要在未返回任何内容的情况下继续运行时是这样。

因此,您的代码可以是:

def f(x):
    if x>1:
        return x
    raise Exception

(请注意,我没有使用else块来引发异常,因为如果条件已满足,它将已经返回了值。但是,您也可以在else块中执行此操作)

在测试运行时:

num1 = f(2)    # 2
num2 = f(0)    # Unbound; and error raised

如果你想在某些条件下仍然返回None,而在其他条件下不返回任何内容,那么这将非常有用:

def f(x):
    if x > 0:
        return x
    elif x == 0:
        return None  # pass
    raise Exception

>>> num1 = f(1)  # 1
>>> num2 = f(0)  # None
>>> num3 = f(-1) # Unbound; and error raised

如果您不希望程序退出并显示错误,可以在函数外部捕获异常:
try:
    num = f(0)
except:
    pass

这样,如果f(0)引发异常(它确实会这样做),则会被except块捕获,并且您可以继续程序的运行,放心num不是None,而只是未绑定。


一个有趣的事实:
也许不返回任何东西的唯一方法就是简单地退出程序,这就是 exit()quit() 所做的。当我在我的代码编辑器中检查 exit()quit() 的返回类型时,它会显示给我 NoReturn,这与普通函数显示 None 不同 :)

2
您可以像这样做:

您可以这样做:

>>> def f(x):
...    return x if x>1 else None
... 
>>> f(1),f(2)
(None, 2)

它看起来会“什么都不返回”:

>>> f(1)
>>> 

但是即使是替代方案也会返回空值:

>>> def f2(x): 
...    if x>1: return x
... 
>>> f2(1),f2(2)
(None, 2)

或者:

>>> def f2(x):
...    if x>1: 
...        return x
...    else:
...        pass
... 
>>> f2(1),f2(2)
(None, 2)

因此,无论你怎么写,它们在功能上都是相同的。

1

如果你想从返回语句中获得一个空白结果,只需输入 return ""。这样,在最后一行将只会得到一个空白行而没有任何打印出来的内容。

def f(x):
    if x>1:
       return(x)
    else:
        return ""

这已经在这里被建议过了。 - rachwa

1

如其他人所述,根据您的情况它将始终返回None。但是,如果您不想返回None类型,则可以将其替换为空格。

def test(x):
    if x >1:
        return(x)
    else:
        return print('')

1
无需使用print()-只需使用return'' - Thickycat

1

此处有两种方法,前一种方法会明确地返回 None ,而后一种方法不会。

def fn1():
    pass

def fn2():
    return None

fn1() == fn2()
True

我的个人偏好始终是显式方法,因为它减少了心理负担。


0

简单来说

for i in range(0,10):
    if i<5:
        None
    else:
       print("greater")

输出:-

greater
greater
greater
greater
greater

对于所有小于5的值,该代码不会输出任何内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接