0

これは私の現在のコードです:

while True:
    try:
        username = input("Username: ")


        if len(username) < 8:
            print ("Sorry, the username must be at least 8 characters long.")


        if username.isalnum() == False:
            print ("Sorry, your name can only contain alpha numeric characters")


        numupper = 0


        for c in username:

            if c.isupper() == True:
                numupper += 1

            if numupper > 0:
                print ("You have at least 1 uppercase in this username.")

            else:
                print ("You have no uppercase in this username.")

        numlower = 0

        for d in username:

            if d.islower() == True:
                numlower +=1
            if numlower > 0:
                print ("You have at least 1 lowercase in this username.")

            else:
                print ("You have no lowercase in this username.")


        numdigit = 0

        for e in username:

            if e.isdigit() == True:
                numdigit += 1
            if numdigit > 0:
                print ("You have at least one digit in this username.")

            else:
                print("You have no digits in this username.")

        else:
            print("Please try again")
            continue

    except:
        print ("Sorry, not valid. Try again.")
    else:
        print ("Thank you for your input")
        break

メイン プログラムを使用してこの定義を実行すると、次のようになります。

import uservalidation


username = input("Username: ")


result, reason = uservalidation.valid_username(username)


if not(result):
    print (reason)

私はこれを取得します(入力する文字数に応じて):

Username: craig
Sorry, the username must be at least 8 characters long.
You have no uppercase in this username.
You have no uppercase in this username.
You have no uppercase in this username.
You have no uppercase in this username.
You have no uppercase in this username.
You have at least 1 lowercase in this username.
You have at least 1 lowercase in this username.
You have at least 1 lowercase in this username.
You have at least 1 lowercase in this username.
You have at least 1 lowercase in this username.
You have no digits in this username.
You have no digits in this username.
You have no digits in this username.
You have no digits in this username.
You have no digits in this username.
Please try again

「このユーザー名には少なくとも小文字が含まれています」などのステートメントを 1 回だけ表示するようにコードを変更するにはどうすればよいですか。本当にありがとうございます

4

5 に答える 5

2

インデントがオフになっています:

for c in username:
    if c.isupper() == True:
        numupper += 1

    if numupper > 0:
        print ("You have at least 1 uppercase in this username.")
    else:
        print ("You have no uppercase in this username.")

したがって、文字ごとに、エラーテキストを印刷します。代わりに実行したいのは、番号のチェックをループの外側に移動することです。

for c in username:
    if c.isupper() == True:
        numupper += 1

if numupper > 0:
    print ("You have at least 1 uppercase in this username.")
else:
    print ("You have no uppercase in this username.")

したがって、(ループ内の)大文字を数えた後、結果を評価し、エラーテキストを1回出力します。

同じことが小文字と数字のチェックにも当てはまります。

ところで。異なるforループに同じ変数を使用できます。したがって、を使用する必要はなくcdを使用eし続けることができますc。また、ループのマージを検討する必要があります。3つすべてで、ユーザー名の文字をループするので、すべてを同時に実行できます。

numupper, numlower, numdigit = 0, 0, 0

for c in username:
    if c.isupper():
        numupper += 1
    if c.islower():
        numlower +=1
    if e.isdigit():
        numdigit += 1

# and now check numupper, numlower and numdigit

また、ご覧のとおり== True、if条件からを削除しました。if式がtrueに等しいかどうかをすでにチェックしているので、一般的にはそれを除外することをお勧めします。したがって、基本的に冗長です。

そして最後に、これらのチェックを少し異なる方法で行うことができます。たとえば、文字列を同じ文字列に変換して元のテキストと比較することにより、小文字と大文字を確認できます。つまりusername.lower() == username、大文字が含まれていないことを意味します。同様username.upper() == usernameに、小文字がないことを意味します。

于 2012-12-05T19:49:03.830 に答える
1

この変更を行います:

for c in username:
    if c.isupper() == True:
        numupper += 1

if numupper > 0:
    print ("You have at least 1 uppercase in this username.")
else:
    print ("You have no uppercase in this username.")

numlower = 0

for d in username:
    if d.islower() == True:
        numlower +=1

if numlower > 0:
    print ("You have at least 1 lowercase in this username.")

else:
    print ("You have no lowercase in this username.")

printループの外側にステートメントが必要です。

私はおそらくこれを次のように書くでしょう:

hasUpper = any([c.isupper() for c in username])
if hasUpper:
    print ("You have at least 1 uppercase in this username.")
else:
    print ("You have no uppercase in this username.")
于 2012-12-05T19:50:28.147 に答える
1

のような「文字数チェック」行if numupper > 0:は、for-each-character-in-username ループ内にあります。目的の結果を得るには、ループ内ではなくループの後に配置します。

例えば、

for c in username:
        if c.isupper() == True:
            numupper += 1
# Now we're outside the loop, because we've de-dented the lines below
if numupper > 0:
    print ("You have at least 1 uppercase in this username.")
else:
    print ("You have no uppercase in this username.")
于 2012-12-05T19:46:20.740 に答える
0

大文字/小文字/桁のカウントが必要ない場合は、forループから抜け出すことができます。このような:

    for d in username:
        if d.islower():
            print ("You have at least 1 lowercase in this username.")
            break
    else:
        # This executes only if the for loop doesn't end because of a break
        print ("You have no lowercase in this username.")
于 2012-12-05T19:50:04.767 に答える
0

ブロックを削除してループをstry...exceptに置き換えると、コードを大幅に簡素化できます。map()

import string

while True:
    errors = []
    username = input("Username: ")

    if len(username) < 8:
        errors.append("The username must be at least 8 characters long.")

    if len(map(string.isupper, username)) == 0:
        errors.append("You have no uppercase in this username.")

    if len(map(string.isupper, username)) == 0:
        errors.append("You have no lowercase in this username.")

    if len(map(string.isdigit, username)) == 0:
        errors.append("You have no digits in this username.")

    if not username.isalnum():
        errors.append("Your name can only contain alpha numeric characters.")

    if not errors:
        print("Thank you for your input")
        break
    else:
        for error in errors:
            print(error)

        print("Sorry, not valid. Try again.")
于 2012-12-05T19:55:42.830 に答える