Python buena práctica de progtwigción para enumerar listas

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

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 sentencia if se ha vuelto muy larga. ¿Se considera buena progtwigción? Si no lo es, ¿hay una mejor manera de codificar esta función?

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

 if i.upper() in "AEIOU" 

Aquí hay una versión mucho más corta de su función utilizando listas de comprensión:

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

Probablemente sería mejor usar sets:

 VOWELS = set('aeiouAUIOU') def get_vowels(word): return [c for c in word if c in VOWELS] 

o, más geeky:

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

(Pero el primer enfoque es más legible y, como tal, es más pythonico. Además, la segunda función devolverá el generador, 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 

El if es el mismo que:

 if i in "aeiouAEIOU" 

Básicamente estás buscando miembros en un conjunto.

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

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

ya que Python te permite usar el operador “in” para buscar una cadena dentro de otra.

Pero Python también permite listas de comprensión, que simplifican los bucles:

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

Me gusta:

 set('aeiouAUIOU') & set(word)