Хорошая практика программирования Python для перечисления списков

17

Я довольно новичок в Python и программировании в целом, и мне было интересно, является ли хорошей практикой программирования писать длинные операторы со многими логическими операторами - например, в цикле for.

Например, вот функция, которую я создал, которая получает все гласные от слова и возвращает список, содержащий эти гласные.

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

Как вы можете видеть, оператор if получил очень много времени. Это считается хорошим программированием? Если это не так, есть ли лучший способ кодировать эту функцию?     

задан geekkid 07.04.2012 в 15:51
источник

5 ответов

34

Нет, это не считается хорошей практикой, всегда есть лучшие способы: D

if i.upper() in "AEIOU"

Ниже представлена ​​более короткая версия вашей функции с использованием списков:

def get_vowels(word):
    vowels = "AEIOU"
    return [c for c in word if c.upper() in vowels]
    
ответ дан jamylak 07.04.2012 в 15:54
источник
4

Вероятно, лучше использовать наборы:

VOWELS = set('aeiouAUIOU')

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

или, более geeky:

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

(Но первый подход является наиболее читаемым и, как таковой, более pythonic.Кроме того, вторая функция будет возвращать генератор, а не список в Python 3.)

EDIT сравнение производительности 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
    
ответ дан bereal 07.04.2012 в 17:05
источник
1

if совпадает с:

if i in "aeiouAEIOU"

В основном вы проверяете член в наборе.

    
ответ дан Keith 07.04.2012 в 15:55
источник
1

Я думаю, что длинные заявления сложнее понять, чем короткие. Почти всегда есть способ сделать то же самое с более короткими утверждениями. В вашем случае вы можете упростить, если так:

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

, поскольку Python позволяет вам использовать оператор «in» для поиска одной строки внутри другой.

Но Python также позволяет использовать списки, упрощающие циклы:

def getVowels(word):
    return [i for i in word if i in "aeiouAEIOU"]
    
ответ дан Vaughn Cato 07.04.2012 в 15:56
источник
1

Как

set('aeiouAUIOU') & set(word)
    
Список
ответ дан Ali Afshar 07.04.2012 в 18:20
источник