2010-07-04 16 views
1

comme ça question Je veux passer une fonction avec des arguments. Mais je veux passer aux fonctions intégrées.Python: Passer des fonctions avec des arguments à une fonction intégrée?

Exemple:

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) 

je pouvais utiliser ce code avec une boucle et une instruction if, mais il est plus court et peut-être plus lisible à utiliser un filtre (func, seq). Mais si je comprends bien, la fonction que vous utilisez avec le filtre prend seulement un argument qui est l'élément de la séquence.

Alors je me demandais s'il était possible de passer plus d'arguments?

+0

Utilisez une compréhension de la liste. Il sera plus rapide que le filtre et plus facile à lire –

+1

Vous avez quelques fautes de frappe. Il devrait 'match =', et 'return True' (ou vous pouvez juste' retourner match et match.group (1) == ex') –

+0

Merci Matthew je l'ai ajusté. – Pickels

Répondre

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) 

Ou si vous ne voulez pas modifier filterex:

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

Vous pouvez utiliser une compréhension de la liste, comme le suggère gnibbler:

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

Vous pouvez également utiliser un générateur compréhension, ce qui pourrait être particulièrement utile si vous aviez une grande liste:

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

Merci pour votre réponse Matthew Flaschen Je l'apprécie. – Pickels

3

Voici une compréhension de liste qui fait la même chose

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

Merci beaucoup je gnibbler. J'ai une liste de compréhensions dans d'autres parties de mon code mais il semble que je n'ai pas fait la connexion à ma fonction de filtrage. Je vais utiliser le 'Je suis une nouvelle excuse'. – Pickels

Questions connexes