【问题标题】:Functions/Truth values功能/真值
【发布时间】:2019-10-22 09:11:56
【问题描述】:

我是函数的新手,对创建一个给定三个布尔值的特定函数感到困惑,如果至少两个为真,则返回真。如果我在运行程序后像这样在解释器中显式编写(我检查了所有六种组合),那么当我在解释器中调用函数时,我所拥有的函数可以工作:

>>> function(True,False,True)
True

但我在想我应该能够在输入这些变量的值后输入函数 (b1,b2,b3)。对于这些变量的任何输入,函数 (b1,b2,b3) 返回 False。

b1 = input("enter True or False: ")
b2 = input("enter True or False: ")
b3 = input("enter True or False: ")
def function(b1,b2,b3):
    if b1 is True and b2 is True:
        return True
    if b2 is True and b3 is True:
        return True
    if b1 is True and b3 is True:
        return True
    return False

【问题讨论】:

  • 您可能正在接受字符串,而不是布尔值。我不是蟒蛇人,所以不能 100% 确定。查看input() 的文档以查看它返回的内容
  • 如果你得到三个 True 会发生什么?
  • 三个 True 至少有两个 True 所以我们需要返回 True。
  • 如果你使用 python3 input 将永远不会返回布尔值。

标签: python boolean


【解决方案1】:

除非您使用的是 Python 2(我对此表示怀疑),否则 input 返回一个字符串。因此,您将始终收到False

您必须将输入转换为boolean。然而,这并不像看起来那么简单。

bool('False') 是布尔值True,因为所有非空字符串都被视为True

一种解决方法是显式检查输入:

def get_bool_from_stdin():
    inp = input()
    if inp == 'True':
        return True
    if inp == 'False':
        return False
    raise TypeError('input True or False')

那么你的函数将按预期工作:

def get_bool_from_stdin():
    inp = input()
    if inp == 'True':
        return True
    if inp == 'False':
        return False
    raise TypeError('input True or False')

b1 = get_bool_from_stdin()
b2 = get_bool_from_stdin()
b3 = get_bool_from_stdin()


def function(b1,b2,b3):
    if b1 == True and b2 == True:
        return True
    if b2 == True and b3 == True:
        return True
    if b1 == True and b3 == True:
        return True
    return False


print(function(b1, b2, b3))

执行:

>> True
>> False
>> True
True

如果您真正想要的是验证function 是否收到至少2 个True 值,您可以使用sum(并使用*args,这样它就可以处理任意数量的参数),因为Python 的布尔值是一个子类int:

def function(*args):
    return sum(args) >= 2

【讨论】:

  • OP,如果您不想要这样的显式解决方案,也可以考虑使用ast.literal_eval() 来获取输入的文字值。
【解决方案2】:

这是定义此类函数的一种方法。因为如果任意两个是True,你想返回True,这相当于检查布尔和是否大于1。

P.S:至于输入问题,键盘输入是字符串类型,所以在你的情况下,这意味着检查 if 语句是否为“True”或“true”。

b1 = True
b2 = True
b3 = False

def function(b1,b2,b3):
    return (sum([b1, b2, b3])>1)
    # return (sum(1 for b in [b1, b2, b3] if b)>1)  # Alternative

function(b1, b2, b3)
# True

【讨论】:

  • 我没有投反对票,但这并不能解决 OPs 帖子的问题。不是他们的功能定义,而是他们的输入导致他们的功能出现问题
  • @MatthewBarlowe:感谢您的评论。我已经相应地更新了我的答案。
【解决方案3】:

函数input 总是返回输入内容的字符串。如果你输入True,你实际上得到的是字符串'True',而不是布尔值。

您可以检查用户输入并转换值:

b1 = input('Enter True or False: ')
if b1.lower() == 'true':
    b1 = True
else:
    b1 = False
# ...repeat for each input ...

在单行中,您可以缩短它:

b1 = (True if input('Enter True or False: ').lower() == 'true'
      else False)

最好使用b1 is True 而不是b1 == True

【讨论】:

  • 好吧,我改成 == 因为我不确定这是否是导致问题的原因。为什么这样更好?
  • == 导致被比较对象的底层__eq__ 方法被调用。即使比较对象不是单例True,此方法仍然可以返回 True。另一方面,is 将对象的身份True 进行比较,如果对象相同,则 返回 True。在大多数情况下,这没有任何区别,但是当自定义类覆盖 __eq__ 方法时,包含类的程序可能会导致问题。
【解决方案4】:

您实际上可以在 Python 中对布尔值求和,因此您可以检查至少 n 个输入是否为真。这允许可变数量的输入,但第一个输入的数量必须是True

def check_n_true(n, *args):
    return sum(args) >= n

check_n_true(2, True, True, False) # True
check_n_true(3, True, True, False) # False
check_n_true(1, True, True, False) # True

【讨论】:

  • OP遇到的问题是因为他们使用input不正确,而不是因为function的实现
【解决方案5】:

下面的呢?

from itertools import combinations
from typing import List

def twotrues(values: List) -> bool:
    return any({all(c) for c in combinations(values, 2)})

它的作用是对值列表中的两个元素进行所有可能的组合,检查是否存在两者都为 True 的任何组合,然后返回该结果。

希望这会有所帮助!

【讨论】:

  • OP遇到的问题是因为他们错误地使用了input,而不是因为function的实现
  • 这是真的,我同意
【解决方案6】:

问题是input 函数返回一个字符串。您必须将其转换为布尔值,例如:

def get_boolean():
    return bool(input("enter True or False: "))

b1 = get_boolean()
b2 = get_boolean()
b3 = get_boolean()

编辑、更正:

def get_boolean():
    try:
        return {'True': True, 'False': False}[input()]
    except KeyError:
        raise RuntimeError("Not a boolean value")

【讨论】:

  • bool('False') 的输出是什么?
  • 啊,对。我太仓促了。不过,问题在于输入的解析。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
相关资源
最近更新 更多