2012-04-07 10 views
17

Jestem całkiem nowy w Pythonie i programowaniu w ogóle, i zastanawiałem się, czy dobrą praktyką programowania jest pisanie długich instrukcji z wieloma operatorami logicznymi - na przykład w pętli for.Dobre praktyki programowania Python do wyliczania list

Na przykład, oto funkcja, którą stworzyłem, która pobiera wszystkie samogłoski od słowa i zwraca listę zawierającą te samogłoski.

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 

Jak widać, instrukcja if stała się bardzo długa. Czy uważa się za dobre programowanie? Jeśli tak nie jest, czy istnieje lepszy sposób na zakodowanie tej funkcji?

+1

Należy użyć [ 'enumerate'] (http: //docs.python.org/library/functions.html#enumerate) zamiast licznika. – agf

+0

To jest dobre pytanie. Pamiętaj, aby zaakceptować odpowiedź w ciągu najbliższych kilku dni. – Marcin

Odpowiedz

34

Nie, to nie jest uważane za dobre praktyki, nie zawsze są lepsze sposoby: D

if i.upper() in "AEIOU" 

Tutaj jest znacznie krótsza wersja swojej funkcji przy użyciu wyrażeń listowych:

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

Dziękuję. Nie wiedziałem, że mogę użyć "in" również dla ciągów, myślałem, że mogę go używać tylko dla list. Ale ponieważ łańcuchy zachowują się prawie tak samo jak listy, powinienem był to wiedzieć .d Dziękuję wszystkim. – geekkid

+1

Tak, istnieje wiele skrótów: D – jamylak

+3

@geekkid Możliwość skompresowania kodu do tej odpowiedzi jest właściwie tym, o co pyta Python - to naprawdę umożliwia zwięzłe, niepowtarzalne kodowanie. – Marcin

1

if jest tak samo jak:

if i in "aeiouAEIOU" 

Zasadniczo masz sprawdzanie członka w zestawie.

+0

@agf Są one równoważne, jeśli założymy, że słowo "słowo" jest ciągiem –

1

Myślę, że długie stwierdzenia są trudniejsze do zrozumienia niż krótkie. Niemal zawsze istnieje sposób na robienie tego samego z krótszymi wypowiedziami. W twoim przypadku, można uprościć, jeśli tak:

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

ponieważ Python pozwala użyć operatora „in”, aby szukać jeden ciąg wewnątrz drugiego.

Ale Python pozwala również listowych, które upraszczają pętle:

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

będzie prawdopodobnie lepiej użyć zestawach:

VOWELS = set('aeiouAUIOU') 

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

lub bardziej naukowy:

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

(Ale pierwsze podejście jest najbardziej czytelne i jako takie jest bardziej pythonic.Również druga funkcja zwróci generato r, a nie lista w Pythonie 3.)

EDIT porównanie wydajności 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 
+1

Twoja ostatnia funkcja nie produkuje samogłosek w słowie, po prostu mówi "Prawda" lub "Fałsz" – jamylak

+0

@jamylak o szkoda na mnie. Dzięki, usunięcie. – bereal

+0

Czy używanie zestawów przyspiesza działanie? Ponieważ VOWELS = 'aeiouAUIOU' również działa. – Akavall

1

odczuwalna:

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

Ooh, pretty ... Z wyjątkiem tego, że koduje litery i nie zachowuje duplikatów. –

+0

Tak, i tak, ale zbyt piękne, aby go przegapić. –

Powiązane problemy