在 Python 中的函数参数 (isinstance) 中使用运算符时出错

Error in using operators in function arguments (isinstance) in Python

我似乎无法理解这个函数的输出:

def is_integer(num1, num2):
        if isinstance(num1 and num2, int):
            return 'Yes'
        else:
            return 'No'

print(is_integer(1.4, 2))

这将输出 'Yes',但它不应该是因为 1.4 和 2 不是整数。 有帮助吗?

isinstance(num1 and num2, int)

相同
t1 = num1 and num2
if isinstance(t1, int)

and 在两个数字之间的结果 return 是第一个 Falsy 值(如果有的话),否则 return 是表达式中的最后一个值。

一些示例:

In [24]: 1.4 and 2
Out[24]: 2

In [25]: 1.4 and 2 and 3
Out[25]: 3

In [26]: 1.4 and 0 and 2
Out[26]: 0

有关详细信息,请参阅


如果您想同时测试两者,则必须分别进行:

def is_integer(num1, num2):
    if isinstance(num1, int) and isinstance(num2, int):
        return 'Yes'        
    return 'No'

哪种写法更实用

def is_integer(num1, num2):
    if all(isinstance(n, int) for n in (num1, num2)):
        return 'Yes'        
    return 'No'

...使用 all 函数概括为超过 2 个参数。

更好的是,让您的函数接受可变数量的参数:

def is_integer(*args):
    if all(isinstance(n, int) for n in args):
        return 'Yes'
    return 'No'

更好的是,return 布尔结果:

def is_integer(*args):
    return all(isinstance(n, int) for n in args)

and 运算符在 Python 中的工作方式是:

The expression x and y first evaluates x; if x is false, its value is returned; otherwise, y is evaluated and the resulting value is returned.

在Python、NoneFalse中,数字零、空集合为false;几乎所有其他内容都是正确的。1

因此,1.4 and 2 表示 2,因为 1.4 不为零。

因此,isinstance(1.4 and 2, int) 表示 isinstance(2, int)

2 是一个 int


你可能想要的是:

if isinstance(num1, int) and isinstance(num2, int):

… 或:

if all(isinstance(num, int) for num in (num1, num2)):

1.为了避免混淆具体的 TrueFalse 值以及更抽象的 true 和 false 值概念,大多数 Python 开发人员参考 None/False/zero/empty 为 "falsey" 而不是 "false",其他所有内容为 "truthy" 而不是 "true"。但是文档避免了这种可爱之处,我在这里引用文档。