SORU
15 Temmuz 2010, PERŞEMBE


Neden functools.Python: kısmi gerekli?

Kısmi uygulama güzel. İşlevi Lambda geçemezsin functools.partial ne sunuyor?

>>> sum = lambda x, y : x   y
>>> sum(1, 2)
3
>>> incr = lambda y : sum(1, y)
>>> incr(2)
3
>>> def sum2(x, y):
    return x   y

>>> incr2 = functools.partial(sum2, 1)
>>> incr2(4)
5

functools bir şekilde daha verimli, ya da okunabilir mi?

CEVAP
15 Temmuz 2010, PERŞEMBE


İşlevi nedir functools.değil kısmi teklif Lambda geçiyor?

Pek çok açıdanişlevselliği(ama sonra) -- ve, okunabilirlik gözündedir. Fonksiyonel programlama dilleri (özellikle Lisp/Scheme aileleri olanlar) aşina olan çoğu kişi gayet iyi bence ... lambda gibi görünen "en", kesinlikledeğilçünkü Guido ve ben kesinlikle arasında bu "aşina" (VS) henüz sanırım lambda olarak göze batan bir anormallik Python... tövbekar hiç sahip kabul içine Python ve planlı kaldırmak içinde Python 3, gibi bir "Piton hataları", ve ben tam olarak desteklenen ona. (lambda seviyorumDüzeni... sınırları amaPythonve garip değilsadece uymuyordil geri kalanı ile, hali tüylerimi ürpertiyor).

Öyle değil, ancak, için ordularını lambda aşıklar kim düzenledi birinin en yakın şeyler için bir isyan görülmemiş Python tarihine kadar Guido bakımından gerileme ve karar bırakın lambda. Birkaç olası eklemeler için functools (fonksiyonlar dönen sabitler, kimlik, vs) olmadı (önlemek için açıkça çoğaltarak daha fazla lambda'nin işlevselliği) gerçi partial tabii devam yoktoplamçoğaltılması, ne de bir göze batan şey değildir).

lambdaBu vücut için sınırlıdırifadesınırlamalar var. yani Örnek...:

>>> import functools
>>> f = functools.partial(int, base=2)
>>> f.args
()
>>> f.func
<type 'int'>
>>> f.keywords
{'base': 2}
>>> 

functools.partial'In fonksiyonu nitelikleri ile dekore edilmiştir döndü içgözlem -- işlevi sarma ve konumsal ve adlandırılmış bağımsız değişkenleri ne orada giderir. için yararlı Ayrıca, adlandırılmış bağımsız değişkenleri geçersiz geri alınabilir (""yerine, bir anlamda, varsayılan ayar) tamir:

>>> f('23', base=10)
23

Yani gördüğünüz gibidefinely*!* 20-Basit olarak değil)

Evet, senolabilirlambda senin senin -- örneğin, anahtar kelime ağır basan, bunun için bazı vermek için yerleştir

>>> f = lambda s, **k: int(s, **dict({'base': 2}, **k))

ama ben iyi bilirimumuthatta en ateşli lambda-aşık dikkate almazbukorku partial çağrı daha okunabilir!-). Ve, "öznitelik ayarlama" bölümü daha da zor, çünkü "vücudun tek bir ifade" sınırlama Python lambda (artı aslında bu atama ... asla bir parçası bir Python ifadesi)... sonunda "taklit atamaları içinde bir ifade" tarafından germe listesi anlayışının çok ötesinde tasarım sınırları...:

>>> f = [f for f in (lambda f: int(s, base=2),)
           if setattr(f, 'keywords', {'base': 2}) is None][0]

Şimdi adlandırılmış bağımsız değişkenleri overridability, üç öznitelik ayarı artı, tek bir ifadeye, birleştirmek ve okunabilir söylebuolacak...!-)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bethliebert

    bethliebert

    23 EKİM 2008
  • Jesse Pimenta

    Jesse Piment

    5 EKİM 2011
  • Alexey - servant of Christ

    Alexey - ser

    15 EYLÜL 2007