如果变量存在,如何返回

时间:2017-07-03 10:27:31

标签: python

我有以下功能,但是当我运行data时,它会在分配之前抛出foo(-1)之类的错误。我希望它返回None。我们可以从函数中返回许多值,其中一个值是有条件的。我不想在if elif构造中写回报。

def foo(x):
    if x > 1:
        data = range(0,10)
    elif x < 0:
        print 'not valid'

    return 1, 2, 3, data or None

在开始时是否还有其他选择来定义数据?像return 1, 2, 3, [data if data]使用列表理解或其他东西

4 个答案:

答案 0 :(得分:3)

在功能开头定义数据,如果,则返回语句将按预期返回

def foo(x):
    data = None
    if x > 1:
        data = range(0,10)
    elif x < 0:
        print 'not valid'

    return 1, 2, 3, data

答案 1 :(得分:0)

仅当x大于1时才初始化数据。如果x不大于1,则数据未初始化但您尝试返回它。您需要在开始之前输入数据:

def foo(x):
    data = None
    if x > 1:
        data = range(0,10)
    elif x < 0:
        print 'not valid'

    return 1, 2, 3, data

答案 2 :(得分:0)

当前答案实际上并未回答问题;他们只是建议显式定义变量。 要仅在变量存在的情况下返回变量,应使用三元运算符:

a if condition else b

在这种情况下,您似乎可以使用:

def foo(x):
    if x > 1:
        data = range(0,10)
    elif x < 0:
        print 'not valid'
    return 1, 2, 3, data if 'data' in locals() else None

这样,将任何大于1的数字传递给foo()都会返回元组:

(1, 2, 3, range(0, 10))

传递小于1的任何数字将返回元组:

(1, 2, 3, None)

我认为此方法更可取,因为它可以清楚地说明您在做什么。您说的是“返回此内容,但如果不存在,则返回None”。如果您首先初始化变量,那么这可以看作是您在某些情况下意外忘记设置变量的情况。

答案 3 :(得分:0)

您是否尝试过使用字典的 .get() 方法?

示例:

>>> # this makes an empty dictionary,
>>> #  then tries to get the value with key 'data',
>>> #  and returns 'default' if the key is not found
>>> #  (or if the found value is None)
>>> {}.get('data', 'default')
'default'
>>> # .get()'s default parameter is optional, and will
>>> #  be set to None if you don't provide a value
>>> print({}.get('data'))
None
>>> # it's worth being careful about ranges
>>> {'data': range(0, 10)}.get(data)
range(0, 10)
>>> # you may want the actual numbers instead of the range generator
>>> {'data': [datum for datum in range(0, 10)]}.get(data)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

例如:

def foo(x):
    my_dict = dict()
    if x > 1:
        my_dict['data'] = range(10)  # range(0,10) == range(10)
    elif x < 0:
        print 'not valid'
    return 1, 2, 3, my_dict.get('data')

警告:

以上将返回类型为 (int, int, int, range) 或类型为 (int, int, int, None) 的元组。如果您希望类型在有效情况下更像 (int, int, int, int, int, ..., int),那么我建议您切换函数,例如:

def foo(x):
    solution = [1,2,3]
    if x > 1:
        solution.extend([n for n in range(10)])
    else:
        solution.append(None)
    if x < 0:
        print('x required to be positive number')
    return solution