2013-02-10 125 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) 
相關問題