تحديد فراغ المولد
في بايثون، تعد المولدات أداة قوية للتقييم البطيء والتكرار على مجموعات البيانات الكبيرة. ومع ذلك، فإن تحديد ما إذا كان المولد فارغًا يمثل تحديًا فريدًا نظرًا لطبيعته الديناميكية. على عكس القوائم أو المجموعات، لا تحتوي المولدات على سمة الحجم، وسيؤدي التكرار عليها ببساطة إلى استثناء StopIteration.
Peek vs. HasNext قد يقترح البعض باستخدام الدالة peek() للتحقق مما إذا كان المولد يحتوي على عناصر. على الرغم من أن peek() يسمح لك باسترداد العنصر الأول من المولد دون استهلاكه، إلا أنه لا يوفر طريقة لتحديد ما إذا كان المولد فارغًا. وذلك لأن peek() يثير استثناء StopIteration عندما يكون المولد فارغًا، وهو ما لا يمكن تمييزه عن الاستثناء الذي قد يظهر عند محاولة التكرار على مولد فارغ.
وبالمثل، فإن الدالة hasNext()، الشائعة وجدت في جافا، وهي غير متوفرة في مولدات بايثون.
التحقق من الفراغ من البداية
لتحديد ما إذا كان المولد فارغًا من البداية، يمكنك استخدام وظيفة مخصصة مثل تلك المقدمة في الرد:
def peek(iterable): يحاول: الأول = التالي (قابل للتكرار) باستثناء StopIteration: عودة لا شيء return first, itertools.chain([first], iterable)def peek(iterable):
try:
first = next(iterable)
except StopIteration:
return None
return first, itertools.chain([first], iterable)
Usageلاستخدام هذه الوظيفة، يمكنك الاتصال بها مع المولد كـ الوسيطة:
res = نظرة خاطفة (mysequence) إذا كان الدقة بلا: #التسلسل فارغ. افعل الأشياء. آخر: أولاً، تسلسلي = الدقة # افعل شيئًا أولاً، ربما؟ # ثم كرر التسلسل: للعنصر في mysequence: # إلخ.
res = peek(mysequence)
if res is None:
# sequence is empty. Do stuff.
else:
first, mysequence = res
# Do something with first, maybe?
# Then iterate over the sequence:
for element in mysequence:
# etc.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3