2012-04-07 3 views
17

저는 파이썬과 프로그래밍에 익숙하지 않습니다. 많은 논리 연산자를 사용하여 긴 명령문을 작성하는 것이 좋은 프로그래밍 방법인지 궁금합니다. 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

: //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"을 사용할 수 있는지 몰랐다. 목록에만 사용할 수 있다고 생각했다. 하지만 문자열이 목록과 거의 동일하게 작동하므로이를 알았어 야합니다. 모두에게 감사드립니다. – geekkid

+1

그래, 바로 가기가 많이있다 : D – jamylak

+3

@geekkid이 코드를 압축하여 압축을 풀 수있는 능력은 파이썬이 중요하게 생각하는 것보다 훨씬 간결하다. 이것은 간결하고 비 반복적 인 코딩을 가능하게한다. – Marcin

1

if은이다 다음과 동일 :

if i in "aeiouAEIOU" 

기본적으로 세트의 구성원을 확인하고 있습니다.

+0

@agf 만약'word'가 문자열이라고 가정한다면 그것들은 동일합니다. –

1

짧은 문장보다 긴 문장을 이해하는 것이 어렵다고 생각합니다. 짧은 문장으로 같은 일을하는 방법은 거의 항상 있습니다. 귀하의 경우에는, 당신은 간단하게 할 수있는이 같은 경우 :

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

파이썬은 다른 하나의 내부 문자열을 검색하기 위해 "에서"연산자를 사용 할 수 있기 때문이다.

그러나 파이썬은 또한 루프를 단순화 지능형리스트를 수 있습니다 :

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) 

을 (하지만 첫 번째 접근법은 가장 읽기 쉽고 더 파이썬 적이기 때문에 두 번째 함수는 generato R, 파이썬 3에서하지리스트)

편집 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

Ooh, pretty ... 글자를 뒤죽박죽 처리하고 중복을 보존하지 않는 것을 제외하고. –

+0

예, 그렇습니다.하지만 놓치기에는 너무 예쁘습니다. –