2012-04-07 3 views
17

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

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

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

Вы должны использовать [ 'enumerate'] (HTTP: //docs.python.org/library/functions.html#enumerate) вместо счетчика. – agf

+0

Это хороший вопрос. Не забудьте принять ответ в ближайшие пару дней. – Marcin

ответ

34

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

if i.upper() in "AEIOU" 

Здесь гораздо более короткая версия вашей функции с помощью списковых:

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

Спасибо. Я не знал, что могу использовать «in» для строк, я думал, что могу использовать его только для списков. Но поскольку строки ведут себя почти так же, как списки, я должен был знать это .d Спасибо всем. – geekkid

+1

Да, есть много ярлыков: D – jamylak

+3

@geekkid Способность сжимать ваш код до этого ответа в значительной степени зависит от того, что такое python - он действительно обеспечивает краткое, не повторяющееся кодирование. – Marcin

1

if является такие как:

if i in "aeiouAEIOU" 

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

+0

@agf Они эквивалентны, если мы предположим, что слово «слово» является строкой –

1

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

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

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

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

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

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

VOWELS = set('aeiouAUIOU') 

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

или, более вызывающим:

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

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

EDIT сравнение производительности c in list против 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

Ваша последняя функция не дает гласных в слове, она просто говорит «Истина» или «Ложно» – jamylak

+0

@jamylak oh позор. Спасибо, удалил. – bereal

+0

Является ли использование наборов быстрее? Потому что VOWELS = 'aeiouAUIOU' также работает. – Akavall

1

Как:

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

Ooh, pretty ... За исключением того, что скремблирует буквы и не сохраняет дубликаты. –

+0

Да, и да, но слишком красиво, чтобы пропустить. –

Смежные вопросы