Python isinstance检查是否有任何变量具有特定类
如果任何参数是Python isinstance检查是否有任何变量具有特定类,python,python-3.5,Python,Python 3.5,如果任何参数是np.ndarray,我有一个函数需要采用不同的路径。我正在和你核对。但我想知道是否有比将列表理解与any结合使用更直观(更快)的方法: def func(a, b): if any([isinstance(i, np.ndarray) for i in [a, b]]): ... else: ... 我已经试过了: if isinstance([a, b], np.ndarray): 但这不起作用,因为[a,b]是一个列表。实际
np.ndarray
,我有一个函数需要采用不同的路径。我正在和你核对。但我想知道是否有比将列表理解与any
结合使用更直观(更快)的方法:
def func(a, b):
if any([isinstance(i, np.ndarray) for i in [a, b]]):
...
else:
...
我已经试过了:
if isinstance([a, b], np.ndarray):
但这不起作用,因为
[a,b]
是一个列表
。实际上使用any
是最具python风格的方式,因为它已在python中实现,如下所示:
def any(iterable):
for element in iterable:
if element:
return True
return False
并且在遇到iterable中的一个True项后立即返回True
,因此在最佳情况下它的顺序为O(1),在最坏情况下为O(n)。关于isinstance()
它是一个内置函数,是检查对象类型的python方法
另外,作为一种更具python风格的方法,您最好将生成器表达式传递给any
,并让生成器函数根据需要生成项,而不是列表理解并一次创建所有布尔值:
any(isinstance(i, np.ndarray) for i in [a, b])
正如@Padraic所说,如果您只处理两个项目,最好的方法是使用或运算符:
if isinstance(a, np.ndarray) or isinstance(b, np.ndarray):
# do stuff
这不是蟒蛇式的。不要检查类型,假设它是,如果发生错误,则捕获错误。或者使用np.array(a,copy=False,ndmin=1)
将进入数组的所有内容强制转换为数组,这不是列表理解;这是一个生成器表达式。如果您将括号放在括号内,那么您将传递一个通过列表理解创建的列表,但实际上,您传递的是一个生成器。@MaxNoe所说的是Python中的一种典型编码模式:检查类型没有错,它就像有多个try/except块一样,我认为真正的问题是如何设计应用程序逻辑。通常我会同意,但这是一个辅助函数,应该通过应用数学
(或自定义)来优化速度当没有变量是ndarray
和np.ufunc
时(如果其中一个变量是一个),函数将执行此操作。将所有内容转换为np.ndarray
会严重降低此处的速度。感谢生成器提示,我已经忘记了括号(无意中将其用作生成器表达式),仅在@zondo指出问题后才包含括号。:-)如果您只有两个参数,我认为或
将是最具python风格和最快的方法,任何
都应该在您编写多个or时使用。刚刚补充了你的建议。