Seite 1 von 1

Modul Randstr

Verfasst: Donnerstag 13. März 2003, 16:00
von Gast
Hi @ll!

Mich hats einfach generft, dass Random keine zufälligen Strigzeichen ausgeben kann. Deswegen hab ich nen Modul dafür geschrieben.
Is zwar nen bischen einfach geschrieben, erfüllt aber seine Funktion.
Es hiflt, wenn ihr z.B. Bruteforcedictionarys erstellen wollt *hack*:twisted:

Hier ist der Code:

Code: Alles auswählen


from random import*

class randomize:
    def __init__(self):        
        
        self.alls=['!','"','#','$','%','&',"'",'(',')','*','+',',','-',\
                   '.','/','0','1','2','3','4','5','6','7','8','9',':',\
                   ';','<','=','>','?','@','A','B','C','D','E','F','G',\
                   'H','I','J','K','L','M','N','O','P','Q','R','S','T',\
                   'U','V','W','X','Y','Z','[','\\',']','^','_','`','a',\
                   'b','c','d','e','f','g','h','i','j','k','l','m','n',\
                   'o','p','q','r','s','t','u','v','w','x','y','z','{',\
                   '|', '}', '~', '']
        
        self.bigs=['A','B','C','D','E','F','G','H','I','J','K','L','M',\
                   'N','O','P','Q','R','S','T','U','V','W','X','Y','Z']

        self.lits=['a','b','c','d','e','f','g','h','i','j','k','l','m',\
                   'n','o','p','q','r','s','t','u','v','w','x','y','z']

        self.sond=['!','"','#','$','%','&',"'",'(',')','*','+',',','-',\
                   '.','/',':',';','<','=','>','?','@','[','\\',']','^',\
                   '_','`','{','|', '}', '~', '']

        self.zahl=['0','1','2','3','4','5','6','7','8','9']

        
    def str_bigs(self, von, bis):
        '''Startvalue(min=0; max=24) and Endvalue (min=1; max=25)'''

        try:
            self.start = von
            self.end   = bis
        
            self.a=randint(self.start,self.end)
        
            return self.bigs[self.a]

        except:
            return 'Error in randstr.str_bigs'

    def str_lits(self, von, bis):
        '''Startvalue(min=0; max=24) and Endvalue (min=1; max=25)'''

        try:
            self.start = von
            self.end   = bis
        
            self.a=randint(self.start,self.end)

            return self.lits[self.a]

        except:
            return 'Error in randstr.str_lits'

    def str_alls(self, von, bis):
        '''Startvalue(min=0; max=93) and Endvalue (min=1; max=94)'''

        try:
            self.start = von
            self.end   = bis
        
            self.a=randint(self.start,self.end)

            return self.alls[self.a]

        except:
            return 'Error in randstr.str_alls'

    def str_sond(self, von, bis):
        '''Startvalue(min=0; max=31) and Endvalue (min=1; max=32)'''

        try:
            self.start = von
            self.end   = bis
        
            self.a=randint(self.start,self.end)

            return self.sond[self.a]
        
        except:
            return 'Error in randstr.str_sond'






randstr=randomize()
MFG,
Floh*

Re: Modul Randstr

Verfasst: Donnerstag 13. März 2003, 16:44
von Voges
Anonymous hat geschrieben:Mich hats einfach generft, dass Random keine zufälligen Strigzeichen ausgeben kann.
choice() übersehen?

Code: Alles auswählen

    def str_sond(self, von, bis):
        '''Startvalue(min=0; max=31) and Endvalue (min=1; max=32)'''

        try:
            return choice('!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'[von:bis])            
        except:
            return 'Error in randstr.str_sond'
Jan

Verfasst: Donnerstag 13. März 2003, 17:11
von Dookie
Hi Voges,

Code: Alles auswählen

>>> choice('!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~?'[:])
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'choice' is not defined
>>>
Python 2.1 und 2.2 selbes ergebnis

ich hab für ein ähnliches Problem mal ein Modul geschrieben

Code: Alles auswählen

#!/usr/bin/env python
""" 
    rndList.py
    erzeugt Zufallszahlenreihen und durchmischte
    Listen/Tuples/Strings

    (c) 2002 by Fritz Cizmarov, Opensource
"""
import sys, random, types
_minint = -sys.maxint-1

def randList(num, min=0, max=_minint, func=random.randrange, data=1):
    """ erzeuge Liste mit "num" Integerwerten zwischen
    "min" und "max-1", wobei jeder Wert nur einmal vokommen
    darf! Zusätzlich kann noch eine random-Funktion "func", der beim
    Aufruf ausser "min" und "max" noch "data" mitgegeben wird angegeben
    werden. """
    
    if max == _minint: # wenn "max" nich angegeben wurde
        max = min + num
        
    assert num > 0, 'Parameter "num" muß >= 1 sein!' 
    assert (max-min)/data >= num, "Wertebereich zu klein!"
    
    values = range(min,max) # Werteliste
    erg = [] # Ergebnisliste
    for i in range(num):
        r = func(0, len(values), data)
        erg.append(values[r]) # Wert aus Werteliste hinzufügen
        del values[r] # Wert aus Werteliste löschen
    return erg


