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
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 olarakitertools
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
'başka' python liste bir anl...
Arasındaki fark Python'In Jenerat...
/Başka liste anlama?eğer Python: ...
-≫ Python fonksiyon tanımları ne an...
Ne zaman python jeneratörler kullanmak...