Zahlen im for loop in einer variable speichern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kaaniboy68
User
Beiträge: 2
Registriert: Sonntag 15. September 2019, 16:22

Sonntag 15. September 2019, 16:28

Ich würde gerne einen Passwort-Genrator programieren. (erstmal nur mit Zahlen, bin Anfänger)
Momentan erzeuge ich zufällige Zahlen, aber wie speichere ich sie "nacheinander" in einer Variable? Sprich ich generiere 3 Zahlen (z.B 3, 4, 5). Wie kann ich sie in eine Variable speichern die mir dann die Zahl 345 ausgibt?

Momentaner Code:

from random import *

password = ""

password_length = int(input("password length?: ")) + 1


def randomNumber():
for i in range(1, password_length):
password = i
print(password)


randomNumber()



LG Kaan
nezzcarth
User
Beiträge: 766
Registriert: Samstag 16. April 2011, 12:47

Sonntag 15. September 2019, 17:32

Das gibt es mehrere Möglichkeiten. Zum Beispiel nimmt man eine Liste, an die man die Elemente anhängt. Am Schluss fügt man sie zu einer Zeichenkette zusammen. Mit List Comprehensions geht das in einer Zeile. Wenn das Passwort nur aus Zahlen bestehen soll und man eine Zahl erhalten möchte, kann man diese auch arithmetisch zusammenbauen (oder den String in einen Integer verwandeln).

Code: Alles auswählen

In [1]: from random import randint                                                                                                                            

In [2]: def random_digit_password(length=10): 
   ...:     return ''.join(str(randint(0, 9)) for _ in range(length)) 
   ...:                                                                                                                                                       

In [3]: random_digit_password(6)                                                                                                                              
Out[3]: '361428'

In [4]: def random_digit_password_2(length=10): 
   ...:     result = 0 
   ...:     for i in range(length, 0, -1): 
   ...:         j = randint(0, 9) 
   ...:         result += 10**(i-1) * j 
   ...:     return result 
   ...:                                                                                                                                                       

In [5]: random_digit_password_2(12)                                                                                                                           
Out[5]: 353564432268
Und wenn man es etwas flexibler haben möchte, geht zum Beispiel folgendes:

Code: Alles auswählen

In [1]: from random import choice                                                                                                                             

In [2]: from string import digits , ascii_lowercase                                                                                                                        

In [3]: def random_password(length=10, symbols=digits): 
   ...:     return ''.join(choice(symbols) for _ in range(length)) 
   ...:                                                                                                                                                       

In [4]: random_password(4)                                                                                                                                    
Out[4]: '5433'

In [5]: random_password(6, ascii_lowercase)                                                                                                                   
Out[5]: 'vhmsms'
kaaniboy68
User
Beiträge: 2
Registriert: Sonntag 15. September 2019, 16:22

Sonntag 15. September 2019, 20:15

Ersteinmal danke für deine Antwort.

Wenn ich deinen Code einfüge und ausführe, erscheint nichts in meiner Konsole.

Des Weiteren verstehe ich diese Zeile Code nicht "return ''.join(choice(symbols) for _ in range(length))"

LG Kaan
Sirius3
User
Beiträge: 10585
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 15. September 2019, 20:16

`str.join` fügt die Elemente eines iterierbaren Objekts zu einem String zusammen. Und die for-Schleife generiert einen solchen Iterator, genannt Generator.

Wenn man `choices` nimmt, braucht man auch keine for-Schleife:

Code: Alles auswählen

from random import choices
from string import digits

def random_password(length=10, symbols=digits):
    return ''.join(choices(symbols, k=length))
nezzcarth
User
Beiträge: 766
Registriert: Samstag 16. April 2011, 12:47

Sonntag 15. September 2019, 20:47

kaaniboy68 hat geschrieben:
Sonntag 15. September 2019, 20:15
Wenn ich deinen Code einfüge und ausführe, erscheint nichts in meiner Konsole.
Na ja, Funktionen für sich genommen machen ja auch nichts. Du musst sie ausführen. Sirius 3 hat den Rest ja schon weitgehend erklärt. Den Unterstrich nimmt man in Python für Variablen, die syntaktisch notwendig sind, die man aber nicht verwendet.

(Zur Sicherheit sollte ich auch noch mal erwähnen, dass die mittlere Variante, die einen Integer zurück gibt, natürlich keine führende Null erlaubt; wenn das gewünscht ist, muss es zwangsläufig ein String sein.)
Sirius3
User
Beiträge: 10585
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 15. September 2019, 20:54

Wenn man einfach nur eine n-stellige Zufallszahl will, geht das auch einfacher:

Code: Alles auswählen

f'{randrange(10**n):0{n}}'
Antworten