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}")