更好的编写长的“if”语句的方法?

5

你好,这可能是一个非常基础的问题,但因为我刚接触编程和Python,而且我真的想学习,所以我问一下。

我正在制作一个程序,从用户那里获取“玩牌”花色的输入。该程序只接受正确的花色。

例如;

方块、红桃、梅花、黑桃

如果用户输入其他内容,例如“三角形”,程序将返回“错误输入”。

这是我目前的成果:

if suit == "Diamonds":
    return "Accepted"
if suit == "Hearts":
    return "Accepted"
if suit == "Clubs":
    return "Accepted"
if suit == "Spades":
    return "Accepted"
else:
    return "Wrong input"

我的问题是,是否有更好的方法来编写这个程序,而不是为每个花色都创建一个繁琐的新“if”语句。

5
顺便提一下,你应该在这里使用elif(直到你换用其中一个答案为止)。if会更不高效,并且如果您有条件不像这些那样明显互斥的情况,也会导致微妙的错误。 - Silas Ray
4个回答

8

您可以使用 in 来检查 suit 是否在接受的花色列表、元组或集合中:

if suit in {"Diamonds", "Hearts", "Clubs", "Spades"}:
    return "Accepted"
else:
    return "Wrong input"

您还可以使用元组(使用(...)),列表([...])或frozenset而不是集合({...})。

7
if suit in ("Diamonds","Hearts","Clubs","Spades"):
    return "Accepted"
else:
    return "Wrong input"

使用in来检查成员资格,如果元组中没有suit,则会执行您的else子句。

成员运算符

您还可以使用not in来反转逻辑:

if suit not in ("Diamonds","Hearts","Clubs","Spades"):
    return "Wrong input"
else:
    return "Accepted"

如果您想要进行值的检查:
if suit  in ("Diamonds","Hearts","Clubs","Spades") and value in ("Ace","king","Queen"....):
    return "Accepted"
else:
    return "Wrong input"

使用一个集合set{"Diamonds","Hearts","Clubs","Spades"}是一种更有效的检查成员资格的方法。


如果有两个if语句,一个用于卡牌的花色,另一个用于卡牌的点数……那么“else”语句会干扰另一个“if”语句吗? - Andre
@Ali,您想要知道具体的套装是什么吗? - Padraic Cunningham
用户输入卡牌和花色的值... 因此,如果是方块38... 那么它也应该返回错误。 - Andre
@Ali,你可以使用“and”来检查两个条件。 - Padraic Cunningham
学到了新东西..而且有一种更整洁、更清晰的方法来做这件事!非常感谢您抽出时间帮助我 :) - Andre

2
您可以使用in运算符:
accepted = ['Diamonds', 'Hearts', 'Clubs', 'Spades']
if suit in accepted:
  return "accepted"
else:
  return "wrong input"

2

我不确定这是否符合你的需求,但有时使用字典的替代方法可能有助于处理长序列的 if ... elif

states = {"Diamonds": "accepted",
          "Hearts":   "accepted",
          "Clubs":    "accepted",
          "Spades":   "accepted"}
return states.get(suit,"wrong input")

嗯,非常有趣……这实际上可以以某种方式融入我的程序中。 - Andre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接