Python中的"类型比较"

Thi*_*nId 1 python algorithm comparison types

我正在编写一个程序,我必须测试列表中的元素是否属于某种类型.列表(z,见下文)可以变大,我可以测试标准方式:

for l in z:
  typeL = type(l)
  if typeL == complex or typeL == float:
    #evaluate suite
  elif typeL == list:
    #evaluate different suite
Run Code Online (Sandbox Code Playgroud)

或者,我可以执行以下操作:

for l in z:
  lTemp = l*0
  if lTemp == 0:
    #evaluate suite
  elif lTemp == []:
    #evaluate different suite
Run Code Online (Sandbox Code Playgroud)

我的问题是,哪种方法更快,更有效或更受欢迎?感谢所有提前.

Odo*_*ois 12

根据Python的Zen

  • 显式优于隐式.
  • 简单比复杂更好

因此,如果您想比较类型,您应该获取类型并进行比较.更清晰的方法是使用isinstance method接受类型元组参数的方法.所以你的代码可能如下所示:

for l in z:
  if isinstance(l,(complex,float)):
    #evaluate suite
  elif isinstance(l,list):
    #evaluate different suite
Run Code Online (Sandbox Code Playgroud)

同样isinstance与ABC元类兼容,因此您可以在选择中更直接和清晰:

from numbers import Number
from collections import Iterable

for l in z:
  if isinstance(l,Number):
    #evaluate suite
  elif isinstance(l,Iterable):
    #evaluate different suite
Run Code Online (Sandbox Code Playgroud)

UPD:回答关于性能的评论中的一个问题,你应该记住,过早的优化是所有邪恶的根源.当你的程序工作时,你可以分析它并找到性能实际下降的位置.接下来你可以在python中优化它,在cython或C中重写,可以使用另一个实现,等等.但是当你在python中编码时,你必须尊重python代码更好的东西.

  • 使用`isinstance()`的额外功能:适用于子类. (2认同)
  • 虽然实际上,我认为"明确比隐含更好"是一个更合适的规则:) (2认同)