代码之家  ›  专栏  ›  技术社区  ›  Bartholomas

Python语句中的布尔逻辑

  •  0
  • Bartholomas  · 技术社区  · 6 年前
    # Given three ints, a b c, print True if b is greater than a,  
    # and c is greater than b. However, with the exception that if 
    # "bOk" is True, b does not need to be greater than a. 
    
    a = int(input())
    b = int(input())
    c = int(input())
    bOk = bool(input())
    
    print(((bOk and c > b) or (b > a and c > b)))
    

    我的程序适用于除“3 2 4 False”之外的所有组合

    我不明白为什么这个组合打印的是真的。第一个闭合集应返回False,因为bOk=False,第二个闭合集也应返回False,因为b>a为假。

    如能解释,将不胜感激。

    3 回复  |  直到 6 年前
        1
  •  2
  •   user9238790 user9238790    6 年前

    布尔值是两个常量对象False和True。

    对于布尔字符串

       bool('')
    => False
    
       bool('false')
    => True
    

    bool检查列表是否有对象。如果为空,则返回False;如果不为空,则返回True。

    在您的例子中,bOk=bool(input())有一个值,因此 博克 返回True,无论它有什么对象。这样你就有了输出。

        2
  •  2
  •   ddnomad    6 年前

    评论和其他答案已经涵盖了OPs错误的解释。我宁愿展示在更受限的环境中(生产?)通常是如何完成事情的。

    代码没有经过充分测试,也不是最优雅的,尽管关键是:清理输入。总是并以完全不同的方式提示用户选择问题(是/否,对/错)。

    在下面的示例中,布尔提示被净化为“此值是唯一被视为True的值;所有其他值都为False”。

    #!/usr/bin/env python
    """Just an example."""
    
    
    def input_type(prompt, type_):
        """Prompt a user to input a certain type of data.
    
        For a sake of simplicity type_ is limited to int and str.
    
        :param prompt: prompt message to print
        :param type_:  type of a data required
    
        :type prompt:  str
        :type type_:   int or bool
    
        :return: data of a required type retrieved from STDIN
        :rtype:  type_
        """
        accepted_types = [int, str]
        if isinstance(prompt, str):
            if any(type_ == atype for atype in accepted_types):
                while True:
                    user_input = input(prompt)
                    try:
                        return type_(user_input)
                    except ValueError:
                        continue
            else:
                errmsg = 'Requested type is unsupported by this function: %s'
                errmsg = errmsg % type_.__name__
        else:
            errmsg = 'Prompt must be a string: got %s instead'
            errmsg = errmsg % type(prompt).__name__
    
        raise Exception(errmsg)
    
    
    def input_bool(prompt, as_true):
        """Prompt user to answer positively or negatively.
    
        :param prompt:  prompt message to print
        :param as_true: value to interpret as True
    
        :type prompt:  str
        :type as_true: str
    
        :return: user answer
        :rtype:  bool
        """
        if isinstance(as_true, str):
            return input_type(prompt, str) == as_true
        else:
            errmsg = "'as_true' argument must be a string: got %s instead"
            errmsg = errmsg % type(as_true).__name__
    
        raise Exception(errmsg)
    
    
    if __name__ == '__main__':
        a = input_type('Enter first integer: ', int)
        b = input_type('Enter second integer: ', int)
        c = input_type('Enter third integer: ', int)
        bOk = input_bool('Enter boolean value (True/False): ', 'true')
    
        # Result
        print(((bOk and c > b) or (b > a and c > b)))
    

    希望这对如此庞大的上市有所帮助,并表示歉意。处理用户输入总是一项棘手的任务。

        3
  •  1
  •   Rae Snow    6 年前

    您的代码在Python 2上工作。x、 因为在Python 2中。x、 input()等于eval(raw\u input(prompt))。

    >>> a=int(input())
    3
    >>> b=int(input())
    2
    >>> c=int(input())
    4
    >>> bOk=bool(input())
    False
    >>> print(bOk and c > b)
    False
    >>> bOk
    False
    >>> print(((bOk and c > b) or (b > a and c > b)))
    False
    

    但在Python 3中。x、 input()等于raw\u input(),所以bOk等于bool(“False”),等于True。

    >>> bOk=bool(input())
    False
    >>> print(bOk and c > b)
    True
    >>> bOk
    True
    

    您可以将input()更改为eval(input())。

    “Python 2到3转换工具将用eval(input())替换对input()的调用,用input()替换对raw\u input()的调用。”

    提到 https://www.python.org/dev/peps/pep-3111/