2017-11-24 16 views
-3

練習用のパスワード生成関数を作成していますが、3つあるかどうかをチェックしたいときに生成するパスワードにユーザーが少なくとも8記号の長さを指定しているかどうかを確認しています間違った入力試行returnを使ってプログラムを終了するだけです。パスワードジェネレータ関数の奇数 '戻り値'

私はリターン関数がすべてをストップすることを期待していましたが、その後のループを続行しませんでしたが、そうではありませんでした。

なぜそれが起こっているのか理解してもらえますか?

import string 
    import random 
    attempts = 0 

def PasswordGenerator(passwordlenght): 
    passwordlenght = int(passwordlenght) 
    password= "" 
    i = 0 

    if passwordlenght < 8: 
     print("Password length must be more than 8 symbols !!!") 
     global attempts 
     attempts += 1 

     if attempts <3: 
      PasswordGenerator(passwordlenght) 
     else: 
      return 1  

    while i < passwordlenght: 
     if i in range(1,passwordlenght,3): 
      password += string.ascii_lowercase[random.randrange(len(string.ascii_lowercase))] 
     elif i in range(2, passwordlenght, 3): 
      password += string.ascii_uppercase[random.randrange(len(string.ascii_uppercase))] 
     elif i in range(3, passwordlenght, 3): 
      password += string.digits[random.randrange(len(string.digits))] 
     i += 1 

    print(password) 

PasswordGenerator(5) 
+0

質問にコードを入力するときにインデントのいくつかがうんざりしているように見えます。それが問題に影響する可能性があります。質問内のすべての行に実際のスクリプトと同じインデントが付いていることを確認してください。 –

+1

問題が字下げでない場合は、通常の繰り返し構造の代わりに再帰を使用することに関係していると思います。 –

+3

'PasswordGenerator'関数の中から' PasswordGenerator'を呼び出すべきではありません。これは再帰と呼ばれ、この動作を見ている理由です。あなたは内側の呼び出しから戻り、外側の呼び出しを続行します。再帰を 'goto'として使うのではなく、ループを使うようにコードを再編集してください。 – Blorgbeard

答えて

0

何が起こっているのか、「無効な」セクションに入り、PasswordGeneratorをもう一度呼び出し、残りのコードを終了します。したがって、3回目の試行では、パスワードを生成せずに2回目の試行を終了し、パスワードを生成して1回目の試行を終了し、パスワードを生成します。これを行うにはいくつかの方法がありますが、whileループを最後に 'else'条件をpasswordlength <にするか、試行の場合はelseの戻り値を削除してください。<あなただけの1)

import string 
import random 
attempts = 0 

def PasswordGenerator(passwordlenght): 
    passwordlenght = int(passwordlenght) 
    password= "" 
    i = 0 

    if passwordlenght < 8: 
     print("Password length must be more than 8 symbols !!!") 
     global attempts 
     attempts += 1 

     if attempts <3: 
      PasswordGenerator(passwordlenght) 
     return 1 
    else: 

     while i < passwordlenght: 
      if i in range(1,passwordlenght,3): 
       password += str ing.ascii_lowercase[random.randrange(len(string.ascii_lowercase))] 
      elif i in range(2, passwordlenght, 3): 
       password += string.ascii_uppercase[random.randrange(len(string.ascii_uppercase))] 
      elif i in range(3, passwordlenght, 3): 
       password += string.digits[random.randrange(len(string.digits))] 
      i += 1 

     print(password) 

PasswordGenerator(5) 

編集が必要になります。私は(そうでなければ、唯一のこれまでのパスワードの長さなど、元々提供された値を渡します、そしてそれは常に失敗する、それが現在コーディングされている方法は、テストの目的であると仮定しています8未満の場合)。それがあなたがやっていることでないならば、それも変えなければなりません。

0

私は疑うあなたの問題は、この行を次のとおりです:ここ

はコードですあなたの関数が自分自身を再帰的に呼び出している

PasswordGenerator(passwordlenght) 

が、それはreturnないから返された値を行いますので、再帰呼び出しでは、後でコードの残りの部分を実行するようになります。

あなたはreturnを追加することによって、それを「修正する」ことができます:

return PasswordGenerator(passwordlenght) 
をしかし、それはまだ非常に良い解決策はありません。特定の回数何かを行う必要があるほとんどのプログラムでは、再帰ではなくループを使用するほうがはるかに優れています。長さが短すぎる初めてであれば、それはまだあまりにもなりますので、

for attempt in range(3): 
    if passwordlenght < 8: 
     print("Password length must be more than 8 symbols !!!") 
    else: 
     # put the rest of the code here, including the return 

は明らかにこれは、少し愚かである:確かに同じ長さは確かに短すぎる三回をチェックします。このような何かを、試してみてください2回目と3回目を短くする。私は本当に複数の試行のポイントがこの特定のチェックのためであるかどうかはわかりません(候補パスワードの他のチェックでは意味がありますが、ランダムではなくユーザーが長さを提供するため、 。