替代if语句的最佳选择?

时间:2019-02-20 05:39:00

标签: python python-3.x automata

我试图摆脱使用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()

对于这个程序,我不会使用字典,因此我可以正确地挑战自己,并以自动方式实现它。如何在不使字符串索引超出范围错误的情况下实现此代码。我试图在我的打印声明后加上中断,但它不起作用。

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

4 个答案:

答案 0 :(得分:1)

这是为您提供可扩展的一线服务:

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

变量acceptableset;一个数据结构,可以非常快速地检查其中是否包含某些内容。您可以修改此集合(或将其作为参数传递给check!)来更改可接受字的范围,而无需更改程序的控制流(就像您在原始if / else实现中所做的那样)值得称赞的是要远离。)

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

答案 1 :(得分: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],但是您是在要求程序访问它。因此索引超出范围错误。

答案 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)

答案 3 :(得分: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