Kann dieser Code verkürzt oder verbessert werden? [abgeschlossen]

Kann das verkürzt / verbessert werden? Ich versuche, ein Passwort-Checker in Python zu machen.

Könnte das if in eine for-Schleife gestellt werden? Und wenn ja, wie?

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]) 

Vielen Dank für alle Vorschläge: D

  • Die Eingabe der Befehlszeile in Python
  • Django: eingebaute Passwort-Reset-Ansichten
  • Python, Erzeugen eines starken Passworts - Entfernen von Symbolen aus der ASCII-Tabelle
  • Kennwort in Python erzeugen
  • Machen Sie Python-Kennwort eingeben, wenn Sie ein CSS-Skript ausführen
  • Wie öffne ich eine passwortgeschützte Excel-Datei mit python?
  • 3 Solutions collect form web for “Kann dieser Code verkürzt oder verbessert werden? [abgeschlossen]”

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

    kann sein:

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

     if caps >= 1: 

    kann sein:

     if caps: 

    Die wichtigste Verbesserung: Der Boden, if / elif Block kann vollständig entfernt werden, indem Sie tun

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

    Erläuterung: map(bool,[caps,lower,nums]) akkumuliert, wie oft jede der caps,lower,nums ist ungleich Null. Sie addieren sie mit sum gibt Ihnen Ihre "Stärke", die Sie bequem bereits in eine Liste gesetzt haben, die durch Index zugegriffen werden kann.

    Alle diese Verbesserungen nutzen den Begriff der "Falschheit" in Python, sonst bekannt als Wert eines Objekts in einem booleschen Kontext. Im Allgemeinen leer und null sind die Dinge False , und das Summieren von Booleans ist gleichbedeutend mit Hinzufügen von Hindernissen und Nullen, also gehst du hin.


    Natürlich scheint es nicht, dass du irgendetwas mit den Zählungen von Ober- / Unter- / Untertanen tust, außer wenn du es nimmst. Also eine Aufräumung wäre einfach so

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

    und dann

     i_strength = sum([caps,lower,nums]) -1 

    Ich würde die verschachtelte if-Anweisung beheben.

     scr = ['weak', 'medium', 'strong'] # if you want to keep this fine # but I suggest you do something like this: _WEAK = scr[0] _MEDIUM = scr[1] _STRONG = scr[2] if caps >= 1 and lower >= 1 and nums >= 1: print(_STRONG) elif caps < 1: print("your password strength is " + _MEDIUM) elif lower < 1: print("your password strength is " + _WEAK) elif nums < 1: print("your password is " + _MEDIUM) 

    Ich werde die allgemeine Frage ignorieren, "kann dieser Code verkürzt oder verbessert werden", denn das ist eine Frage für Code Review . Aber du hast auch hier eine konkrete Frage:

    Könnte das if in eine for-Schleife gestellt werden? Und wenn ja, wie?

    Sie könnten, aber Sie müssten sie in etwas, das in einen Iterator gesetzt werden kann, wie Funktionen, und ich glaube wirklich nicht, dass Sie in diesem Fall wollen.

    Lassen Sie uns mit einem einfacheren Beispiel beginnen, mit nur einer linearen Reihe von Schecks:

     checks = [ ((lambda caps, lower, num: caps >= 1 and lower >= 1 and nums >= 1), 2), ((lambda caps, lower, num: caps < 1), 1), ((lambda caps, lower, num: lower < 1), 0), ((lambda caps, lower, num: num < 1), 1) ] for check, value in checks: if check(caps, lower, num): print('your password strength is ' + scr[value]) break 

    Sie könnten stattdessen die Prüfbedingungen in irgendeiner codierten Datenform setzen und die if check(…) durch eine datengesteuerte Überprüfung der Bedingungen ersetzen. Beispielsweise:

     checks = [ ((1, 1, 1), 2), ((-1, 0, 0), 1), ((0, -1, 0), 0), ((0, 0, -1), 1) ] for check, value in checks: for value, condition in zip((caps, lower, num), check): if condition == -1 and value >= 1 or condition == 1 and value < 1: break else: print('your password strength is ' + scr[value]) break 

    Aber ich denke, das ist noch weniger lesbar. Es gibt viele Anwendungsfälle, in denen diese Art von Dingen Sinn macht – zB stellen Sie sich vor, Sie wollten 40 Polynome für jeden Wert von x auswerten; Sie speichern jedes Polynom als eine Liste von Koeffizienten, und haben generische "Auswertung Polynom" Logik wie folgt. Aber das ist nicht einer dieser Fälle.

    So oder so, das ist schon ziemlich hässlich. Und wenn du verschachtelte Schecks wünschst, wirst du eine verschachtelte Struktur brauchen, die du vermutlich rekursiv verarbeiten willst.

    Python ist die beste Programmiersprache der Welt.