2011-03-31 18 views
15

yanımda ben bu en verimli olmadığını biliyoruzkullanma sırasında durum çok daha olması gerektiği gibi

list(i for i in range(100) if i*i < 30) 

olarak liste comprehensions/jeneratör ifadelerde if ve for kullanabilir ama taşıyabilir ifadelerde karmaşık ve bu sadece bir örnektir.

list(i for i in range(100) while i*i < 30) 

Ancak while jeneratörü anlaşılamamıştır: Böyle bir şey durdurmak için jeneratör ifadesini anlamanın bir yolu var mı Ancak bu yine de yüz tekrarlamalar geçer ve sadece ilk 6'da bir değer verir ifade. Öyleyse, sorum şu ki, yeni değerleri vermese bile hesaplama işlemine devam etmemek için bir durdurma koşuluyla bir jeneratör ifadesini nasıl yazarım.

+1

Sadece bir not: '[i aralığında i (i) 'i kullanarak' ' – Joril

+0

' 'kullanarak bir liste oluşturabilirsiniz. İlginç bir şekilde, [PEP3142] vardı (https://www.python.org/dev/peps/ pep-3142 /) bu soru sorulduğunda açık. Verilen kullanım durumu neredeyse tam olarak budur. Guido bunu Mayıs 2013'te nuklediyor –

cevap

9

itertools'daki (takewhile() akla gelir) çeşitli işlevler yardımcı olabilir. takewhile() ve dropwhile() sözdizimi en net olmadığından

20

, burada sorunuzun gerçek örnekler:

>>> [i for i in itertools.takewhile(lambda x: x*x<30, range(10))] 
[0, 1, 2, 3, 4, 5] 
>>> [i for i in itertools.dropwhile(lambda x: x*x<30, range(10))] 
[6, 7, 8, 9] 

itertools has questioned yazarı bu işlevleri kaldırmayı mı olduğunu bilin.

+0

Bu işlevlerin kullanımdan kaldırılması durumunda reçete ne olurdu? – highBandWidth

+0

Sadece [itertools.takewhile] için Python belgelerine bakın (http://docs.python.org/library/itertools.html#itertools.takewhile) ve [itertools.dropwhile] (http://docs.python.org /library/itertools.html#itertools.dropwhile). Her biri düz Python eşdeğerine sahiptir. – dawg

+6

sadece bir liste değildir (itertools.takewhile (lambda x: x * x <30, range (10))) '' burada bir anlamadan daha kolay – wim

İlgili konular