Mein erstes PythonProgramm: Wordlistgenerator

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
AkteXY
User
Beiträge: 1
Registriert: Sonntag 11. Juli 2004, 13:44
Kontaktdaten:

Habe heute mal mit Python angefangen, vorher programmierte ich TurboPascal, Delphi und QBasic (all das ist schon 1-2 Jahre her).
Mein erstes Programm ist ein Wordlistgenerator, der von einem bestimmten Zeichensatz, alle Möglichkeiten der Reihenfolge in einer bestimmten Anzahl von Zeichen ausgibt.
Hier ist der Source, habe noch net viel Ahnung; ein paar Tipps wären net. Vielleicht könnte mir einer sagen, wie man Python allg. von der Form her schreibt, quasi wo muss man am besten Zeile Platz lassen, wie weit muss man einrücken.
Schonmal Danke für Antworten.

Source:

Code: Alles auswählen

# wordlist.py: Generiert ne Wordliste ^^
# Die Ausgabe einfach in ne Datei Pipen: python ./wordlist.py > ./wordlist
import time
#Bei Zeichen, die Zeichen rein, die verwendet werden sollen.
Zeichen="abcdefghijklmnopqrstuvwxyz";
Zeichenlaenge=len(Zeichen);
# Folgenlaenge gibt an wie Lang die Zeichenfolge ist, quasi ändern wenn man ne andere will.
Folgenlaenge=5;
Folge = list() 
for c in range (Folgenlaenge):
	Folge.append(0)
Folge[0]=-1;
Wort="";
z=Zeichenlaenge;
for f in range (Folgenlaenge-1):
	z=z*(Zeichenlaenge)
for a in range (z+1):
		print Wort
		Folge[0]=Folge[0]+1
		for d in range (Folgenlaenge):	
			if Folge[d] >= Zeichenlaenge:
				Folge[d]=0
				if a != z:
					Folge[d+1]=Folge[d+1]+1
		Wort=""
		for b in range (Folgenlaenge):
			Wort=Wort+Zeichen[Folge[b]]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Gratuliere zu deinem ersten Python-Programm :wink:

Mir sind sofort die ; an manchen Zeilenenden aufgefallen. In Python braucht man die nicht.

Code: Alles auswählen

Folge = list() 
Eine leere Liste kannst Du auch so erstellen:

Code: Alles auswählen

Folge = []
AkteXY hat geschrieben: Vielleicht könnte mir einer sagen, wie man Python allg. von der Form her schreibt, quasi wo muss man am besten Zeile Platz lassen, wie weit muss man einrücken.
Ich würde sagen das ist Geschmackssache. Die Einrückung sollte man aber schon einheitlich gestalten, also nicht so

Code: Alles auswählen

for f in range (Folgenlaenge-1):
   z=z*(Zeichenlaenge)    # <- 3 Zeichen
for a in range (z+1):
      print Wort          # <- 7 Zeichen (wenn ich richtig gezählt hab)
Naja, das wars fürs erste. Viel Spaß noch :D

Gruß, mawe
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi nochmal!
AkteXY hat geschrieben: wie man Python allg. von der Form her schreibt, quasi wo muss man am besten Zeile Platz lassen, wie weit muss man einrücken.
Wenn Du's wirklich genau wissen willst, hier gibts einen Style-Guide :wink:

Gruß, mawe
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi AkteXY,

Ich hab auch mal auf die schnelle einen Wordlistgenerator gemacht.

Code: Alles auswählen

#!/usr/bin/env python
# wordlist.py: Generiert ne Wordliste ^^
# Die Ausgabe einfach in ne Datei Pipen: python ./wordlist.py > ./wordlist 

def wordliste(zeichen="abcdefghijklmnopqrstuvwxyz", laenge=5):
    """ Generator fuer Wortlisten """
    
    zlen = len(zeichen) # Anzahl Zeichen 
    liste = [0]*laenge  # Liste Initialisieren
    weiter = True       # Flag
    
    while weiter:
        wort = "".join([zeichen[x] for x in liste]) # Wort zusammenbauen
        yield wort # und ausspucken
        
        # nach jedem Wort wird hier weitergemacht
        liste[0] += 1 # Erste Stelle eins weiter

        n = 0        
        while liste[n] >= zlen: # Ueberlauf der nten Stelle
            liste[n] = 0        # nte Stelle auf erstes Zeichen
            n += 1              # n um eins weiter
            if n < laenge:      # noch Stellen da ?
                liste[n] += 1   # nte Stelle eins weiter
            else:
                weiter = False  # sonst fertig
                break           # innere Schleife verlassen
                 

if __name__ == "__main__": # Script direkt gestartet (nicht importiert)
    for w in wordliste(zeichen="abcd", laenge=4):
        print w
Die erste Zeile #!/usr/bin/env python erlaubt es unter Unix/Linux das Script ausführbar zu machen chmod +x wordlist.py und gibt der Bash an welcher Interpreter für das Script zuständig ist. Dann kann es direkt mit ...$ ./wortlist.py >./wortliste.txt gestartet werden


Gruß

Dookie
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hallo nochmal,

hier eine Version die voll auf Iteratoren aufgebaut ist.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

def combine(zeichen="abcdefghijklmnopqrstuvwxyz", laenge=5):
    iters = [iter(zeichen) for i in xrange(laenge)] # Liste mit Iteratoren
    liste = [it.next() for it in iters]             # Liste mit Zeichen
    while True:
        yield "".join(liste) # Wort zusammenstellen und auswerfen
        for n in xrange(laenge): # Stellen weiterschalten
            try:
                liste[n] = iters[n].next()
                break # alles OK, kein Ueberlauf, naechstes Wort bereit
            except StopIteration: # Ueberlauf
                iters[n] = iter(zeichen)   # Iterator zuruecksetzen
                liste[n] = iters[n].next() # Stelle zuruecksetzen
                continue # weiter mit naechster Stelle
        else: # alle Stellen hatten einen Ueberlauf
            raise StopIteration # Stop, alle Kombinationen sind durch 


if __name__ == "__main__":
    print u"Dezimal\t\tBinär"
    for wort in combine("01", 4):
        reverse = wort[::-1]
        print "% 3i\t\t%s" % (int(reverse,2), reverse)
Gruß

Dookie
Antworten