snippetpythonMinor
Simple function to generate a list of letters
Viewed 0 times
simplefunctiongeneratelistletters
Problem
I would like get some suggestions for improvement of this function, and alert me about any dodgy practices that you find.
I have been trying to learn python for a short time now and I would like to get some pointers on writing more pythonic code before I develop bad habits.
I have been trying to learn python for a short time now and I would like to get some pointers on writing more pythonic code before I develop bad habits.
from string import ascii_uppercase, ascii_lowercase
from random import choice
def get_letters(case, n, random = False):
"""
A function to generate a list of letters
PARAMETERS
----------------------
case (str) - type of case, 'u' for uppercase, 'l' for lowercase
n (int) - number of letters to return
random (bool) - specify if letters should be in random order
RETURNS
----------------------
if case is 'u', returns a list of uppercase letters
if case is 'l', returns a list of lowercase letters
if random = True a list of random letters will be returned (default is false)
"""
case = case.lower()
if random:
if case == 'u':
letters = [choice(ascii_uppercase) for i in range(n)]
else:
if case == 'l':
letters= [choice(ascii_lowercase) for i in range(n)]
else:
if case == 'u':
letters = [ascii_uppercase[i] for i in range(n)]
else:
if case == 'l':
letters= [ascii_lowercase[i] for i in range(n)]
return lettersSolution
Some notes on your code:
I'd write:
def f(arg = False)->def f(arg=False)(PEP8)
case = case.lower()Usually it's not a good idea to reuse variables: new values, new variable names.
else+ indent +if=elif
- Use
(true_value if condition else false_value)for short conditional expressions.
ascii_uppercase[i] for i in range(n). This will fail if n is greater than the size of letters.
[choice(alphabet) for i in range(n)]. This repeats characters, is that ok? It seems more fitting to userandom.sample(alphabet, n), which does not repeat elements.
case: It's not idiomatic to send strings this way. Use a boolean argument instead (as @oliverpool proposed).
I'd write:
from random import sample
from string import ascii_uppercase, ascii_lowercase
def get_letters(n, random=False, uppercase=False):
"""Return n letters of the alphabet."""
letters = (ascii_uppercase if uppercase else ascii_lowercase)
return (sample(letters, n) if random else list(letters[:n]))Code Snippets
from random import sample
from string import ascii_uppercase, ascii_lowercase
def get_letters(n, random=False, uppercase=False):
"""Return n letters of the alphabet."""
letters = (ascii_uppercase if uppercase else ascii_lowercase)
return (sample(letters, n) if random else list(letters[:n]))Context
StackExchange Code Review Q#121652, answer score: 3
Revisions (0)
No revisions yet.