繁体   English   中英

Python:使用for循环制作万无一失的输入法时出错[重复]

[英]Python: Error while making foolproof input method using for loop [duplicate]

digits = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']

def inp():
    inp = input('Enter a value: ')

    for i in inp:
        if i not in digits:
            print('Please enter a value from 2 to 100')
            inp()

    n = int(inp)
    if not 2 <= n <= 100:
        print('Please enter a value from 2 to 100')
        inp()
    else:
        return n

number = inp()

我无法做到万无一失:用户可以输入一个空字符串""或浮点数,它会给出一个错误。

例如:如果我输入10.5然后输入10那么它会显示错误,即 10.5 不能作为整数值。

如果有一个简单的函数,比如 VB6 中的val()或 Python 的等效函数,我将不胜感激。

编辑:预期行为:我希望代码只采用整数值,2 到 100 作为输入,如果输入了不正确的值,那么它应该重复直到收到适当的值。

请帮忙。

我发现解决方案是这样的:

def inp_w():
    while True:
        try:
            inp = round(float(input('Width of the maze (number of blocks): ')))
        except:
            print('Please enter a value from 2 to 100')
            continue
        else:
            break
    
    if not 2 <= inp <= 100:
        print('Please enter a value from 2 to 100')
        inp_w()
    else:
        return inp


a = inp_w()
Thanks to
"https://stackoverflow.com/users/16343464/mozway"
"https://stackoverflow.com/users/13000953/mahrkeenerh"
"https://stackoverflow.com/users/9635106/karl-wilhelm"
"https://stackoverflow.com/users/16601101/jeandemeusy"

你犯了三个错误:

  • 你以同样的方式命名了一个方法和一个变量。 当涉及到“inp()”时,解释器不知道该怎么做。 您是要调用方法“inp”还是变量“inp”? 其中之一是不可能做到的,所以它崩溃了。 作为良好的实践,永远不要为代码中的不同元素赋予相同的名称。
  • 您缺少字符 '.' 在您的数字列表中。 解析字符串“10.5”时,它无法识别点,因此崩溃。
  • 由于浮点部分,从字符串到 int 的转换无法将“10.5”转换为 10。 因此,将其转换为浮点数而不是整数。

这是一个工作代码:

valid_chars = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "."]


def input_val():
    inp = input("Enter a value: ")

    for i in inp:
        if i not in valid_chars:
            print("Please enter a value from 2 to 100")
            return input_val()

    n = float(inp)
    if not 2 <= n <= 100:
        print("Please enter a value from 2 to 100")
        return input_val()

    return n


number = input_val()

编辑:一个更好的答案,没有递归可能是这样的:

def is_float(string):
    try:
        float(string)
        return True
    except:
        return False


def input_val(min_val: int, max_val: int):

    while True:
        inp = input("Enter a value: ")

        if not is_float(inp):
            print("Please enter a number")
        else:
            n = float(inp)
            if not min_val <= n <= max_val:
                print(f"Please enter a value from {min_val} to {max_val}")
            else:
                break
    return n


number = input_val(2, 100)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM