我有一项任务
之前通过输入和从您输入的列表中打印最小值。首次输入的值 定义列表的长度。应将每个下一个值放入 列表一个接一个。使用运算符 。
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。
答案 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; - )