我有一个功能来检查列表中的“负”,“正”和“零”值。以下是我的功能:
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
。我错在哪里的想法?
答案 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']