2012-01-02 12 views
2

私はsys.stdout.flush()でstdoutをフラッシュしようとしましたが、それでも動作しません。ユーザーがコードを壊すCまたはFのみを入力するまでは正常に動作します。接尾辞は と呼ばれる最初の関数なので、ユーザーが1文字しか入力しないとエラーが返されることを確認します。しかし、エラーが返されると、ユーザーはもはや「quit」または「q」を入力することができなくなります。ユーザが 'q'または 'quit'を入力したときに私の小さなpythonプログラムを終了させるにはどうすればよいですか?

#!/usr/local/bin/python 
#Converts between Celsius and Fahrenheit 
import random, sys 

def check_version(): 
    """ 
    Make sure user is using Python 3k 
    """ 
    if(sys.version_info[0] != 3): 
     print("Stop peddling with your feet Fred!") 
     print("Only Py3k supported") 
     sys.exit() 
    else: 
     pass 

def random_insult(): 
    """ 
    Returns a list of random insults with the sole purpose of insulting the user 
    """ 
    insults = ["Kel", "stimpy", "knucklehead"] 
    return insults[random.randrange(3)] 

def suffix(temp): 
    """ 
    Accepts the input temperature value which should be a string suffixed by C(c) or F(f) 
    Returns the last element of the input string(C or F) 
    """ 
    if(len(temp) >= 2): 
     return temp[len(temp)-1] 
    else: 
     temperature("Input String TOO Small") 

def temp_value(temp): 
    """ 
    Accepts the input temperature value which should be a string suffixed by C(c) or F(f) 
    Returns the actual temperature value 
    """ 
    if(len(temp) >= 2): 
     return temp[0:len(temp)-1] 
    else: 
     temperature("Input String TOO Small") 

def cel_to_far(temp): 
    """ 
    Accepts the input temperature value as Celsius and returns it in Fahrenheit 
    """ 
    try: 
     return ((temp * (9/5.0)) + 32) 
    except TypeError: 
     return "Has to be a number" 

def far_to_cel(temp): 
    """ 
    Accepts the input temperature value as Fahrenheit and returns it in Celsius 
    """ 
    try: 
     return ((temp - 32) * (5/9.0)) 
    except TypeError: 
     return "Has to be a number" 

def temperature(error=None): 
    """ 
    Loops until the user enters quit or q. Allows the user to enter the temperature suffixed by either C(c) or F(f). 
    If suffixed with C then the temperature is taken as Celsius and converted to Fahrenheit. 
    If suffixed with F then the temperature is taken as Fahrenheit and converted to Celsius. 
    If the user enters anything else be sure to belittle him/her. 
    """ 
    prompt1 = "Enter value suffixed by C or F *\n" 
    prompt2 = "Type 'quit' or 'q' to quit  *\n" 
    error1 = "What in the world are you doing "+ random_insult() + "?\n" 
    error2 = "Did you forget to add C or F to the end of the value?\n" 
    example = "Here's an example of input: 30F\n" 
    stars = ("*" * 32) + "\n" 
    temp = None 
    if(error != None): 
     print(error) 
     print(example) 
     temperature()   
    else: 
     while(True): 
      sys.stdout.flush() 
      try: 
       temp = input("\n"+ stars + prompt1 + prompt2 + stars + ">>") 
       if((temp == 'quit') or (temp == 'q')): 
        return 

       elif((suffix(temp) == 'C') or (suffix(temp) == 'c')): 
        print("Celsius:", temp_value(temp)) 
        print("Fahrenheit: {0:.1f}".format(cel_to_far(float(temp_value(temp))))) 

       elif((suffix(temp) == 'F') or (suffix(temp) == 'f')): 
        print("Fahrenheit:", temp_value(temp)) 
        print("Celsius: {0:.1f}".format(far_to_cel(float(temp_value(temp))))) 

       else: 
        print(error1 + error2 + example) 

      except: 
       print("Something went wrong and I don't care to fix it.\n") 
       return 

if(__name__ == '__main__'): 
    check_version() 
    temperature() 
+0

あなたはすぐに出て来る必要はありません、あなたは、ドキュメント文字列でユーザーを侮辱しようとしていることを明らかにする。コードのその部分は*自己文書化*とみなされます。 – Droogans

+0

まあ、私は自分のコードを文書化する上でよりうまくやりたいと思っています。 – masterofnothing

答えて

6

問題は、エラーが発生し、ユーザーがq/quittemperatureが呼ばれたほど何度も入力する必要があるプログラムを終了するときtemperatureは異なる場所に再帰的に呼び出されていることです。

問題を解決するには、すべての再帰呼び出しを削除し、別の方法でエラーを処理することをお勧めします。たとえば、tempは、ユーザーからの正しい入力であることを確認するためにチェックされ、エラーメッセージが表示され、入力がqまたはquitの場合は無限ループループの最後までbreakが呼び出されます。

+0

ありがとう、これはまたqを何度も押すと最終的に終了する理由を説明しています – masterofnothing

4

あなたのプログラムは再帰的ではありませんが、再帰的です。例えば

は、温度の関数で、このビットがある:

if(error != None): 
    print(error) 
    print(example) 
    temperature()  

ように温度関数は、温度関数を呼び出します。代わりに、主な機能には

while temperature(): 
    pass 

を行うには、誰かが終了したときに、温度関数はfalseを返す必要があり、これまでどこからでも温度()関数を呼び出すことはありません。

+0

よろしくお願いします助けてくれてありがとう – masterofnothing

関連する問題