我如何检查输入是整数,而在Python中使用FOR for RAW_INPUT ..

时间:2015-04-23 10:38:20

标签: python list python-2.7 for-loop try-catch

我有一项任务

  

从您输入的列表中打印最小值。首次输入的值   定义列表的长度。应将每个下一个值放入   列表一个接一个。使用运算符

之前通过输入和n

定义了

start_n = 1

def list2_func():     
    global list2
    list2 = []
    for i in xrange(start_n, n + 1):
        list2.append(raw_input('Enter the %s number: ' % i))
        list2_check()
def list2_check():
    global start_n
    try:
        value = int(list2[-1])
    except ValueError:
        print "Please use only 0-9 keys. Re enter %s number" % len(list2)
        start_n = len(list2)
        list2_func()
    else: 
        start_n = start_n + 1

每当我输入任何没有通过try的密钥时,它再次要求相同的值 - 这很好。但是当我输入我的最后一个值(例如n = 4,那么第四个值)程序再次要求我输入。最后我获得了2*n - 1数量的值 - 这不是我想要的。

您能否建议我检查输入值是否为数字?或者在我的代码中指出错误!

我正在使用python 2.7。

5 个答案:

答案 0 :(得分:0)

您的代码中可能存在错误。如果检查失败,您将多次附加该数字。请尝试以下代码,以确保您将单个有效值附加到列表中。

def get_value(i):
    while True:
        number = raw_input('Enter the %s number: ' % i)
        try:
            value = int(number)
        except:
            continue
        return value

def list2_func():
    list2 = []
    for i in xrange(start_n, n + 1):
        number = get_value(i)
        list2.append(number)

答案 1 :(得分:0)

您不需要使用list2_check函数:

def list2_func():     
        list2 = []
        i=start_n
        while i<n+1:
            try:
                list2.append(int(raw_input('Enter the %s number: ' % i)))
                i+=1
            except ValueError:
                print "Please use only 0-9 keys. Re enter %s number" % len(list2)
        return list2

我还删除了你的全局变量,因为最好使用返回而不是全局变量。 (如果您尝试使用同名的另一个变量,它们可能会导致问题)

答案 2 :(得分:0)

刚刚玩了代码,发现了问题。程序正在完成第一个 FOR 循环,并为未通过 try 测试的每个值启动 循环的新

def list2_func():
    global list2
    list2 = []
    for i in xrange(1, n+1):
        list2.append(raw_input('Enter the %s number: ' % i))
        list2_check()
def list2_check():
    try:
        value = int(list2[-1])
    except ValueError:
        list2[-1]= raw_input("Please, use only 0-9 keys" % len(list2))
        list2_check()
    else:
        pass

现在它只是要求替换错误的值而不是再次启动 for 循环:)

答案 3 :(得分:0)

这是因为你有一个递归函数。每个函数调用另一个函数。 此外,在每个循环中修改strart_n(删除其他尝试的情况)。

答案 4 :(得分:0)

您的问题在于使用的逻辑:您添加了错误的输入值(通过list2.append),然后检查列表,如果值错误,则永远不删除最后输入的值。 因此,如果你想保留你的代码,那么当你引发ValueError时,你必须删除列表中的最后一项。

但是,您的代码还有许多其他问题需要解决: 你使用递归,你的程序很容易崩溃:只输入错误的值:每次你对&#34; list2_func&#34;进行新的调用。在&#34; list2_func&#34;。因此我们有5个连续的错误值:

call to list2_func:
    call to list2_func:
        call to list2_func:
            call to list2_func:
                call to list2_func:

当然,python会在达到最大递归时崩溃:)

另一个问题是使用全局变量。这很糟糕。只有在你真的需要全局变量时才这样做。

以下是您练习中存在的众多解决方案之一:

def get_list():
    """
    Returns an user's entered list.
    First entered value defines the length of the list. 
    Each next value should be placed in list one by one. 
    """
    wanted_length = None
    my_list = []
    while wanted_length < 1:
        try:
            wanted_length = int(raw_input('Please enter the wanted length of the list (int > 0) : '))
        except ValueError:
            pass
    i = 1
    while i <= wanted_length:
        try:
            my_list.append(int(raw_input('Please enther the number %d (int only) : ' % i)))
        except ValueError:
            pass
        else:
            i += 1
    return my_list

def print_min_with_for(l):
    """
    Prints the minimal value from list you entered using operator `for`.
    """
    if not l:
        print 'List is empty'
        return
    min_value = None
    for i in l:
        if min_value is None or i < min_value:
            min_value = i
    print 'min value in the list is : %d' % min_value

my_list = get_list()
print 'Printed min value in the list should be : %d' % min(my_list)
print_min_with_for(my_list)

欢迎使用python BTW; - )