如何使if语句接受三个参数中的任何一个,而不是在Python中都是真的

How to have if statement accept any one of three arguments without all being true in Python

所以,我正在做一个小项目。我正在制作一个基于文本的温度计算器,但是我在程序中遇到了一个关于if语句的问题,正如这个问题的标题所暗示的那样。

这是我遇到问题的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
running = True
fahr ="fahrenheit"
cel ="celsius"
kel ="kelvin"
temperatures = [fahr, cel, kel]

while running == True:
    try:
        temperature_type = str.lower(input("What is the current temperature unit you are using?
Fahrenheit, Celsius, or Kelvin?
"
))
    except ValueError:
        print("I do not understand. Please try again.")
        continue
    if temperature_type == any(temperatures) and not all(temperatures):
        break
    else:
        print("Please enter a valid input.")
        continue

似乎我看不到的逻辑有问题,我尝试了多种组合,即使是从这篇文章中建议的组合,它们中没有一个像我希望的那样工作。我想让它工作的方式是让可变温度_型只等于一个温度,比如华氏度,然后问另一个问题(这里没有显示)。如果变温型不等于这三种类型中的任何一种,那么我想循环重复。我面临的问题是,无论我输入什么,它总是要求温度。如果有人有答案,我会很高兴知道我做错了什么,我也会喜欢对逻辑的解释,因为我对这种逻辑还不是最好的。再次感谢您的回答和/或指导!


anyall返回TrueFalse,不是可以与str进行有意义比较的对象。所有非空的str都是"真实的",所以你要检查if temperature_type == True and not True,这当然不会通过。

你想要的逻辑可能是:

1
if temperature_type in temperatures:

在您的设计中,不可能有人输入多种温度类型,因此您不需要任何等效的all测试,您只想知道输入的字符串是否与三个已知字符串之一匹配。


这里有一个简单的检查版本,它简单地检查输入字符串是否是有效温度之一。它使用in运算符检查提供的字符串是否在temperatures中。

1
2
3
4
5
6
7
8
9
10
11
12
13
running = True
fahr ="fahrenheit"
cel ="celsius"
kel ="kelvin"
temperatures = [fahr, cel, kel]

while running:
    temperature_type = str.lower(input("What is the current temperature unit you are using?
Fahrenheit, Celsius, or Kelvin?
"
))
    if temperature_type in temperatures:
        break
    print("Please enter a valid input.")


也许可以扩展到包含所有比例,并使其更容易成为用户界面。

1
2
3
4
scales = ['F', 'R', 'C', 'K']

while True:
    if input("What temperature scale are you using [F, C, K, R]?")[0].upper() in scales: break

〔0〕


或:

1
2
3
4
5
6
while 1:
    if input("What is the current temperature unit you are using?
Fahrenheit, Celsius, or Kelvin?
"
).lower() in temperatures:
        break
    print("Please enter a valid input.")

说明:

allany返回TrueFalse,因此使用in将不起作用。

我移除了running,因为只使用1

您也可以执行True,请参见:

1
2
>>> 1==True
True