Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python isinstance检查是否有任何变量具有特定类_Python_Python 3.5 - Fatal编程技术网

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时使用。刚刚补充了你的建议。