HiveBrain v1.2.0
Get Started
← Back to all entries
snippetpythonMinor

Simple function to generate a list of letters

Submitted by: @import:stackexchange-codereview··
0
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.

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 letters

Solution

Some notes on your code:

  • 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 use random.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.