让我们说我正在编写一个程序,以检查输入[一个数字和相等性语句]与一个随机生成的数字进行比较是否为真,这是我的代码供参考:
import random
class Checker():
def __init__(self):
self.user_num=[]
self.comp_roll()
self.input_drive()
def comp_roll(self):
self.roll=random.randint(1,6)+random.randint(1,6) #roll 2 d6
def input_drive(self):
self.user_input=input("Input a number and [in]equality to compare against 2 random d6")
user_input=self.user_input
for i in range(len(user_input)):
if user_input[i].isdigit() == True: #if user_input[i] is a num
self.user_num.append(user_input[i]) #Keep track of just number from input in list
else: #if user_input[i] is not a num
if user_input[i] == ">":
self.track_op=">"
elif user_input[i] == "<":
self.track_op="<"
elif user_input[i] == "=":
self.track_op="="
self.user_num=int("".join(self.user_num)) #turn number list into one int
self.logic()
def logic(self):
dif=self.roll-self.user_num
abs_dif=abs(dif)
if self.track_op == ">":
if dif > 0:
win=True
else:
win=False
elif self.track_op == "<":
if dif < 0:
win=True
else:
win=False
elif self.track_op == "=":
if dif == 0:
win=True
else:
win=False
print("{result}\nComputer Guessed %d\nYou Guessed %d\nDifference %d".format(result="Win! :)" if win==True else "Lose :(") % (self.roll,self.user_num,abs_dif))
test=Checker()
因此您应该可以看到,我被迫使用switch语句来单独检查代码以查看是否存在>, <, =
中的任何一个。
然后,我必须将其另存为带有等号的值的字符串。
for i in range(len(user_input)):
if user_input[i].isdigit() == True: #if user_input[i] is a num
self.user_num.append(user_input[i]) #Keep track of just number from input in list
else: #if user_input[i] is not a num
if user_input[i] == ">":
self.track_op=">"
elif user_input[i] == "<":
self.track_op="<"
elif user_input[i] == "=":
self.track_op="="
然后在另一个switch语句中使用它来手动检查差异。
dif=self.roll-self.user_num
abs_dif=abs(dif)
if self.track_op == ">":
if dif > 0:
win=True
else:
win=False
elif self.track_op == "<":
if dif < 0:
win=True
else:
win=False
elif self.track_op == "=":
if dif == 0:
win=True
else:
win=False
我宁愿将[in]等号保存为字典,该字典使用与此类似的概念:
import operator
ops = { "+": operator.add, "-": operator.sub }
我敢肯定,类似于上面的代码,必须有一种更快的方法来做到这一点。我只是不确定该怎么做。
非常感谢您的帮助! :)
答案 0 :(得分:3)
您很少需要使用布尔文字。您的开关首先降为
if self.track_op == ">":
win = dif > 0
elif self.track_op == "<":
win = dif < 0
elif self.track_op == "=":
win = dif == 0
应该很明显,您可以抽象出比较运算符。
comp_ops = {">": operator.gt, "<": operator.lt, "=": operator.eq}
if self.track_op in comp_ops:
win = comp_ops[self.trac_op](dif, 0)
答案 1 :(得分:2)
是否有避免使用内置eval()
函数的原因?如果不是这样,您可以在检查器类中做类似的事情
import random
roll=random.randint(1,6)+random.randint(1,6)
print(roll)
test_in = input("please enter your statement")
try:
test_out = eval(f"{test_in}roll")
print(test_out)
except:
print('Invalid Entry')
结果
10
please enter your statement>? 4>
False
为了真实的陈述
3
please enter your statement4>
True
编辑:我应该补充一点,eval()
可能会很危险,因为它可以执行任意python命令。在您看来,这似乎不成问题,但如果不添加附录,我会感到不满意