Seite 1 von 1

Passwort mit zufälliger Länge erstellen

Verfasst: Dienstag 15. November 2022, 09:37
von Marlene_studi
Hallo :)
Ich bin neu hier und wollte mal fragen ob mir vielleicht jemand bei meinem Problem helfen könnte. Ich muss bei meiner Hausübung für die Uni ein zufälliges Passwort mit 7 bis 10 Zeichen erstellen, welches zwischen den Positionen 33 und 126 aus ASCII Code. Ich habe es geschafft, dass ich beispielsweise ein Passwort mit 10 Zeichen erstelle, jedoch schaffe ich es einfach nicht, dass das Passwort zufällig eine Länge von 7 bis 10 Zeichen hat. Ich habe schon ewig lange im Internet recherchiert und mir Youtube-Videos angesehen, aber nirgends wird dieses Problem behandelt.
Ich hätte es dann einmal so versucht, aber das funktioniert ja auch nicht, da er gleich range(7) nimmt, da ja dies dann zutrifft.
Ich würde mich mega freuen, wenn mir hier jemand weiterhelfen könnte. :)

import random
result = ""
for i in range(7) or range(8) or range(9) or range(10):
i = chr(random.randint(33,126))
result = result + i
print(result)

print(f"Random Password: {result}")

Re: Passwort mit zufälliger Länge erstellen

Verfasst: Dienstag 15. November 2022, 09:59
von Dennis89
Hallo,

wieso verwendest du 'randint' nicht für dein 'range'?

Grüße
Dennis

Re: Passwort mit zufälliger Länge erstellen

Verfasst: Dienstag 15. November 2022, 10:27
von Kebap
Marlene_studi hat geschrieben: Dienstag 15. November 2022, 09:37 Ich habe schon ewig lange im Internet recherchiert und mir Youtube-Videos angesehen, aber nirgends wird dieses Problem behandelt.
Ja, so ist das bei den meisten Aufgaben. Es gibt viel mehr Probleme als Anleitungen. Es ist müßig zu hoffen, dass du zufällig eine passende Anleitung für genau dein Problem findest. Du musst also abstrahieren und selbst nachdenken, dein Wissen übertragen. Dazu hilft es bspw. dein Problem in kleinere Teile aufzutrennen...!

Du weißt schon, wie du ein zufälliges Zeichen aus einem gewissen Bereich erstellen kannst.
Kannst du auch eine Länge zufällig auswählen lassen, die im Bereich zwischen 7 und 10 landet?

So darf übrigens keine For-Schleife aussehen:

Code: Alles auswählen

for i in range(7) or range(8) or range(9) or range(10):

Re: Passwort mit zufälliger Länge erstellen

Verfasst: Dienstag 15. November 2022, 10:32
von __blackjack__
Und Du solltest Dich noch mal mit ``or`` beschäftigen. Das ist kein Wort mit einer umgangssprachlichen Bedeutung sondern ein binärer Operator mit einer festen Bedeutung, der zwei Operanden bekommt und die zu einem Ergebnis auswertet. Wie andere Operatoren wie +, *, -, /, … auch. Der Ausdruck, der hinter dem ``in`` steht, wird beispielsweise immer zum Ergebnis von ``range(7)`` ausgewertet, weil jedes ”nicht leere” `range()` als Wahrheitswert betrachtet ”wahr” ist. Jedes `range()` mit der Länge 0 ist ”unwahr”.

Code: Alles auswählen

In [177]: range(7)
Out[177]: range(0, 7)

In [178]: range(7) or range(8)
Out[178]: range(0, 7)

In [179]: bool(range(7))
Out[179]: True

In [180]: bool(range(0))
Out[180]: False

In [181]: range(0) or range(8)
Out[181]: range(0, 8)

In [182]: bool(range(23, 23))
Out[182]: False

In [183]: range(23, 23) or range(8)
Out[183]: range(0, 8)
Selbst wenn das mit dem ``or`` so ginge, ist unnötig aufwändig das `range()` da mehrfach hin zu schreiben, wo sich doch nur das Argument ändert.

Dein Code verwendet `i` zwei mal für ganz unterschiedliche Werte, was ziemlich verwirrend ist. Und für ein Zeichen ist `i` auch kein passender Name. Zudem muss man auch nicht jedes kleine Zwischenergebnis an einen eigenen Namen binden.

Der konventionelle Name für Variablen die absichtlich nicht verwendet werden, also beispielsweise wenn man eine Laufvariable bei einer ``for``-Schleife hat, die nur existiert um eine bestimmte Anzahl von Wiederholungen zu bekommen, ist `_`. Dann weiss der Leser gleich, dass es weder ein Programmierfehler noch unfertiger Code ist, wenn der Wert von dieser Variablen nie irgendwo verwendet wird.

Zwischenstand (mit der natürlich immer noch falschen Verwendung von ``or``):

Code: Alles auswählen

import random

result = ""
for _ in range(7 or 8 or 9 or 10):
    result += chr(random.randint(33, 126))

print(f"Random Password: {result}")
Wiederholtes ”addieren” von Zeichenketten in einer Schleife ist ein „code smell“, weil das in Programmiersprachen mit unveränderbaren Zeichenketten in der Regel ineffizient ist, da bei jedem Schritt immer mehr Daten im Speicher kopiert werden müssen, das also am Ende quadratische Laufzeit hat. Die „pythonische“ Lösung ist es die Teilzeichenketten in einer Liste zu sammeln oder einen Iterator/Generator zu erstellen, und am Ende dann die `join()`-Methode auf Zeichenketten zu verwenden um alles zu einer Zeichenkette zu verbinden:

Code: Alles auswählen

import random

result = "".join(
    chr(random.randint(33, 126)) for _ in range(7 or 8 or 9 or 10)
)

print(f"Random Password: {result}")