无效输入后的重新提示

-1 投票
2 回答
3064 浏览
提问于 2025-04-16 21:17

在我尝试让输入通过有效性检查时,一切都没问题。如果输入无效,就会再次询问用户输入。我希望你能给我一些建议,提前谢谢你! :)

a=0
def reinp(a,b):
    while True:
        if a in [1,2,3,4,5,6]: #checking for valid input
            return int(a)
            break
        a=input(b)
    else:
        return print("error")

我试过了,但也不行。

def reinp(a,b):
    for c in [1,2,3,4,5,6]:
        if int(c)==int(a):
            return int(a)
            break
        else:
            a=input(b)

a=reinp(a,'测试: ')

这个代码是第一个出现问题的地方。

def reinp2(a,b): #trying to check if it's a number and can be turned to float if not ask again
    while check(a):
        a=input(b)
    return float(a)
def check(a):
    try:
        float(a)
        return False
    except ValueError:
        return True

现在的问题是,检查之后,程序一直卡在某个循环里出不来。我尝试用 while True:if...break 替换成 while correct: if... correct=False,但也不行。即使条件满足,它还是一直在问我输入...

在Python 3.2中没有raw_input,所以我也不能用这个。reinp2() 是可以用的,如果找到了解决 reinp() 的方法,同样的方法也可以用在 reinp2() 上。a和b只是变量,ans[n]=reinp2(ans[n],"输入 n: ")reinp() 一样,只是处理另一种类型的变量(可以是浮点数的)。

现在的代码没有语法错误。

附言:我在用Python 3.2。

2 个回答

1

附言:这个程序已经完全好了,我只是想让所有帮助过我的人知道,它现在运行得非常顺利,没有任何问题。我甚至还进行了自定义,让它可以接收初始数据 :) 如果有人需要一个排列求解器,你们知道在哪里可以找到它 :)

如果有人想要这个脚本:

from math import *
ans=['n','k','choice',0,0,0,0,0]
n,k=0,1
a=['''1 For Permutations P (from n) = n
2 For Variations V (k emelments from n-th class) = n!/(n-k)!
3 For Combinations C (k emelments from n-th class) = n!/(k!(n-k)!) = ( n )
4 Use last answer.                                                                  ( k )
5 Second Memory
6 Clear memory

Your choice is : ''',
'''+ to add
- to substract
* to multiply
/ to divide
You will undertake?: ''',
"The answer is: "]
def perm():
    global ans
    ans[n]=reinp2(ans[n],"Input n: ")
    if ans[5]==0:
        ans[3]=factorial(ans[n])
        ans[6]=ans[3]
        return print(a[2], ans[6])
    else:
        ans[4]=factorial(ans[n])
        ans[6]=ops(ans[3],ans[4],ans[5])
        return print(a[2], ans[6])
    ans[n]=''
    ans[k]=''
def var():
    global ans
    ans[n]=reinp2(ans[n],"Input n: ")
    ans[k]=reinp2(ans[k],"Input k: ")
    if ans[5]==0:
        ans[3]=factorial(ans[n])/(factorial(ans[n]-ans[k]))
        ans[6]=ans[3]
        return print(a[2], ans[6])
    else:
        ans[4]=factorial(ans[n])/(factorial(ans[n]-ans[k]))
        ans[6]=ops(ans[3],ans[4],ans[5])
        return print(a[2], ans[6])
    ans[n]=''
    ans[k]=''
def comb():
    global ans
    ans[n]=reinp2(ans[n],"Input n: ")
    ans[k]=reinp2(ans[k],"Input k: ")
    if ans[5]==0:
        ans[3]=factorial(ans[n])/((factorial(ans[n]-ans[k]))*(factorial(ans[k])))
        ans[6]=ans[3]
        return print(a[2], ans[6])
    else:
        ans[4]=factorial(ans[n])/((factorial(ans[n]-ans[k]))*(factorial(ans[k])))
        ans[6]=ops(ans[3],ans[4],ans[5])
        return print(a[2], ans[6])
    ans[n]=''
    ans[k]=''
def ent():
    global ans,a
    ans[2]=reinp(ans[2],a[0])
    if ans[2]==5:
        if ans[3]!=0:
            ans[7]=ans[3]
        print(ans[7])
        ent()
    if ans[2]==6:
        clear()
        print("Done!")
        ent()
    if ans[3]==0 and ans[2]==4:
        print('The memory is empty...')
        ent()
    elif ans[3]!=0 and ans[2]==4:
        ans[3]=ans[3]
        ans[5]=reinp1(ans[5],a[1])
        if ans[5] == '+' :
            ans[5]='add'
            print("Adding")
        elif ans[5] == '-' :
            ans[5]='sub'
            print("Substracting")
        elif ans[5] == '*' :
            ans[5]='mul'
            print("Multiplication")
        elif ans[5] == '/' :
            ans[5]='div'
            print("Dividing")
        ans[2]='choice'
        ent()
    if ans[2]==1:
        perm()
    elif ans[2]==2:
        var()
    elif ans[2]==3:
        comb()
    clear1()
    ent()
def ops(a,b,c):
    if c=='add':
        return a+b
    if c=='sub':
        return a-b
    if c=='mul':
        return a*b
    if c=='div':
        return a/b
def reinp(a,b):
    while True:
        a=input(b)
        if str(a) in ['1','2','3','4','5','6']:
            return int(a)
            break    
        else:
            print('There was an error please try again:')
def reinp1(a,b):
    while True:
        a=input(b)
        if a in ["+", "-", "*", "/"]:
            return a
            break
def reinp2(a,b):
    while check2(a):
        a=input(b)
    return float(a)
def check2(a):
    try:
        float(a)
        return False
    except ValueError:
        return True
def clear():
    ans[0]='n'
    ans[1]='k'
    ans[2]='choice'
    ans[3]=0
    ans[4]=0
    ans[5]=0
    ans[7]=ans[6]
    ans[6]=0
def clear1():
    ans[0]='n'
    ans[1]='k'
    ans[2]='choice'
ent()
1

[编辑:删除了原来的回答,因为问题的格式已经修正,不再相关]

关于 reinp 的问题是,a 将会是一个字符串,而你却在和整数进行比较。
...所以要把:

    if a in [1,2,3,4,5,6]: #checking for valid input

改成:

    if a in ['1','2','3','4','5','6']: #checking for valid input

如果你在 reinp2 上还有问题,也许你可以提供一些代码来展示这个问题。对我来说,看起来没什么问题。

撰写回答