break
Bir for
ifadede 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) StopIteration
istisna işleme veya ekstra varsayılan değer karşılaştırmaları gerektirmez.
else:
Ait for
sonuna-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 operator
modüle (akıllıca olurdu) taşınması bile tartışıldı .
next()
Varsayılan olmadan kullanmak hala çok düşük seviyeli bir uygulamadır - şifreli StopIteration
gibi 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ı, operator
modü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 break
in for
kullanımı gelenekseldir.