Python berücksichtigt Argument nicht?
Hi, ich arbeite momentan aus Spaß an einem Passwort generator, welcher Klein-, Großbuchstaben und Zahlen enthalten soll. Die Argumente um Buchstaben zu erfassen werden berücksichtigt, die Zahlen werden ignoriert, allerdings finde ich da keinen Fehler :/
from operator import contains
import random
from random import randint
import string
from tkinter.messagebox import RETRY
##################################
length = int(input("Wie lang soll das Passwort sein? "))
times = int(input("Wie viele Passwörter willst du? "))
counter = 0
store = []
l = 0
while counter < times:
counter = counter + 1
chars=string.ascii_letters + string.digits
password = "".join(random.choice(chars) for password in range(length))
for i in password:
#Die Eckigen Klammern sind nötig, sonst wird gar kein Passwort angezeigt
if [string.ascii_uppercase and string.ascii_lowercase and string.digits in password] and password not in store:
store.append(password)
else:
l +=0
print(store)
2 Antworten
Die if expression wo das Kommentar steht ist bisschen komisch. Ich nehme an du willst überprüfen ob Groß, Klein Buchstaben und Zahlen im Password sind.
Die Expression gehört bisschen angepasst und ich empfehle dir noch Sonderzeichen hinzuzufügen.(/*()'$" usw.)
Aber dein Code gehört so geändert:
while counter < times:
counter = counter + 1
chars=string.ascii_letters + string.digits
password = "".join(random.choice(chars) for _ in range(length))
if any(p in string.ascii_uppercase for p in password) and any(p in string.ascii_lowercase) and any(p in string.digits for p in password) and password not in store:
store.append(password)
else:
l += 0
Dein If
if [string.ascii_uppercase and string.ascii_lowercase and string.digits in password] and password not in store:
string.ascii_uppercase evaluiert zu True
string.ascii_lowercase evaluiert auch zu True
string.digits in password ist False
True and True and False ist False
und das ganze in einem Array ist ein Array mit False also das: [False]. Jedoch ist das ganze in einem if True.
Die abfrage macht gar keinen sinn. Um Strings zu addieren kannst du ein + verwenden aber kein and. Die abfrage macht dann trotzdem keinen Sinn
string.ascii_uppercase + string.ascii_lowercase + string.digits
Im Endeffekt steht hier:
[False] and password not in store
Nvm, ich habe "p in" am anfang der Klammern rausgenommen und nun funktioniert alles :)
if any(p in string.ascii_uppercase for p in password) and any(p in string.ascii_lowercase) and any(p in string.digits for p in password) and password not in store:
jap, nachdem ich deine Zeile nochmal reingeschrieben hab, wurde das p erkannt und jetzt geht alles. Auch den Fehler, dass mein Counter nicht in der Schleife integriert war, sodass das passwort - wenns den Kriterien nicht entspricht - einfach nochmal generiert wird habe ich behoben. Vielen Dank :D
also wenn ich nur
for i in password:
if [string.digits in password]:
store.append(password)
mache
dann fällt dir auf das das egal was man da macht immer wahr ergibt . den [ ] scheint keine boolean true or false zu ergeben sondern irgendwas was immer wahr ist .
zweitens fällt mir auf
das du jeden buchstaben so testet i in password ? also jeden einzelnen buchstaben meinst du zu überprüfen ob der sowohl ein groß klein zahl ist . da zeig mir mal ein zeichen was sowohl groß als auch klein als auch eine zahl ist. also irgendwas stimmt in der logik doch nicht .
ähhh , das kann ja gar nichts werden , ergo [ ] führt halt zu gar nichts und ist immer wahr .
tip : lass dir doch mal [string.digits in password] ausgeben und guck was für ein wert rauskommt .
btw :
string.ascii_uppercase and string.ascii_lowercase and string.digits in password
verstehe ich noch weniger ??? and and in ?? du merkst aber schon das verketungen so nicht funktionieren . btw in keiner sprache
[string.digits in password] ist immer True weil jedes Array true ist, das mehr als 1 Element hat.
bool([1]) ist auch True weil das array nicht leer ist.
danke , ich programmier nie in python . gut das du das erklärt hast .
So macht das ganze schon wieder mehr Sinn, allerdings bekomme ich nun die Fehlermeldung, dass "p" nicht definiert wäre.