-1

これを短縮/改善できますか? Pythonでパスワードチェッカーを作ろうとしています。

if を for ループに入れることはできますか? もしそうなら、どのように?

pw = input("Enter password to test: ")

caps = sum(1 for c in pw if c.isupper())
lower = sum(1 for c in pw if c.islower())
nums = sum(1 for c in pw if c.isnumeric())

scr = ['weak', 'medium', 'strong']
r = [caps, lower, nums]


if len(pw) < 6:
    print("too short") 
elif len(pw) > 12:
    print("too long")

if caps >= 1:
    if lower >= 1:
        if nums >= 1:
            print(scr[2])
        elif nums < 1:
            print("your password is " + scr[1])
    elif lower < 1:
        print("your password strength is " + scr[0])
elif caps < 1:
    print("your password strength is " + scr[1])

提案をありがとう:D

4

3 に答える 3

2
caps = sum(1 for c in pw if c.isupper())

次のことができます。

caps = sum(c.isupper() for c in pw)

if caps >= 1:

次のことができます。

if caps:

最も重要な改善点: ボトムif/elifブロックは次のように完全に削除できます

i_strength = sum(map(bool,[caps,lower,nums])) - 1 #or sum(map(bool,r)) - 1
print('your password is {}'.format(scr[i_strength]))

説明:のそれぞれが非ゼロであるmap(bool,[caps,lower,nums])回数を累積します。caps,lower,numsそれらを合計するとsum、あなたの「強み」が得られます。これは、インデックスでアクセスできる便利なリストに既に入れられています。

これらの改善はすべて、Python の「偽性」の概念を活用しています。これは、ブール値コンテキストでのオブジェクトの値としても知られています。通常、空とゼロはFalseであり、ブール値を合計することは、1 と 0 を加算することと同じです。


もちろん、それらがゼロでないかどうかをチェックする以外に、上限/下限/数値のカウントで何もしていないようです。したがって、クリーンアップは単に

caps = any(c.isupper() for c in pw)
...

その後

i_strength = sum([caps,lower,nums]) -1
于 2013-10-25T21:40:35.660 に答える