random Buchstaben in Python generieren?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
import random
print(''.join([chr(random.randrange(97, 123)) for _ in range(7)]))

oder

import random
import string

print(''.join([random.choice(string.ascii_letters.lower()) for _ in range(7)]))
Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf

Schachpapa  16.05.2021, 18:11

Die zweite Version ist schöner. Zum Passwörter generieren kann man den Zeichenvorrat vorgeben und die ähnlichen Buchstaben oO0 / 1ilI weglassen:

vorrat = "abcdefghjkmnpqrstuvw'
vorrat = vorrat + vorrat.upper() + "23456789"
pw = "".join([random.choice(vorrat) for _ in range(7)])
1
MrAmazing2  16.05.2021, 18:14
@Schachpapa

Stimmt, ja, auf alle Fälle ^^

Aber die erste ist kürzer und ein import weniger :P

0
Schachpapa  16.05.2021, 18:22
@MrAmazing2

Aber schwerer lesbar: chr(random.randrange(97,123)) zur Erzeugung eines zufälligen Kleinbuchstabens hat man entweder schon x-mal gemacht (und dann bestimmt nicht in Python) oder man muss es jedesmal nachschlagen.

choice(iterable) ist da mehr Pythonese

und "import string" benötigst du nur für "ascii_letters"

0
import random

random.seed()
chr='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
pwd="".join(random.sample(chr,7))

chr kann nach belieben definiert werden, insbesondere geht z.B. auch sowas:

chr="αβψδεφγηιξκλμνοπ;ρστθωςχζυ"
>>> "".join(random.sample(chr,7))
'γνξοπρη'

Alternativ auch:

"".join(random.choices(chr,k=7))

Nachteil bei diesem Ansatz ist aber einfach, daß es einfach nicht sicher genug ist.

Besser wäre (einem Beispiel aus der Python Doku folgend):

import string
import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))

Anstatt der Zeichengruppen aus string kann hier natürlich wieder ein eigener Zeichenvorrat verwendet werden.

------

Normalerweise würde ich ja sowas machen wie:

with open ('/dev/random','rb') as f:
    secret=f.read(7)

Und dann auf den Zeichenvorrat ummappen. Dank secrets module ist das aber glücklicherweise nicht mehr nötig, denn das bietet im Endeffekt das gleiche nur gewrapped, einfach zu nutzen und OS-unabhängig: secret.token_bytes()

from random import choice
def abc(klein=None) :
 '''Gibt das volständige Alphabet aus.
'''
 if klein is None :
  abc = [chr(i) for i in range(65, 123)]
  for Nr in range(6) :
   del abc[26]
  return abc[26:len(abc):]+ abc[:26:]
 if klein is True :
  return [chr(i) for i in range(97, 123)]
 if klein is False :
  return [chr(i) for i in range(65, 91)]

a = ''
for Nr in range(7) :
  a += choice(abc())
Woher ich das weiß:eigene Erfahrung

Zufallszahl generieren und auf Buchstaben mappen.

Woher ich das weiß:Studium / Ausbildung – Informatik