2012-04-07 19 views
17

私はPythonとプログラミング全般に新しく、多くの論理演算子を使って長い文を書くことが良いプログラミング慣習であるかどうか疑問に思っていました。リストを列挙するための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

: //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もし 'word'が文字列であると仮定すれば、それらは同等です –

1

長い文は短い文よりも理解しにくいと思います。短い文で同じことをする方法はほとんどありません。 Pythonはあなたが別の内部に1つの文字列を検索するには「の」演算子を使用することができますので、

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

:あなたのケースでは、このような場合を簡素化することができます。

しかし、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のより多くのです。また、2番目の関数はgenerato R、Pythonの3のないリスト)

EDIT c in setc in list性能比較:

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

最後の関数は単語に母音を生成せず、単に' True'または 'False'と答えます – jamylak

+0

@jamylakありがとうございました。 – bereal

+0

セットを使用していますか?なぜなら、VOWELS = 'aeiouAUIOU'も働くからです。 – Akavall

1

同様:

set('aeiouAUIOU') & set(word) 
あなたは[ `enumerate`](HTTPを使用する必要があります
+0

おっと、かなり... それを除いて、文字をスクランブルし、重複を保存しません。 –

+0

はい、そうですが、あまりにもかわいいです。 –

関連する問題