2013-02-10 84 views
2

我目前正在使用Python 3.3.0编写一个程序,它打印出n个第一个方形数字并最终打印出它们的总和。条件是用户只能计算大于零的整数项。这里是代码:检查输入是否是一个循环中的字符串

print("WELCOME!") 

n = input("How many numbers to sum up?: ") 

while n <= 0: 
    print("You have to write a positive integer; try again!") 
    n = input("How many numbers to sum up?: ") 

i = 1 
sum = 0 
while 0 < i <= n: 
    print(i,"*",i,"=", i**2) 
    sum += i**2 
    i += 1 
print("Sum:", sum) 

现在,我设法编写错误消息,当用户键入一个负数。但是,在用户键入字符串时(例如“十五”),编码错误消息时遇到困难。

我希望程序允许用户尝试一次又一次地赋值'n'的值,就好像他们输入了一个负数;基本上我想编写一个循环,如果用户输入一个字符串,就会一遍又一遍地询问相同的事情。

问题是input()总是将一个字符串赋值给一个任意变量,所以我试图编写将字符串转换为整数的代码。当用户输入一个整数值时它工作正常,但是如果'n'不是整数,它不能定义int(n)。

我在这个问题上搜索了很多,我发现了一些使用try和except ValueError的例子,但是他们都没有能够创建一个循环。

有人有想法吗?

+0

您还可以看看['ast.literal_eval'(http://docs.python.org/2/library/ast.html#ast.literal_eval) – Bakuriu 2013-02-10 07:36:47

回答

1

try/except放在循环内。

while True: 
    try: 
     n = int(input("How many numbers to sum up?: ")) 
     if n <= 0: 
      print("You have to write a positive integer; try again!") 
      continue 
     break 
    except ValueError: 
     print("You have to write a positive integer; try again!") 

您也可以取代你的代码(第一循环后的部分)的最后一部分与此:

squares = lambda x: [print('{0} * {0} = {1}'.format(x, x**2)), x**2][1] 

print("Sum:", sum(squares(i) for i in range(1, n+1)) 

不建议虽然;)拉姆达。您当然可以使用正常功能:

def squares(x): 
    print('{0} * {0} = {1}'.format(x, x**2)) 
    return x**2 
+0

谢谢你,做了招。 – kapython 2013-02-10 14:27:25

0

我想这样?伪python:

n = None 
while n is None: 
    try: 
     n = int(input("How many numbers to sum up?: ")) 
    except ValueError: 
     pass 
1

您可以使用str.isdigit()来完成此操作。根据文档,isdigit()接受兼容性上标数字,例如\ u0660123。但python 3的input()会为这种类型的输入转义反斜杠,所以这些字符串不应该引起任何问题。

while True: 
    n = input("How many numbers to sum up?: ") 
    if n.isdigit() and int(n) > 0: 
    break 
    else: 
    print("You have to write a positive integer; try again!") 

squares = (i**2 for i in range(1,int(n)+1)) 
s = 0 
for integer in range(1,int(n)+1): 
    nextsquare = next(squares) 
    s += nextsquare 
    print(integer, "*", integer, '=', nextsquare, sep='') 

print('Sum', s)