Which way is better to skip the 'NoneType' variable?
列表包含多个NoneType元素。跳过NoneType,
1 2 3 4 5 6 7 8 9 10 11 12 13
| for item in list :
if item is not None :
fp.write(item + '
')
#OR
for item in list :
try :
fp.write(item + '
')
except :
pass |
哪一个更好,为什么?
- 第二个将跳过所有不支持字符串连接的类型。
- 你的最终目标是什么?
- 您可以在这个答案stackoverflow.com/questions/3845423/…中找到关于这个主题的一些信息。
- 下面的答案中没有一个能回答你的问题吗?
- 重要的是,在考虑忽略异常时阅读:为什么"except:pass"是一个糟糕的编程实践?因此,正如蒂姆在下面所提到的,我们应该做的肯定是except TypeError: 。
作为一般经验法则,如果您能帮助控制流,就不应该使用try: except:模式。在这个上下文中,引发一个不必要的异常涉及一些开销。希望这有帮助。
- 我不同意。if语句总是需要一些时间,而try/except块只会在触发异常时导致速度减慢。因此,如果None的情况只是偶尔发生,那么try/except将更快——尽管我们一定要做except TypeError:以避免掩盖可能发生的任何其他错误。
- @Timpietzcker也许是这样,但问题开始于"一个列表包含多个NoneType元素",这使我认为一个元素是NoneType并不例外,因此一个if是合适的。
正如评论中提到的那样,try方法不是一个好方法,因为您可能会跳过某个元素,因为在该块中会出现任何其他异常。
所以第一个选择是更好的。这里有一个备选方案,您可以确保所有元素都不是None,但它将消耗更多的内存:
1 2 3
| for item in (element for element in list if element is not None):
fp.write(item + '
') |
P.S.在您的情况下,不要使用内置名称作为变量名-list。
- 我有点不同意:for i in
: if : 通常比在for中使用列表理解更快。
- @Tobias_k Cool,更新
- 附录:只需记住,filter(None, ...)将过滤所有非真实值,也就是说,它还将跳过空列表或0。最后,(x for x in list if x is not None)可能更好,但使用()而不是[]使其成为发电机。
- @Funkysayu除了速度,它的内存效率很低,正如我提到的。但你经常提到的是什么时候?
- @tobias_k ()和[]的区别与range和xrange的区别一样?
- @N9code关于速度问题,我在工作台上有一些不同的结果,取决于使用的数据类型、映射、过滤…这真的取决于你在做什么,我不认为有一个通用的方法来解释为什么这是慢/快。我应该调查一下…
- @Funkysayu好吧,但就你的板凳而言,它通常比较慢?
- @N9代码I没有用生成器(()进行测试,但在列表([]中)中,它显然较慢:如果删除1000个元素列表中的3个元素,它根本就不值得。
- @N9code同样,考虑到生成器正在执行函数调用(list.__iter__),您正在执行2个__iter__调用(一个在生成器上,另一个在列表中),而不是一个,并且函数调用在python中有点慢
- 我真的认为简单的for e in list: if e is not None: 在很多情况下更快。
- @Funkysayu我同意,尽管速度很快,但在最坏的情况下,我也会消耗O(n),因此它只是更紧凑的代码和非速度内存关键环境的一个替代方案。同意吗?:)
- 是的,就是这样。但是,它只是删除了一行代码,以获得不太可读的内容。但这是全球性的想法。
第二个不会很好,因为每当遇到None类型的元素时,它都会抛出异常。异常将在Python中以自己的方式处理。
在你的情况下,你是给一个通行证,这样就可以做到。
最干净的方法是:
1
| clean = [x for x in lis if x != None] |
或者正如您也可以使用的注释中所指出的那样,即使它基本上编译为相同的字节码:
1
| clean = [x for x in lis if x is not None] |
希望这有帮助。当在罗马的时候,就像罗马人一样。)
- x != None和x is not None几乎是一样的,除了x is not None是官方的政治公众人物建议。
- 是的,这就是我提到的,两个都遵循相同的字节码@funkysayu
- 但是有一种语法被认为是对PEP8和一些基于PEP8的IDE的警告(比如pycharm)。不要用不等式检验来检验一个值是否为零。