使用用户输入字符串中的不等式

时间:2018-11-15 20:07:41

标签: python python-3.x

让我们说我正在编写一个程序,以检查输入[一个数字和相等性语句]与一个随机生成的数字进行比较是否为真,这是我的代码供参考:

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 }

我敢肯定,类似于上面的代码,必须有一种更快的方法来做到这一点。我只是不确定该怎么做。

非常感谢您的帮助! :)

2 个答案:

答案 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命令。在您看来,这似乎不成问题,但如果不添加附录,我会感到不满意