breakBir forifadede bir jeneratör kullanımının yalnızca bir öğesini seçmek için veyalist(itertools.islice(gen, 1))
Örneğinize göre (tam anlamıyla) şöyle bir şey yapabilirsiniz:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
"İstediğiniz zaman [bir kez oluşturulan] jeneratör sadece bir eleman olsun " istiyorsanız (Ben orijinal niyet ve en yaygın niyet% 50 thats varsayalım) o zaman:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
Bu şekilde açıkça kullanımdan generator.next()kaçınılabilir ve giriş sonu işlemesi (şifreli) StopIterationistisna işleme veya ekstra varsayılan değer karşılaştırmaları gerektirmez.
else:Ait forsonuna-of-jeneratör durumunda şey special yapmak istiyorsanız deyimi bölümünde sadece ihtiyaç vardır.
next()/ İle ilgili not .next():
Python3'te .next()yöntem .__next__()iyi bir nedenle yeniden adlandırıldı : düşük seviye olarak kabul edildi (PEP 3114). Python 2.6'dan önce yerleşik işlev next()yoktu. Ve nadiren ihtiyacı ve yerleşik isimlerin enflasyonu şüpheli olduğu next()için operatormodüle (akıllıca olurdu) taşınması bile tartışıldı .
next()Varsayılan olmadan kullanmak hala çok düşük seviyeli bir uygulamadır - şifreli StopIterationgibi bir şifreyi normal uygulama kodunda maviden açık bir şekilde atmak . Ve doğrudan next()varsayılan için tek seçenek en iyi olan varsayılan sentinel ile kullanmak sınırlıdır ve genellikle garip pythonic olmayan mantık / okunabilirliğe neden olur.next()builtins
Alt satır: next () yönteminin kullanılması, operatormodülün işlevlerini kullanmak gibi çok nadir olmalıdır . Kullanılması for x in iterator, islice, list(iterator)oldukça her zaman mümkün ve - ve diğer fonksiyonlar sorunsuz bir yineleyici kabul uygulama düzeyinde iterators kullanmanın doğal bir yoldur. next()düşük seviyeli, ekstra bir kavram, açık değil - bu konunun sorusunun gösterdiği gibi. Örneğin breakin forkullanımı gelenekseldir.