SORU
18 Kasım 2009, ÇARŞAMBA


Python anlama Jeneratörler?

Dakikada Python kitabı okuma ve şu anda jeneratörler bakıyor. Zor benim başını çevir buluyorum.

Bir Java arka plan geldiğim gibi, Java bir muadili var mı? Kitabı 'Üretici-Tüketici' parçacığı aklıma ne zaman duysam, ancak. hakkında konuşuyordu

Herkes bir jeneratör nedir ve neden açıklayabilir mi? Hiç kitap alıntı olmadan, belli ki iyi, basit bir cevabı bir kitaptan doğrudan bulabilirsiniz Sürece). Belki örneklerle, eğer cömert hissediyorsun! :) Çok teşekkür ederim.

CEVAP
18 Kasım 2009, ÇARŞAMBA


Not: Bu yazı Python 3 varsayar.x sözdizimi.&hançer;

generator sadece bir işlevi döndüren bir nesne üzerinde hangi diyebilirsin next, öyle ki her Ara verir biraz değer kadar yükseltir StopIteration özel durum, sinyal tüm değerlere sahip olmuştur oluşturdu. Böyle bir nesne deniryineleyici.

Normal fonksiyonlar tek bir değer return, Java gibi kullanarak geri dönün. Python, ancak, alternatif, yield denir. Her yerde yield bir fonksiyonu kullanarak bir jeneratör yapar. Bu kodu inceleyin:

>>> def myGen(n):
...     yield n
...     yield n   1
... 
>>> g = myGen(6)
>>> next(g)
6
>>> next(g)
7
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

Görebilirsiniz, myGen(n) n veren bir işlevdir ve n 1. 37 ** her Ara değerleri elde edilene kadar tek bir değer verir. for döngüler arka planda next böylece arama:

>>> for n in myGen(6):
...     print(n)
... 
6
7

Aynı şekilde orada olduğunu düşündüğünüz için bir araç sağlamak generator expressions, jeneratörler bazı yaygın türleri tarif:

>>> g = (n for n in range(3, 5))
>>> next(g)
3
>>> next(g)
4
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

Jeneratör ifadeler list comprehensions gibi olan not:

>>> lc = [n for n in range(3, 5)]
>>> lc
[3, 4]

Jeneratör bir nesne oluşturulur inceleyinbir kezonun kod amadeğiltek seferde çalıştırın. Sadece aramaları 21 ** aslında (parçası) kod yürütmek için. Bir jeneratör kod yürütme yield ifadesi üzerine bir değer döndürür ulaştı, sonra durur. next bir sonraki çağrı sonra jeneratör son sonra bırakılmış durumda devam etmek için yürütme yield neden olur. Bu normal işlevleri ile temel bir fark vardır: o her zaman "" ve bir değer döndürülüyor. üzerine durumlarına atın üstünde yürütme başlatmak

Bu konu hakkında söylenecek daha çok şey var. Mümkün send veri için bir Jeneratör (reference) geri örn. Ama bir jeneratör temel kavramı anlamak kadar içine bakmıyorum öneririm bir şeydir.

Kullanım jeneratörler neden? diye sorabilirsiniz şimdi: İyi nedenleri bir çift vardır:

  • Bazı kavramlar kısaca jeneratörler kullanarak çok daha fazla tarif edilebilir.
  • Değerler listesini döndüren bir fonksiyon oluşturmak yerine, bir sinek değerleri üreten bir jeneratör yazabilirsiniz. Bu liste, sonuç kodunu daha hızlı olduğu anlamına gelir inşa edilmesi gerektiği anlamına gelir. Bu şekilde bile sadece belleğe sığmayacak kadar büyük olan veri akışını tarif eder.
  • Jeneratörler tanımlamak için doğal bir yol sağlarsonsuzakarsu. Örnek Fibonacci numbers: bu düşünün

    >>> def fib():
    ...     a, b = 0, 1
    ...     while True:
    ...         yield a
    ...         a, b = b, a   b
    ... 
    >>> import itertools
    >>> list(itertools.islice(fib(), 10))
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
    

    Bu kod itertools.islice sonsuz bir akışı öğeleri sınırlı sayıda çekmek için kullanır. Kolaylıkla ileri jeneratörler yazmak için gerekli araçlar olarak itertools modülündeki işlevlerin iyi bir göz olması tavsiye edilir.


&hançer;Python <=2.6:yukarıdaki örneklerde next yöntemi, belirli nesne __next__ çağıran bir fonksiyon. Python <=2.6 biri biraz farklı bir tekniği next(o) yerine o.next() yani kullanır. Python 2.7 next() 2.7 aşağıdakileri kullanmak gerekmez, bu yüzden .next arayın:

>>> g = (n for n in range(3, 5))
>>> g.next()
3

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Max Lee

    Max Lee

    18 AĞUSTOS 2006
  • rekjavicxxx

    rekjavicxxx

    28 EKİM 2007
  • wwjoshdu

    wwjoshdu

    18 ŞUBAT 2011