Am I programming in Python mode?
Mordy Ovits
movits at lockstar.com
Wed Feb 2 10:29:38 EST 2000
Michael Hudson wrote:
>
> Anders M Eriksson <anders.eriksson at morateknikutveckling.se> writes:
>
> > Hello!
> >
> > Being new to Python I would like your comments on this function. Is it
> > written in Pytnon mode?
>
> Only you can tell if it was written in Python mode ('round here Python
> mode usually refers to the emacs major mode for Python). I can try and
> help with style, which is what I'm fairly sure you meant.
>
> > The function returns a random string, and have 3 params the lenght of
> > the string, lowercase/Uppercase and dublicates
> >
> > Any comments and/or suggestions are welcome!!
> >
> > // Anders
> >
> >
> >
> > def randStr(n, lower=1, dublicates=1):
> > # returns a random string with <n> characters
> > # lower if true only lowercase letters
> > # dublicates if true then the same letter can be repeated
>
> This bit could (should) be in a docstring, not a comment.
>
> > if lower:
> > l = ord('a')
> > h = ord('z')
> > else:
> > l = ord('A')
> > h = ord('z')
>
> Hmm, does this actually work? ASCII goes like:
>
> .... STUVWXYZ[\]^_`abcdefghijk ...
>
> so the above will get strings containing [\]^_` characters.
>
> > str = ""
> > generator = whrandom.whrandom()
>
> Why do you want your on generator?
>
> > for i in range (n):
> > ch = generator.randint(l,h)
> > if dublicates:
> > str = str + chr(ch)
>
> It's probably better to accumulate substrings into a list and use
> string.join to stick them together. This is particularly true in the
> single character case, 'cause they're cached.
>
> > else:
> > bRepeat = 1
> > while bRepeat:
> > if not chr(ch) in str:
> > str = str + chr(ch)
> > bRepeat = 0
> > else:
> > ch = generator.randint(l,h)
> >
> >
> > return str
>
> You do know about random.choice don't you? It selects a random item
> from a sequnce - and strings are sequences.
>
> So if I were doing this I'd do it like this:
>
> import random,string
>
> def randStr(n,lower=1,duplicates=1):
> """ randStr(n:Integer[,lower,duplicates]) -> String
>
> Generate a random string of length n.
> If |lower| is true (the default), only lowercase letters will be used.
> If |duplicates| is true (the default), the string may contain duplicates. """
> if lower:
> choices = 'abcdefghijklmnopqrstuvwxyz'
> else:
> choices = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
> result = []
> if not duplicates and n > len(choices):
> raise ValueError, "n too large"
> for i in range(n):
> while 1:
> ch = random.choice(choices)
> if duplicates or ch not in result:
> result.append( ch )
> break
> return string.join(result,'')
>
> This probably isn't perfect, but I hope in helps.
>
> Cheers,
> Michael
See string.lowercase, string.uppercase and string.letters
As in:
for i in range(0, n):
string.append(random.choice(string.letters))
Mordy
--
o Mordy Ovits
o Cryptographic Engineer
o LockStar, Inc.
--
There are two kinds of fool; One who says "This is old
and therefore bad," and one who says "This is new and
therefore better." -- John Brunner
More information about the Python-list
mailing list