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