如何在Python中避免对None进行for-in循环

17 投票
2 回答
16977 浏览
提问于 2025-04-18 05:57

我知道我可以在代码周围加一些if语句来避免这个问题,但我想找一种更好的做法,或者说是处理这种编程问题的好方法。

我正在循环处理一个函数的结果,但没有先把结果存储到一个单独的变量里;就像这样:

for item in mycustimitemgetter.itter():
   dosomething()

这个itter函数返回的是None,而不是一个空列表[],这导致Python抛出一个异常。这个行为是Python正常的表现,没什么问题。但我想找到一个更好的解决方案来:

a) 保持代码简洁明了(不把结果存到变量里,也不去做if != None之类的判断)

b) 把None的返回值当作一个空列表来处理,也就是说不执行循环,默默地忽略函数返回None这个事实。

2 个回答

9

你有一个叫做 itter() 的方法,它会返回一个可迭代的对象。根据这个函数的名字,我们可以合理地认为“返回的值应该总是可以被迭代”。所以,如果你要返回一个列表的话,如果没有值,就应该返回一个空列表。

在你的代码中可以执行一些操作。添加以下内容是完全没问题的:

if retval is None:
  return []
return retval

或者

return retval or []

根据你使用的类型,把这些放在 itter() 实现的末尾也是可以的。

想一想:你写了这段代码,现在遇到了这个问题。那么,如果其他人想用你的代码,但不知道你知道的这些,他们会期待什么呢?

另外,如果合适的话,你可以使用生成器。生成器里面有一个 'next' 方法(可以查看链接中的文档),如果没有值的话,你可以返回 false。

30

也许可以利用这样一个事实:空列表[]None在判断时都被认为是假的,而有内容的列表则被认为是真的。

for item in (mycustimitemgetter.itter() or []):
   dosomething()

撰写回答