Python

2012-03-24 14 views
6

'da bir işlevin argüman sırasını çevirme Günümüzde, haskell'i öğrenmeye başlıyorum ve bunu yaparken Python'da öğrendiğim bazı fikirleri uygulamaya çalışıyorum. Ama bunu zorlayıcı buldum. Başka bir işlevi argüman olarak alan Haskell'de bir işlev yazabilir ve argümanların sırası ters çevrilmiş olarak aynı işlevi döndürür. Python'da benzer bir şey yapılabilir mi? Örneğin, Python'da yapabilir misiniz?Python

+1

Sanırım * args'leri kullanabilir ve sonra argüman listesini tersine çevirebilirsin ... ya da bunun gibi bir şey. –

cevap

11

Yuvalanmış işlev tanımlarını kullanarak Python'da bir kapatma oluşturabilirsiniz. Saf bir işlevsel tarzında

>>> from functools import wraps 
>>> def flip(func): 
     'Create a new function from the original with the arguments reversed' 
     @wraps(func) 
     def newfunc(*args): 
      return func(*args[::-1]) 
     return newfunc 

>>> def divide(a, b): 
     return a/b 

>>> new_divide = flip(divide) 
>>> new_divide(30.0, 10.0) 
0.3333333333333333 
+0

Hmm, evet, bu işe yaramalı. – yasar

+0

iyi, ama biraz ayrıntılı değil. – georg

+2

@ thg435 Sadece 'flip' tanımı noktasında. Bu çeşit bir ayrıntı * iyi * ayrıntı IMHO'dur, çünkü içeride neler olup bittiğini açıkça gösterir. – Ben

6

:

flip = lambda f: lambda *a: f(*reversed(a)) 

def divide(a, b): 
    return a/b 

print flip(divide)(3.0, 1.0) 

Biraz daha ilginç bir örnek:

unreplace = lambda s: flip(s.replace) 

replacements = ['abc', 'XYZ'] 
a = 'abc123' 
b = a.replace(*replacements) 
print b 
print unreplace(b)(*replacements) # or just flip(b.replace)(*replacements) 
Bu özgün işlevini argüman sırasını tersine çevirir ve sonra çağıran yeni bir fonksiyon tanımlayarak
+5

Hayır, bu adil değil! @ Raymond'un cevabı aslında pratik açıdan çok daha iyi, çünkü yığın izlerini okunabilir tutuyor. Bu konuyu okuyan kişi önce cevabını okumalı. Lütfen kabul et. – georg