SORU
7 Kasım 2013, PERŞEMBE


Neden liste üreteçleri döngü değişkeni, ama jeneratörler için sakın yazma't?

Eğer liste üreteçleri ile bir şey yaparsam, yerel bir değişkene yazıyor:

i = 0
test = any([i == 2 for i in xrange(10)])
print i

Bu baskılar "". 9 Eğer bir jeneratör kullanırsam ancak, yerel bir değişken yazmak için değil:

i = 0
test = any(i == 2 for i in xrange(10))
print i

Bu baskılar "". 0

Bu fark için iyi bir nedeni var mı? Bu tasarım bir karar veya jeneratörleri ve liste üreteçleri uygulanan yol da öylesine bir yan ürünü mü? Şahsen, eğer liste üreteçleri yerel değişkenler için yazmadı ama bana daha iyi görünüyor.

CEVAP
7 Kasım 2013, PERŞEMBE


Python'un yaratıcısı Guido van Rossum, düzgün Python 3 içine inşa edilmiş generator expressions hakkında yazdığı zaman bu söz: (vurgu benim)

Biz de Python ile bir değişim liste üreteçleri ve jeneratör ifadeler arasındaki denklik geliştirmek için 3, yaptı. 2, liste üreteci "sızıntı" döngü çevreleyen kapsamı içine değişken: kontrol . Python

x = 'before'
a = [x for x in 1, 2, 3]
print x # this prints '3', not 'before'

Bu liste üreteçleri orijinal uygulama bir obje; Python "" yıldır. küçük kirli sırları biri oldu Kasıtlı bir tehlikeye liste üreteçleri kör edici hızlı yapmak için başladı, ve yeni başlayanlar için yaygın bir hatadır oldu değil iken, kesinlikle insan bazen soktu.Jeneratör ifadeler için bunu yapabiliriz. Jeneratör ifadeleri ayrı bir yürütme çerçeve gerektirir kimin kullanarak jeneratörler, uygulanır. Böylece, jeneratör ifadeler özellikle eğer kısa bir dizi üzerinden yineleme (varsa) liste üreteçleri daha az verimli değildi.

3, "" jeneratör ifadeler için aynı uygulama stratejisi kullanarak, liste üreteçleri gibi. küçük kirli sırrı çözmek için karar verdik Python, ancak, Böylece, Python 3, yukarıdaki örnek (sonra değiştirilmesi için kullanmak print(x) :-) Yazdır 'önce' kanıtlama 'x' listesinde anlama geçici gölgeler ama geçersiz kılmaz 'x' in çevresindeki kapsamı.

Python 3'te bu artık olmayacak Göremezsiniz.

İlginçdict kapsamPython 2 Bu da yapmıyoruz; bu dict kapsam Python 3 backported gibi zaten onlarda tamir edildi çünkü çoğunlukla.

Bu konu da kapsayan bazı başka sorular da var, ama zaten konu aradığınız zaman o gördünüz eminim, değil mi? ;)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alan Fullmer

    Alan Fullmer

    3 EYLÜL 2010
  • ModNation Racers H.Q.

    ModNation Ra

    31 Ocak 2010
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011