17

私は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ステートメントは非常に長くなっています。それは良いプログラミングと見なされますか?そうでない場合、この関数をコーディングするためのより良い方法はありますか?

4

5 に答える 5

34

いいえ、それは良い習慣とは見なされません、常により良い方法があります:D

if i.upper() in "AEIOU"

リスト内包表記を使用した関数のはるかに短いバージョンを次に示します。

def get_vowels(word):
    vowels = "AEIOU"
    return [c for c in word if c.upper() in vowels]
于 2012-04-07T13:54:53.503 に答える
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番目の関数はPython 3のリストではなく、ジェネレーターを返します。)

c in listvsのパフォーマンス比較を編集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
于 2012-04-07T15:05:10.263 に答える
1

if同じです:

if i in "aeiouAEIOU"

基本的に、セット内のメンバーをチェックしています。

于 2012-04-07T13:55:02.387 に答える
1

長い文は短い文よりも理解しにくいと思います。ほとんどの場合、短いステートメントで同じことを行う方法があります。あなたの場合、次のようにifを単純化できます。

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

Pythonでは、「in」演算子を使用して、別の文字列内の1つの文字列を検索できるためです。

ただし、Pythonではリスト内包表記も使用できるため、ループが単純化されます。

def getVowels(word):
    return [i for i in word if i in "aeiouAEIOU"]
于 2012-04-07T13:56:59.210 に答える
1

好き:

set('aeiouAUIOU') & set(word)
于 2012-04-07T16:20:57.717 に答える