我目前正在用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和除ValueError之外的例子,但是它们似乎都没有能够创建一个循环。
有人有个主意吗?
答案 0 :(得分: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))
;)
不建议使用lambda。你当然可以使用普通函数:
def squares(x):
print('{0} * {0} = {1}'.format(x, x**2))
return x**2
答案 1 :(得分: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)
答案 2 :(得分:0)
我想这样的事情?伪蟒:
n = None
while n is None:
try:
n = int(input("How many numbers to sum up?: "))
except ValueError:
pass