【问题标题】:Which way is better to skip the 'NoneType' variable?哪种方式更好地跳过“NoneType”变量?
【发布时间】:2015-10-13 17:46:54
【问题描述】:

一个列表包含多个NoneType 元素。要跳过NoneType

for item in list :
    if item is not None :
        fp.write(item + '\n')

#OR

for item in list : 
    try :
        fp.write(item + '\n')
    except :
        pass

哪个更好,为什么?

【问题讨论】:

标签: python nonetype


【解决方案1】:

作为一般经验法则,如果您能提供帮助,您不应该真正使用try: except: 模式进行控制流。引发在这种情况下不必要的异常会产生一些开销。希望这会有所帮助。

【讨论】:

  • 我不同意。 if 语句总是需要一些时间,而 try/except 块仅在触发异常时会导致减速。因此,如果None 的情况只是偶尔发生,try/except 会更快——尽管绝对应该使用except TypeError:,以免掩盖任何其他可能发生的错误。
  • @TimPietzcker 也许,但问题以“列表包含多个NoneType 元素”开头,这让我认为NoneType 的元素并不例外,因此if 是合适的。
【解决方案2】:

正如评论中提到的那样,try 方法不是好方法,因为您可能会因为该块中出现的任何其他异常而跳过一个元素。

所以第一个选项更好。这里有一个替代方案,你可以确定不是所有元素都是None,但是会消耗更多的内存:

for item in (element for element in list if element is not None):
    fp.write(item + '\n')

附:不要使用内置名称作为变量名,在您的情况下 - list

【讨论】:

  • 我有点不同意这一点:for i in <list>: if <condition>: <code> 通常比在 for 中使用列表理解要快。
  • 附录:只记得filter(None, ...) 将过滤所有非真实值,即它也会跳过例如空列表或 0。最后,(x for x in list if x is not None) 可能更好,但使用 () 而不是 [] 使其成为生成器。
  • @FunkySayu 除了速度之外,正如我提到的,内存效率低下。但是你提到的经常是什么时候?
  • @tobias_k ()[] 之间的区别就像 rangexrange 一样?
  • @n9code 关于速度问题,我在工作台上有一些不同的结果,取决于使用的数据类型、映射、过滤......这真的取决于你在做什么,我不认为有一种通用的方法可以解释为什么这更慢/更快。我应该对此进行调查......
【解决方案3】:

第二个不好,因为只要遇到None 类型的元素,它就会抛出异常。异常将在 python 中以自己的方式处理。

在你的情况下,你正在通过,所以这将完成。

更干净的方法是:

clean = [x for x in lis if x != None]

或者正如在 cmets 中指出的那样,您也可以使用 is not,即使它本质上编译为相同的字节码:

clean = [x for x in lis if x is not None]

希望这会有所帮助。在罗马时会喜欢罗马人:)

【讨论】:

  • x != Nonex is not None 几乎相同,除了 x is not None 是官方 PEP 推荐。
  • 是的,这就是我提到的,两者都遵循相同的字节码@FunkySayu
  • 但是一种语法被认为是对 PEP8 和一些基于 PEP8 的 IDE(如 PyCharm)的警告。不要使用不等式测试来测试值是否为 None。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
相关资源
最近更新 更多