2012-04-07 7 views
17

Soy bastante nuevo en Python y la programación en general, y me preguntaba si es una buena práctica de programación escribir sentencias largas con muchos operadores lógicos, por ejemplo, en un bucle for.Python buena práctica de programación para enumerar listas

Por ejemplo, aquí hay una función que hice que obtiene todas las vocales de una palabra y devuelve una lista que contiene esas vocales.

def getVowels(word): 
    vowel_list = [] 
    index = 0 
    for i in word: 
     if i == "a" or i == "e" or i == "i" or i == "o" or i == "u" or i == "A" or i == "E" or i == "I" or i == "O" or i == "U": 
      vowel_list.append(word[index]) 
     index += 1 
    return vowel_list 

Como puede ver, la instrucción if ha sido muy larga. ¿Se considera una buena programación? Si no es así, ¿hay una mejor manera de codificar esta función?

+1

Debe utilizar [ 'enumerate'] (http: //docs.python.org/library/functions.html#enumerate) en lugar de un contador. – agf

+0

Esta es una buena pregunta. Asegúrese de aceptar una respuesta en los próximos días. – Marcin

Respuesta

34

No, no se considera una buena práctica, siempre hay mejores formas: D

if i.upper() in "AEIOU" 

Aquí está una versión mucho más corta de su función usando listas por comprensión:

def get_vowels(word): 
    vowels = "AEIOU" 
    return [c for c in word if c.upper() in vowels] 
+0

Gracias. No sabía que también podía usar "in" para cadenas, pensé que solo podía usarlo para las listas. Pero como las cuerdas se comportan casi igual que las listas, debería haberlo sabido .d Gracias a todos. – geekkid

+1

Sí, hay muchos accesos directos: D – jamylak

+3

@geekkid La capacidad de comprimir el código hasta esta respuesta es más o menos lo que significa python: realmente permite una codificación concisa y no repetitiva. – Marcin

1

El if es el Lo mismo que:

if i in "aeiouAEIOU" 

Básicamente está buscando miembro en un conjunto.

+0

@agf Son equivalentes si suponemos que 'word' es una cadena –

1

Creo que las declaraciones largas son más difíciles de entender que las breves. Casi siempre hay una manera de hacer lo mismo con declaraciones más cortas. En su caso, se puede simplificar el caso de la siguiente manera:

def getVowels(word): 
    vowel_list = [] 
    for i in word: 
     if i in "aeiouAEIOU": 
      vowel_list.append(i) 
    return vowel_list 

desde Python le permite usar el operador "in" para buscar una cadena dentro de otra.

Pero Python también permite que las listas por comprensión, que simplifican bucles:

def getVowels(word): 
    return [i for i in word if i in "aeiouAEIOU"] 
4

probablemente sería mejor utilizar conjuntos:

VOWELS = set('aeiouAUIOU') 

def get_vowels(word): 
    return [c for c in word if c in VOWELS] 

o, más geek:

def get_vowels(word): 
    return filter(VOWELS.__contains__, word) 

(Pero el primer enfoque es más legible y, como tal, es más pitónico. Además, la segunda función devolverá r, no una lista en Python 3.)

EDITAR comparación de rendimiento de c in list vs c in set:

import timeit 

VOWELS = 'aeiouAEIOU' 
VOWSET = set(VOWELS) 
SAMPLE = 'asflasrjoperugASDFAROUAoarfpeoriugargagadropgue' 

def get_vowels(word, vowels): 
    return [c for c in word if c in vowels] 

print timeit.timeit('get_vowels(SAMPLE, VOWELS)', 
        'from __main__ import VOWELS, SAMPLE, get_vowels') 
#^prints 10.0739870071 
print timeit.timeit('get_vowels(SAMPLE, VOWSET)', 
        'from __main__ import VOWSET, SAMPLE, get_vowels') 
#^prints 9.43965697289 
+1

Su última función no produce las vocales en la palabra, simplemente dice' True' o 'False' – jamylak

+0

@jamylak oh, qué vergüenza. Gracias, quitando. – bereal

+0

¿El uso de juegos lo hace más rápido? Porque VOWELS = 'aeiouAUIOU' también funciona. – Akavall

1

igual:

set('aeiouAUIOU') & set(word) 
+0

Ooh, bonito ... Excepto que codifica las letras y no conserva los duplicados. –

+0

Sí, y sí, pero es demasiado lindo como para perderlo. –

Cuestiones relacionadas