防止函数在`for`循环中首先不返回`return`

时间:2018-02-03 06:27:54

标签: python python-2.7 list

我有一个功能来检查列表中的“负”,“正”和“零”值。以下是我的功能:

def posnegzero(nulist):
    for x in nulist:
        if x > 0:
            return "positive"
        elif x < 0:
            return "negative"
        else:
            return "zero"

但是当我运行这个函数时,它会在检查列表中第一个数字的值后停止。例如:

>>> posnegzero([-20, 1, 2, -3, -5, 0, 100, -123])
"negative"

我希望它继续整个列表。在上面的函数中,如果我将return的每个实例更改为print,那么它会执行它应该执行的操作,但现在我不希望它在函数完成时说None。我错在哪里的想法?

4 个答案:

答案 0 :(得分:12)

return停止函数的控制流并返回流。您可以在此处使用yield,这会将您的功能转换为generator。例如:

def posnegzero(nulist):
    for x in nulist:
        if x > 0:
            yield "positive"
        elif x < 0:
            yield "negative"
        else:
            yield "zero"

每次在返回的对象上调用next()时,它将产生下一个结果:

>>> result = posnegzero([-20, 1, 2, -3, -5, 0, 100, -123])
>>> next(result)
'negative'
>>> next(result)
'positive'
>>> next(result)
'positive'

或者您可以立即获得所有结果:

>>> result = posnegzero([-20, 1, 2, -3, -5, 0, 100, -123])
>>> list(result)
['negative', 'positive', 'positive', 'negative', 'negative', 'zero', 'positive', 'negative']

您也可以使用for循环进行迭代。 for循环重复调用next()方法,直到收到StopIteration异常为止。例如:

for result in posnegzero([-20, 1, 2, -3, -5, 0, 100, -123]):
    print(result)

# which will print
negative
positive
positive
negative
negative
zero
positive
negative

有关yield的详情,请参阅:What does the “yield” keyword do?

答案 1 :(得分:4)

您的问题立即在第一个列表元素

上返回

就个人而言,我会这样做 - 仅为值定义函数。不是清单。在列表的每个值上运行该函数

(Python 3)

def posnegzero(x):
    if x > 0:
        return "positive"
    elif x < 0:
        return "negative"
    else:
        return "zero"

print(list(map(posnegzero, [-20, 1, 2, -3, -5, 0, 100, -123]))) 

答案 2 :(得分:0)

您可以随时在列表中构建结果:

def posnegzero(lst):
    result = []

    for x in lst:
        if x > 0:
            result.append("positive")
        elif x < 0:
            result.append("negative")
        else:
            result.append("zero")

    return result

其工作原理如下:

>>> posnegzero([-20, 1, 2, -3, -5, 0, 100, -123])
['negative', 'positive', 'positive', 'negative', 'negative', 'zero', 'positive', 'negative']

甚至是条件列表理解:

def posnegzero(lst):
    return ["positive" if x > 0 else "negative" if x < 0 else "zero" for x in lst]

答案 3 :(得分:0)

Try this

d=["pos" if i>0  else "neg"if i<0  else "zero" for i in [-20, 1, 2, -3, -5, 0, 100, -123]]

output

['neg', 'pos', 'pos', 'neg', 'neg', 'zero', 'pos', 'neg']