2015-09-14 170 views
0

我有一些而循環問題。我的目標是如果用戶輸入一個負值3次,while循環就會結束。問題是,當我到達第三條消息時,它並不以「milesLoop」結尾,因爲它應該是 (我嘗試使用一個循環,但我想使用多個循環進行測試) 這可能是一個容易解決的問題,但我卡住了。Python雖然循環沒有結束

這是Python代碼:

__author__ = 'MichaelCorbett' 
import sys 

print('Michael Corbett converter ') 
print('\n') 

milesLoop = 1 
fhietLoop = 1 
gallonLoop = 1 
poundsLoop = 1 
inchesLoop = 1 

while milesLoop == 1: 

    miles = float(input('What\'s up Will, how many miles do you wish to convert to Kilometers? ')) 
    if miles < 0: 
     print('This converter does not accept negeative values. Try again!') 

     miles = float(input('What\'s up Will, how many miles do you wish to convert to Kilometers? ')) 
     if miles < 0: 
      print('This converter does not accept negeative values. Try again') 

      miles = float(input('What\'s up Will, how many miles do you wish to convert to Kilometers? ')) 
      if miles < 0: 
       print('This converter does not accept negeative values. Program is Terminated') 
       milesLoop = 2 


       while fhietLoop == 1: 

        Fheit = float(input('What temperature is it outside in Fahrenheit? ')) 
        if Fheit < 0 and Fheit > 1000: 
         print('This converter does not accept negeative values.') 

         Fheit = float(input('What temperature is it outside in Fahrenheit? ')) 
         if Fheit < 0 and Fheit > 1000: 
          print('This converter does not accept negeative values.') 

          Fheit = float(input('What temperature is it outside in Fahrenheit? ')) 
          if Fheit < 0 and Fheit > 1000: 
           print('This converter does not accept negeative values. Program is Terminated') 
           fhietLoop = 2 


          while gallonLoop == 1: 

           gallon = float(input('How many gallons are you trying to convert? ')) 
           if gallon < 0: 
            print('This converter does not accept negeative values.') 

            gallon = float(input('How many gallons are you trying to convert? ')) 
            if gallon < 0: 
             print('This converter does not accept negeative values.') 

             gallon = float(input('How many gallons are you trying to convert? ')) 
             if gallon < 0: 
              print('This converter does not accept negeative values. Program Terminated') 
              gallonLoop = 2 


             while poundsLoop == 1: 

              pounds = float(input('How many pounds would you like to convert? ')) 
              if pounds < 0: 
               print('This converter does not accept negeative values.') 

               pounds = float(input('How many pounds would you like to convert? ')) 
               if pounds < 0: 
                print('This converter does not accept negeative values.') 

                pounds = float(input('How many pounds would you like to convert? ')) 
                if pounds < 0: 
                 print('This converter does not accept negeative values. Program Terminated') 
                 poundsLoop = 2 


                while inchesLoop == 1: 

                 inches = float(input('How many inches would you like to convert? ')) 
                 if inches < 0: 
                  print('This converter does not accept negeative values.') 

                  inches = float(input('How many inches would you like to convert? ')) 
                  if inches < 0: 
                   print('This converter does not accept negeative values.') 

                   inches = float(input('How many inches would you like to convert? ')) 
                   if inches < 0: 
                    print('This converter does not accept negeative values. Program Terminated') 
                    inchesLoop = 2 



                   # Calculations 

                   kilometers = miles * 1.6 
                   celsius = int((Fheit - 32) * 5/9) 
                   liters = gallon * 3.9 
                   kilograms = pounds * .45 
                   centimeters = inches * 2.54 

                   # Output 

                   print('\n') 
                   print(miles, ' miles is ', kilometers, ' Kilometers') 
                   print('Its is ', celsius, 'Celsius outside.') 
                   print(gallon, ' gallons is ', liters, ' liters') 
                   print(pounds, ' pounds is ', kilograms, ' kilograms') 
                   print(inches, ' inches is ', centimeters, ' centimeters') 
+4

哇,你可能想現在就調整你的代碼,爲什麼?因爲它是瘋狂的嵌套,你甚至不能調試你自己的代碼,它包含簡單的'if's和'while's – taesu

+0

這是相當多的代碼與複製負載(如使用每個'if'語句三次)請將其縮小到重現此錯誤的最低代碼。 – Adriaan

+1

當用戶預先輸入正值時,您認爲您的代碼會做什麼? –

回答

3
def get_float(prompt): 
    while True: 
     try: 
      return float(input(prompt)) 
     except: 
      print "Thats not a number!" 


def get_positive_number(prompt,tries=3): 
    for i in range(tries): 
     result = get_float(prompt) 
     if result >= 0: return result 
     print "Sorry Negative not allowed %d/%d"%(i,tries) 

while True: 
    result = get_positive_number("How Many Gallons?") 
    if result is None: 
     print "OK DONE" 
     break 
    print "Convert %0.2f Gallons"%(result) 
-2
__author__ = 'MichaelCorbett' 
import sys 

def myLoop(question, tries = 0): 
    while True: 
     if tries == 3: 
      sys.exit() 
     user_in = float(input(question)) 
     if user_in < 0: 
      print('This converter does not accept negeative values. Try again!') 
      tries += 1 
     else: 
      return user_in 

print('Michael Corbett converter\n') 

miles = myLoop('What\'s up Will, how many miles do you wish to convert to Kilometers?') 
Fheit = myLoop('What temperature is it outside in Fahrenheit?') 
gallon = myLoop('How many gallons are you trying to convert?') 
pounds = myLoop('How many pounds would you like to convert?') 
inches = myLoop('How many inches would you like to convert?') 

# Calculations 

kilometers = miles * 1.6 
celsius = int((Fheit - 32) * 5/9) 
liters = gallon * 3.9 
kilograms = pounds * .45 
centimeters = inches * 2.54 

print('\n{0} miles is {1} Kilometers'.format(miles, kilometers)) 
print('Its is {0} Celsius outside.'.format(celsius)) 
print('{0} gallons is {1} liters'.format(gallon, liters)) 
print('{0} pounds is {1} kilograms'.format(pounds, kilograms)) 
print('{0} inches is {1} centimeters'.format(inches, centimeters)) 
+1

1)你有5個函數幾乎完成同樣的事情,所以它們可以被一個函數替換,該函數接受所需轉換類型的參數。 2)爲什麼使用遞歸,當你可以用一個簡單的循環做同樣的事情?遞歸有額外的開銷,並且最好在Python中避免,除非它對於問題域是自然的,例如使用像樹一樣的遞歸數據結構。 3)「否定」中只有一個「e」。 –

+0

是的,這可以重寫成一個單一的功能。我複製粘貼的文本,所以可能有錯別字。這些遞歸使用尾部調用優化來避免爲遞歸函數分配新的堆棧幀。 –

+1

Python沒有tail-call優化。我意識到拼寫錯誤是由於複製粘貼造成的,但這並不妨礙您修復它。 :) OTOH,你當然沒有義務修復這樣的錯誤。 –