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

时间:2018-06-27 04:13:59

标签: python arguments isinstance

我似乎无法将这个函数的输出包裹住:

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

print(is_integer(1.4, 2))

这将输出“是”,但不应输出1.4和2都不都是整数。 有帮助吗?

2 个答案:

答案 0 :(得分:2)

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

  

表达式x and y首先计算x;如果x为假,则返回其值;否则,将评估y并返回结果值。

在Python中,NoneFalse,数字零和空集合为false; 1

因此,1.4 and 2的意思是2,因为1.4不为零。

因此,isinstance(1.4 and 2, int)的意思是isinstance(2, int)

2int


您可能想要的是:

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称为“假”而不是“假”,其他所有内容都是“真实”而不是“真”。但是文档避免了这种可爱,我在这里引用文档。

答案 1 :(得分:0)

isinstance(num1 and num2, int)

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

两个数字之间and的结果将返回第一个Falsey值(如果存在),否则返回表达式中的最后一个值。

一些例子:

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

有关更多信息,请参见Strange use of python's and / or operator


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

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函数,该函数可泛化为两个以上的参数。

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

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

更好的是,返回布尔结果:

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