def shuffle(data):
    """ erzeuge Kopie der Liste bzw. des Tuple "data" deren Elemente
    durcheinandergemischt sind. Geht auch mit Strings """
    erg = []
    for i in randList(len(data)): # Liste zufällig durchlaufen
        erg.append(data[i]) # zufälliges Item aus Liste an Ergebnis anhängen

    if isinstance(data, types.TupleType):
        erg = tuple(erg)
    elif isinstance(data, types.StringType):
        if erg == []:
            erg = ""
        else:
            erg = reduce(lambda x, y: x+y, erg)
    return erg


# Demonstration der Funktionen

if __name__ == '__main__':
    print "Teste rndList.randList"
    print "randList(6, 1, 50) ->", randList(6, 1, 50)
    print "randList(10, 1) ->", randList(10, 1)
    print "randList(16) ->", randList(16)
    print
    print "Teste rndList.shuffle"
    myListe = ['eins', 'zwei', 'drei', 'vier']
    print "myListe =", myListe
    print "rndList.shuffle(myListe) ->", shuffle(myListe)
    print
    print "Geht natürlich auch mit einem Tuple"
    myTuple = ('alpha', 'beta', 'gamma', 'delta', 'omega')
    print "myTuple =", myTuple
    print "rndList.shuffle(myTuple) ->", shuffle(myTuple)
    print
    print "Und auch mit Strings"
    myString = "abcdefghijklmnopqrstuvwxyz"
    print "myString =", myString
    print "rndList.shuffle(myString) ->", shuffle(myString)
    myString = "Python"
    print "myString =", myString
    print "rndList.shuffle(myString) ->", shuffle(myString)
Gruß

Dookie

Verfasst: Donnerstag 13. März 2003, 17:26
von Voges
Hallo!
Dookie hat geschrieben:

Code: Alles auswählen

>>> choice('!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~?'[:])
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'choice' is not defined
>>>
Python 2.1 und 2.2 selbes ergebnis
Mein Code sollte lediglich Flo*s Code für str_sond() ersetzen. Ich wollte nicht seinen gesamten Code inkl. from random import* wiederholen. random.choice() gab es schon bei Version 1.5.2.

Jan

Verfasst: Donnerstag 13. März 2003, 18:53
von Gast
uups stimmt :oops:

from random import * davor und schon gehts :)


Gruß

Dookie

Oops

Verfasst: Sonntag 16. März 2003, 11:26
von Pythonaya
Son mist,
hab grad gesehn, dass ich mich garnicht eingeloggt habe, als ich das Modul oben vorgestellt habe. :oops:
Danke für die Tips, bzw. Verbesserungsvorschläge!
Mein Browser spinnt im Moment ein bischen, er loggt sich nicht selbst ein.
Manchmal vergesse ich das. :?

MFG,
Flo

Re: Modul Randstr

Verfasst: Sonntag 16. März 2003, 13:43
von joerg
Hallo,
dann gebe ich mal auch noch meinen Senf ab, um das Modul noch etwas zu vereinfachen:

Im Modul string sind folgende Sachen definiert: uppercase, lowercase, digits und punctuation, jeweils Strings, die alle entsprechenden Symbole beinhalten. Verwendet man die, spart man sich die explizite Aufzählung in __init__, das sieht viel übersichtlicher aus.

Jörg

Hä?

Verfasst: Sonntag 16. März 2003, 14:52
von Pythonaya
Say what?
Kannst du mir nen Beispiel geben??? :?

MFG,
Floh*

Re: Modul Randstr

Verfasst: Sonntag 16. März 2003, 15:05
von Voges
Hallo Joerg!
Und dann hat man verdrängt, dass man irgendwann vorher das Modul locale genutzt hat.

Code: Alles auswählen

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
>>> print string.letters
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzƒŠŒŽšœžŸÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ
>>> 
Nee, ein episches random.choice("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") ist mir dann doch sympathischer.;-)
Jan

Re: Hä?

Verfasst: Sonntag 16. März 2003, 16:03
von Gast
Pythonaya hat geschrieben:Say what?
Kannst du mir nen Beispiel geben??? :?

Code: Alles auswählen

import string, random
print random.choice(string.uppercase)
sollte Dir einen zufälligen Großbuchstaben geben, da string.uppercase alle Großbuchstaben enthält, so wie string.lowercase alle kleinen, string.punctuation alle 'Sonderzeichen' und string.digits alle Ziffern.

ABER: Wie Jan bemerkte, enthalten diese Strings je nach Locale auch noch viel mehr, weshalb Du vielleicht lieber doch die entsprechenden Zeichen von Hand aufzählen möchtest...

Jörg

Re: Hä?

Verfasst: Montag 17. März 2003, 22:42
von Voges
Anonymous hat geschrieben:ABER: Wie Jan bemerkte, enthalten diese Strings je nach Locale auch noch viel mehr, weshalb Du vielleicht lieber doch die entsprechenden Zeichen von Hand aufzählen möchtest...
Und was finde ich eben beim Rumstöbern? Seit der Version 2.2 gibt es die string-Konstanten ascii_letters, ascii_lowercase und ascii_uppercase.

Code: Alles auswählen

>>> import locale,string
>>> locale.setlocale(locale.LC_ALL, '')
'German_Germany.1252'
>>> print string.letters
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzƒŠŒŽšœžŸÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ
>>> print string.ascii_letters
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
>>>
Jan