【问题标题】:Error in using operators in function arguments (isinstance) in Python在 Python 中在函数参数(isinstance)中使用运算符时出错
【发布时间】:2018-06-27 04:13:59
【问题描述】:

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

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 不是两个整数。 有什么帮助吗?

【问题讨论】:

  • num1 and num2 表示 num1 如果它是假的(FalseNone、零或空),否则是 num2。这可能不是您想要检查的内容。

标签: python arguments isinstance


【解决方案1】:

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 称为“falsey”而不是“false” ,以及其他一切都是“真实的”而不是“真实的”。但是文档避免了这种可爱,我在这里引用文档。

【讨论】:

    【解决方案2】:
    isinstance(num1 and num2, int)
    

    一样
    t1 = num1 and num2
    if isinstance(t1, int)
    

    两个数字之间的和的结果如果有则返回第一个 Falsy 值,否则返回表达式中的最后一个值。

    一些例子:

    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 "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 函数,该函数泛化到超过 2 个参数。

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

    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)
    

    【讨论】:

    • “只要两个数字 != 0, t1 == True” - 不,Python 中的 and 返回其参数之一。如果它的两个参数都不是布尔值,则结果将不是布尔值。
    • @user2357112 啊,对不起。固定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多