我试图摆脱过于频繁地使用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语句之后放弃但是它不起作用。
在此先感谢大家。这是我的第一篇文章,所以如果我在帖子中犯了任何错误,请告诉我!
这是一个可扩展的单行为您:
def check():
q = input().strip()
acceptable = {'if', 'else', 'do'}
print('accepted' if q in acceptable else 'rejected')
变量acceptable
是set
;一种数据结构,可以非常快速地检查其中是否存在某些内容。您可以修改此集合(或将其作为参数传递给check
!)以更改可接受单词的范围,而无需更改程序的控制流程(就像您在原始的if / else实现中那样,您可能会特别想要移动远离)。
编辑:我想这不是严格意义上的'单线'......
首先,为什么要访问输入字符串的每个字符,然后再次连接它们,然后比较目标字符串(“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]
,但是你要求你的程序访问它。因此索引超出范围错误。
您可以使用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