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

Python 使用if语句的最佳替代方案?,python,python-3.x,automata,Python,Python 3.x,Automata,我正在努力改掉经常使用if/else的坏习惯。我不知道函数是如何工作的,也不知道调用函数的正确方法,但我一直在研究用代码实现函数的正确方法。我正在编写的代码假设检查3个不同的单词,如果该单词不在输入中,则用户将收到一条语句,该语句将显示“拒绝”,如果该单词正确,则将显示“接受”。我面临的问题是让我的程序正常工作。到目前为止,我已经设置了我的程序来检查单词的每个索引,如果它与完整单词匹配,它将被标记为已接受。我试图找出添加拒绝标志的正确方法,并避免在运行此程序后收到的错误 def checker(

我正在努力改掉经常使用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()
对于这个程序,我不会使用字典,这样我就可以正确地挑战自己,并以自动机的方式实现它。如何实现这段代码而不使字符串索引超出范围错误。我试着在打印报表后加上break,但没用


先谢谢大家。这是我的第一篇帖子,如果我在帖子中有任何错误,请告诉我

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

第二,如果匹配其中任何一条语句都会导致相同的结果(
print(“accepted”)
),为什么要重复使用
if
语句

试试这个:

def checker():
q0=输入(“输入单词:”)
如果q0出现在[“如果”、“其他”、“执行”]:
打印(“已接受”)
其他:
打印(“拒绝”)
检查器()
现在,您只需将一个字符串
q0
与另一个字符串(列表中的每个元素[“if”、“else”、“do”])进行比较。此外,列表中的第一次点击将停止比较,并继续打印“accepted”


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

这里有一个可扩展的一行程序供您使用:

def check():
    q = input().strip()
    acceptable = {'if', 'else', 'do'}
    print('accepted' if q in acceptable else 'rejected')
变量
acceptable
是一种数据结构,可以快速检查其中是否有内容。您可以修改此集合(或将其作为参数传递给
check
),以更改可接受字的范围,而无需更改程序的控制流(正如您在最初的if/else实现中所做的那样,您值得称赞地试图摆脱它)


编辑:我想这不是严格意义上的“一行程序”…

如果对您更合适的话,您可以使用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)

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

如果q0=='if':
@AkshayNevrekar有什么问题吗?它可以工作,但似乎其他if语句冲突,它表示已接受,但就在它表示字符串索引超出范围之后。谢谢,伙计。这很糟糕,因为我为其工作的类不希望我使用任何类型的数组或字典。如果是,我会像这样设置它sible。我最终创建了一个接受逐字输入的程序,它会说它是否正确。我想尝试创建一个包含整个单词的程序,但在这一点上,如果没有字典/数组,它看起来就够不着了。如果你真的不想使用列表(python中没有数组),您可以保留您的程序,但更改
if
语句的每个条件,例如
q0==“if”
q0==“else”也可以考虑使用<代码>如果ELIF ELIF E/ICODE >序列而不是<代码>如果如果另外的< /COD>注意将lambda函数分配给一个标识符被认为是有害的。谢谢,我知道lambda函数分配给一个标识符是不推荐的,但我只是举一个例子,它可以这样做。