【问题标题】:Best alternative to using if statement?使用 if 语句的最佳替代方法?
【发布时间】:2019-02-20 05:39:00
【问题描述】:

我正在努力改掉过于频繁地使用 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 语句之后加上 break,但它不起作用。

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

【问题讨论】:

  • if q0 == 'if': 有什么问题
  • @AkshayNevrekar 它可以工作,但似乎其他 if 语句冲突它说已接受,但在它说字符串索引超出范围之后。

标签: python python-3.x automata


【解决方案1】:

这是一个可扩展的单行代码:

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

变量acceptableset;一种数据结构,可以非常快速地检查其中是否有东西。您可以修改此集合(或将其作为参数传递给check!)以更改可接受单词的范围而不更改程序的控制流(就像您在原始的 if/else 实现中所做的那样,您正在尝试离开)。

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

【讨论】:

    【解决方案2】:

    首先,为什么要访问输入字符串的每个字符,然后再次将它们连接起来,然后与目标字符串(“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],但您要求您的程序访问它。因此索引超出范围错误。

    【讨论】:

    • 谢谢伙计。这很糟糕,因为我正在为其执行此操作的类不希望我使用任何类型的数组或字典。如果可能的话,我会像这样设置它。我最终创建了一个程序,它可以逐个字母地接受输入,它会说它是否正确。我想尝试创建一个包含整个单词的程序,但在这一点上,如果没有字典/数组,它看起来超出了我的能力范围。
    • 如果你真的不想使用列表(python 中没有数组),你可以保留你的程序,但将if 语句的每个条件更改为q0 == "if"q0 == "else"等等。另外,考虑使用if-elif-elif-else 序列而不是if-if-if-else
    【解决方案3】:

    你可以用一个 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)
    

    【讨论】:

      【解决方案4】:

      您可以使用 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
      

      【讨论】:

      • 请注意,PEP8 认为将 lambda 函数分配给标识符是有害的。
      • 谢谢,我知道不建议将 lambda 函数分配给标识符,但我只是举例说明可以这样做。
      猜你喜欢
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      相关资源
      最近更新 更多