2017-06-23 32 views
1

私はプログラムを終了しようとしています。ユーザーがWebサイトの名前とパスワードをリストに保存できるいくつかのオプションを選択できるメニューを追加しました。しかし、Webサイトの名前とパスワードをそれぞれのボールトに追加するとすぐに問題が発生しました。ここで、Webサイトの名前とパスワードを追加した後にオプションを選択しようとすると、「1」はviewappを呼び出すための入力です)機能を使用して、これまで格納されたWebサイトとパスワードを表示します。というのは、viewapp()関数を呼び出すのに2回以上かかることです。最初の期待される入力を拒否し、2番目の入力を奇妙に受け入れます。また、summary()を呼び出す目的で3番目のオプションを選択すると、印刷された要約全体が2回印刷されます。これは、2番目の予想入力を受け入れるだけのメニューと同様のパターンです。プログラムは、この迷惑なバグを除いて、私が望むことをやっています。これらの4つのオプションを選択すると、すぐにその関数にジャンプするはずの入力をもう一度求めます。ヘルプをいただければ幸いです。Python:入力を二度要求し、重複した印刷ステートメントを出力する

appvault = [] 
passvault = [] 

def logged(): 
    print("----------------------------------------------------------------------\n") 
    print("Hello, welcome to the password vault console. ") 
    modea = input("""Below are the options you can choose from in the password vault console: 
    ##########################################################################\n 
    1) Find the password for an existing webiste/app 
    2) Add a new website/app and a new password for it 
    3) Summary of the password vault 
    4) Exit 
    ##########################################################################\n 
    > """).strip() 
    return modea 

def viewapp(): 
    if len(appvault) > 0: 
     for app in appvault: 
      print("Here is the website/app you have stored:") 
      print("- {}\n".format(app)) 
    if len(passvault) > 0 : 
     for code in passvault: 
      print("Here is the password you have stored for the website/app: ") 
      print("- {}\n".format(code)) 

    else: 
     print("You have no apps or passwords entered yet!") 

def addapp(): 
    while True: 
     validapp = True 
     while validapp: 
      new_app = input("Enter the new website/app name: ").strip().lower() 
      if len(new_app) > 20: 
       print("Please enter a new website/app name no more than 20 characters: ") 
      elif len(new_app) < 1: 
       print("Please enter a valid new website/app name: ") 
      else: 
       validapp = False 
       appvault.append(new_app) 

     validnewpass = True 
     while validnewpass: 
      new_pass = input("Enter a new password to be stored in the passsword vault: ") 
      if not new_pass.isalnum(): 
       print("Your password for the website/app cannot be null, contain spaces or contain symbols \n")    
      elif len(new_pass) < 8: 
       print("Your new password must be at least 8 characters long: ") 
      elif len(new_pass) > 20: 
       print("Your new password cannot be over 20 characters long: ") 
      else: 
       validnewpass = False 
       passvault.append(new_pass) 

     validquit = True 
     while validquit: 
      quit = input("\nEnter 'end' to exit or any key to continue to add more website/app names and passwords for them: \n> ") 
      if quit in ["end", "End", "END"]: 
       logged() 
      else: 
       validquit = False 
       addapp() 
      return addapp   

def summary(): 
    if len(passvault) > 0: 
     for passw in passvault: 
      print("----------------------------------------------------------------------") 
      print("Here is a summary of the passwords stored in the password vault:\n") 
      print("The number of passwords stored:", len(passvault)) 
      print("Passwords with the longest characters: ", max(new_pass for (new_pass) in passvault)) 
      print("Passwords with the shortest charactrs: ", min(new_pass for (new_pass) in passvault)) 
      print("----------------------------------------------------------------------") 
    else: 
     print("You have no passwords entered yet!") 

while True:   
    chosen_option = logged() 
    print(chosen_option) 
    if chosen_option == "1": 
     viewapp() 

    elif chosen_option == "2": 
     addapp() 

    elif chosen_option == "3": 
     summary() 

    elif chosen_option == "4": 
     break 
    else: 
     print("That was not a valid option, please try again: ") 

print("Goodbye") 

答えて

2

if quit in ["end", "End", "END"]: 
    logged() 

次に、あなたが入力した選択はlogged()によって返され、それが何にも割り当てられていないとして捨て。

あなたはすぐに戻ってaddapp()で前のブロックの終わりだ、と次の命令を使用すると、chosen_option = logged()

によって再び logged()に送信されますあなたのメインループにあなたを戻すことが return addapp、あります

return addappにはaddappファンクションが返ってきます。これは確かにあなたがしたいことではありません。したがって、addapp()の戻り値が必要ないので、returnを使用するか、まったく使用しないでください。Pythonは自動的に関数の最後に戻ります。

だから、あなたの問題を解決するために:直接returnあなたが入る終わっサイト:あなたがより多くのサイトを追加するときに、再帰的に自分自身からaddapp()を呼び出すことも

if quit in ["end", "End", "END"]: 
    return 

注意を。
本当にいくつかの再帰的アルゴリズムを使用し、メインループで行ったようにループを使用しない限り、これを回避する必要があります。デフォルトでは、Pythonは1000の再帰レベルにあなたを制限 - ので、あなたも、行の1000件の以上のサイトを入力することにより、アプリケーションをクラッシュする可能性があります;)

要約問題だけsummary()

に不要な forループによって引き起こされます
1

あなたはほぼそこにいます。あなたは

pass 

logged() 

を交換する場合は、すべてがOKに動作します

if quit not in ["end", "End", "END"]: 
    logged() 

:問題は、ライン63でaddapp()関数です。 とにかくログに記録された機能の結果を処理していません。 ここでログ機能を処理する必要もありません。 addappは終了し、ログに記録された関数が呼び出され、addapp関数が呼び出されたwhileループで処理されます。 addapp()を終了するとき、あなたがlogged()を呼び出すので、この問題が発生した

関連する問題