একটি জেনারেটর ব্যবহারের মাত্র একটি উপাদান বাছাইয়ের জন্য breakএকটি forবিবৃতিতে , বাlist(itertools.islice(gen, 1))
আপনার উদাহরণ অনুসারে (আক্ষরিক) আপনি যেমন কিছু করতে পারেন:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
যদি আপনি চান " [একবারে উত্পন্ন] জেনারেটর থেকে যখনই আমি চাই কেবলমাত্র একটি উপাদান পান " (আমি মনে করি যে 50% আসল অভিপ্রায় এবং সবচেয়ে সাধারণ উদ্দেশ্যটি বোঝায়) তবে:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
এইভাবে স্পষ্টভাবে ব্যবহার generator.next() এড়ানো যায় এবং ইনপুট হ্যান্ডলিংয়ের জন্য (ক্রিপ্টিক) StopIterationব্যতিক্রম হ্যান্ডলিং বা অতিরিক্ত ডিফল্ট মান তুলনা প্রয়োজন হয় না।
দ্য else:এর forবিবৃতি বিভাগে প্রয়োজন হয় যদি আপনি শেষ অফ জেনারেটরের ক্ষেত্রে বিশেষ কিছু চাই না।
নোট অন next() / .next():
পাইথন 3-তে সঠিক কারণে এই .next()পদ্ধতির নামকরণ করা হয়েছিল .__next__(): এটি নিম্ন-স্তরের হিসাবে বিবেচিত হয় (পিইপি 3114)। পাইথন ২.6 এর পূর্বে বিল্টিন ফাংশনটির next()অস্তিত্ব ছিল না। এমনকি এটি সরানো নিয়েও আলোচনা হয়েছিলnext()operator এটির বিরল প্রয়োজন এবং বিল্টিন নামগুলির প্রশ্নবিদ্ধ মুদ্রাস্ফীতিের কারণে মডিউলটিতে (যা জ্ঞানী হতে পারে) হওয়ার ।
next()ডিফল্ট ছাড়াই ব্যবহার করা এখনও খুব নিম্ন-স্তরের অনুশীলন - StopIterationসাধারণ অ্যাপ্লিকেশন কোডটিতে খোলামেলাভাবে নীল থেকে বল্টারের মতো ক্রিপ্টিক ছুঁড়ে দেওয়া । এবং next()ডিফল্ট সেন্ডিনেলটি ব্যবহার করে - কোনটির জন্য সেরা বিকল্পটি হওয়া উচিতnext() সরাসরি সরাসরি builtinsপ্রবেশের - এটি সীমাবদ্ধ এবং প্রায়শই অদ্ভুত অ-পাইথোনিক যুক্তি / পাঠযোগ্যতার কারণ দেয়।
নীচের লাইন: পরবর্তী () ব্যবহার করা খুব বিরল হওয়া উচিত - যেমন operatorমডিউলটির ফাংশনগুলি ব্যবহার করা । ব্যবহার for x in iterator, islice, list(iterator)সম্ভব এবং বেশ সবসময় - এবং অন্যান্য কার্যাবলী অঙ্গীভূতভাবে কোনো ইটারেটরে গ্রহণ আবেদন স্তরের উপর iterators ব্যবহারের প্রাকৃতিক উপায়। next()নিম্ন-স্তরের, একটি অতিরিক্ত ধারণা, নিখরচায় - যেমন এই থ্রেডের প্রশ্নটি দেখায়। ব্যবহার করার সময় যেমন breakমধ্যে forপ্রচলিত আছে।