使用if语句的最佳替代方案?

问题描述 投票:-2回答:4

我试图摆脱过于频繁地使用if / else的坏习惯。我不熟悉函数的工作方式和调用它们的正确方法,但我一直在研究用我的代码实现它们的正确方法。我正在制作的代码是为了检查3个不同的单词,如果单词不在输入中,那么用户将收到一条说“被拒绝”的陈述,如果单词是正确的,它将说“已接受”。我面临的问题是让我的程序正常工作。到目前为止,我已经设置了我的程序来检查单词的每个索引,如果它与完整单词匹配,它将被标记为已接受。我试图找出添加被拒绝标志的正确方法,并避免在运行此程序后收到的错误。

def checker():
  q0 = input("enter word:")
  if (q0[0]) +(q0[1]) == "if":
    print ("accepted")
  if (q0[0]) + (q0[1]) + (q0[2]) + q0[3] == "else": 
    print("accepted")
  if(q0[0]) + (q0[1]) == "do":
    print("accepted")
  else:
    print("rejected")
checker()

对于这个程序,我不会使用字典,所以我可以正确地挑战自己并以自动机方式实现它。如何在不使字符串索引超出范围错误的情况下实现此代码。我试图在我的print语句之后放弃但是它不起作用。

在此先感谢大家。这是我的第一篇文章,所以如果我在帖子中犯了任何错误,请告诉我!

python python-3.x automata
4个回答
1
投票

这是一个可扩展的单行为您:

def check():
    q = input().strip()
    acceptable = {'if', 'else', 'do'}
    print('accepted' if q in acceptable else 'rejected')

变量acceptableset;一种数据结构,可以非常快速地检查其中是否存在某些内容。您可以修改此集合(或将其作为参数传递给check!)以更改可接受单词的范围,而无需更改程序的控制流程(就像您在原始的if / else实现中那样,您可能会特别想要移动远离)。

编辑:我想这不是严格意义上的'单线'......


0
投票

首先,为什么要访问输入字符串的每个字符,然后再次连接它们,然后比较目标字符串(“if”,“else”,“do”)?

其次,如果匹配其中任何一个将导致相同的结果,为什么你反复使用if语句(print("accepted")

试试这个:

def checker():
  q0 = input("enter word:")
  if q0 in ["if", "else", "do"]:
    print("accepted")
  else:
    print("rejected")
checker()

现在,您只需将字符串q0与另一个字符串进行比较(列表中的每个元素[“if”,“else”,“do”])。此外,列表中的第一个匹配将停止比较,并将继续打印“已接受”。

++只是为了让你知道为什么你看到“索引超出范围错误”,你正在访问q0的每个字符,而不知道有多少。因此,如果用户输入像a这样的字符串,那么就没有q0[1]q0[2],但是你要求你的程序访问它。因此索引超出范围错误。


0
投票

您可以使用for循环和一个if语句执行此操作,如果这对您更好。只需将所有接受的值放入列表中,并检查每个单词是否在q0中。

def checker():
    q0 = input('enter word:')
    for i in ['if', 'else', 'do']:
        result = ('accepted' if i in q0 else 'rejected')
        if result == 'accepted':
            break
    print(result)

0
投票

你可以做一个带lambda功能的衬垫。

checker = lambda q: print("accepted" if q in ["elif", "if", "else"] else "rejected")
checker()

这是一个样本

>>> checker = lambda q: print("accepted" if q in ["elif", "if", "else"] else 
"rejected")
>>> checker("if")
accepted
>>> checker("fool")
rejected
© www.soinside.com 2019 - 2024. All rights reserved.