Подтвердить что ты не робот

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

Я новичок в 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 получил очень много времени. Это считается хорошим программированием? Если это не так, есть ли лучший способ кодировать эту функцию?

4b9b3361

Ответ 1

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

if i.upper() in "AEIOU"

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

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

Ответ 2

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

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.)

ИЗМЕНИТЬ сравнение производительности 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

Ответ 3

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

if i in "aeiouAEIOU"

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

Ответ 4

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

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"]

Ответ 5

Как

set('aeiouAUIOU') & set(word)