2010-07-04 5 views
1

like this question 인자가있는 함수를 전달하고 싶습니다. 하지만 내장 함수에 전달하고 싶습니다.Python : 인수가있는 함수를 내장 함수에 전달 하시겠습니까?

예 :

files = [ 'hey.txt', 'hello.txt', 'goodbye.jpg', 'howdy.gif' ] 

def filterex(path, ex): 
    pat = r'.+\.(' + ex + ')$' 
    match = re.search(pat, path)   
    return match and match.group(1) == ex) 

내가 루프 및 if 문에 대한과 그 코드를 사용할 수 있지만 필터 (FUNC, 서열)을 사용하여 짧은 어쩌면 더 읽기입니다. 그러나 올바르게 이해한다면 필터로 사용하는 함수는 시퀀스의 항목 인 하나의 인수 만 취합니다.

더 많은 인수를 전달할 수 있는지 궁금합니다.

+0

는 지능형리스트를 사용하여 같은 일을 수행하는 지능형리스트입니다. 필터보다 빠르며 읽기가 더 쉬울 것입니다. –

+1

몇 가지 오타가 있습니다. 'match ='와'return true' (또는 단지'match and match.group (1) == ex')를 할 수 있습니다. –

+0

Thanks Matthew 나는 그것을 조정했다. – Pickels

답변

8
def make_filter(ex): 
    def do_filter(path): 
     pat = r'.+\.(' + ex + ')$' 
     match = re.search(pat, path) 
     return match and match.group(1) == ex 
    return do_filter 

filter(make_filter('txt'), files) 

또는 당신은 filterex 수정하지 않는 경우 :

[path for path in files if filterex(path, 'txt')] 

당신은 또한 발전기를 사용할 수 있습니다 gnibbler에 의해 제안

filter(lambda path: filterex(path, 'txt'), files) 

당신은, 지능형리스트를 사용할 수를 이해할 수 있습니다. 큰 목록이있는 경우 특히 유용 할 수 있습니다.

(path for path in files if filterex(path, 'txt')) 
+0

답변 해 주셔서 감사합니다. Matthew Flaschen 감사합니다. – Pickels

3

여기

import os 
[f for f in files if os.path.splitext(f)[1]=="."+ex] 
+0

고마워요. 내 코드의 다른 부분에 목록 이해가 있지만 내 필터 함수에 연결하지 않은 것으로 보입니다. 나는 '나는 새로운 변명이야'라고 사용할 것입니다. – Pickels

관련 문제