2016-06-07 170 views
2

我在下面有這個功能,我在某處做了某些錯誤。循環功能

def quantityFunction(product): 
    valid = False 
    while True: 
     if product is not None: 
      quantity = input("Please enter the amount of this item you would like to purchase: ") 
      for i in quantity: 
       try: 
        int(i) 
        return int(quantity) 
        valid = True 
       except ValueError: 
        print("We didn't recognise that number. Please try again.") 
        #If I get here, I want to loop back to the start of this function 
        return True 

     return False 

要運行通過,該功能是從程序的主要部分被稱爲像這樣:quantity = quantityFunction(product)

返回的代碼的底部假是,如果產品是無,這是做需要在另一個函數中的一些代碼,但不得不在這個功能。

如果用戶輸入數量是一個數字,所有工作正常。如果是其他內容,則會打印「值錯誤」,您可以輸入另一個輸入。如果你再寫一封信等,它會再次重複,如果你輸入一個數字,它會接受它。

但是,它不會返回您在字母后輸入的數字。它只返回0.

我懷疑這是關於如何重複代碼,即代碼應該循環回到函數的開始,如果它擊中值錯誤。

任何想法?

+0

你在return塊中有return語句。只需打印錯誤消息,它應該可以正常工作。 – SilentMonk

+2

爲什麼你定義'valid'?它從未使用過。爲什麼是for循環?爲什麼不嘗試將數量直接轉換爲int? – Ben

+0

現在我已經把除了塊以外的函數返回,函數不會循環,我怎麼能這樣做呢? @SilentMonk –

回答

3

你說:

代碼應該環回功能的開始,如果它擊中值誤差。

那麼你不應該使用return聲明,否則該功能將終止,返回TrueFalse

+0

好吧,我已經從外面的區塊中退出了。現在函數不會循環,我怎麼能這樣做呢? @heltonbiker –

+0

我糾正了答案,你有兩個回報,一個是例外,另一個是正常流量。同時刪除 – heltonbiker

+0

我認爲你對'return'和循環有一個錯誤的想法。你有什麼意圖返回「真」和「假」? – heltonbiker

1

你應該試試這個..

def quantityFunction(product): 
    valid = False 
    while True: 
     if product is not None: 
      quantity = raw_input("Please enter the amount of this item you would like to purchase: ") 

      if quantity.isdigit(): 
      return int(quantity) 
      valid = True 
      else: 
      print("We didn't recognise that number. Please try again.") 
      continue 

     return False 

quantity = quantityFunction("myproduct") 
3

幾個問題:

1)return語句控制返回給調用函數。

2)您正在循環輸入,這是錯誤的。

3)valid=True根本不執行。

def quantityFunction(product): 
    valid = False 
    while True: 
     if product is not None: 
      quantity = raw_input("Please enter the amount of this item you would like to purchase: ") 
      try: 
        return int(quantity) 
        #valid = True (since it is never run) 
      except ValueError: 
        print("We didn't recognise that number. Please try again.") 
        #If I get here, I want to loop back to the start of this function 
        #return True 
     return False 

quantityFunction("val") 

注意:使用raw_input()在Python 2.7和input()的情況下3.X

1

首先情況下,我們解決的代碼。簡單地說,你需要一個循環直到用戶輸入合法數量的函數。

產品對功能沒有太大作用;請在調用程序中檢查它,而不是在這裏。讓函數有一個目的:獲取有效數量。

讓我們從標準配方開始「從循環到完美輸入」。很簡單,它看起來像:

Get first input 
Until input is valid 
... print warning message and get a new value. 

在代碼中,它看起來像這樣。

def get_quantity(): 
    quantity_str = input("Please enter the amount of this item you would like to purchase: ") 

    while not quantity_str.isdigit(): 
     print("We didn't recognise that number. Please try again.") 
     quantity_str = input("Please enter the amount of this item you would like to purchase: ") 

    return quantity 

至於編碼習慣...

逐步開發:寫幾行代碼添加一個功能,你有什麼。調試。在添加更多內容之前讓它工作。

瞭解您的語言功能。在您發佈的代碼中,您誤用代替,代碼,返回代碼和函數調用。

看看如何解決簡單的問題。 嘗試/除了是一個更難處理的概念比簡單isdigit

1

試試這個(也包含一些格式,但功能應該是相同的):

def determine_quantity(product): # descriptive function name 
    if not product: # avoiding nesting 
     return False 
    while True: 
     quantity = input("Please enter the amount of this item you would like to purchase: ") 
     try: 
      return int(quantity) # try to convert quantity straight away 
     except ValueError: 
      print("We didn't recognise that number. Please try again.") 
      # nothing here means we simply continue in the while loop 

理想情況下,你會拿產品出來。函數應該儘可能少,而且這個檢查在其他地方更好。

def determine_quantity(): 
    while True: 
     quantity = input("Please enter the amount of this item you would like to purchase: ") 
     try: 
      return int(quantity) 
     except ValueError: 
      print("We didn't recognise that number. Please try again.")