পাইথন লুপের অন্য `ধারাটি কীভাবে বুঝব?


191

অনেক পাইথন প্রোগ্রামার সম্ভবত অবহিত নয় যে whileলুপ এবং forলুপের বাক্য গঠনতে একটি al else:চ্ছিক ধারা রয়েছে:

for val in iterable:
    do_something(val)
else:
    clean_up()

লাশ elseদফা ক্লিন-আপ কর্ম নির্দিষ্ট ধরণের জন্য একটি ভাল জায়গা, এবং লুপ স্বাভাবিক পরিসমাপ্তি উপর মৃত্যুদন্ড কার্যকর হয়: অর্থাত, সঙ্গে লুপ থেকে প্রস্থান returnবা breakঅগ্রাহ্য elseদফা; এটি কার্যকর করার পরে প্রস্থান করা continue। আমি জানি শুধু এ কারণে যে আমি শুধু এটি লাগছিল আপ (এখনো আবার), কারণ আমার মনে আছে না করতে পারেন যখনelse দফা মৃত্যুদন্ড কার্যকর করা হয়।

সর্বদা? নামটি যেমন লুপটির "ব্যর্থতা" আছে? নিয়মিত সমাপ্তিতে? লুপ দিয়ে বেরিয়ে গেলেও return? আমি এটি না তাকিয়ে কখনই পুরোপুরি নিশ্চিত হতে পারি না।

আমি কীওয়ার্ডের নির্বাচনের উপর আমার elseঅবিশ্বাস্যতার জন্য দোষ দিচ্ছি: আমি এই শব্দার্থবিজ্ঞানের জন্য অবিশ্বাস্যভাবে অনাদায়ী বলে মনে করি । আমার প্রশ্নটি "এই উদ্দেশ্যটির জন্য কেন এই কীওয়ার্ডটি ব্যবহার করা হচ্ছে" তা নয় (যা আমি সম্ভবত উত্তরগুলি এবং মন্তব্যগুলি পড়ার পরে বন্ধ করার পক্ষে ভোট দেব), তবে কী elseশব্দটি সম্পর্কে আমি কীভাবে ভাবতে পারি যাতে এর শব্দার্থবিজ্ঞানগুলি বোঝায় এবং আমি সুতরাং এটি মনে করতে পারেন?

আমি নিশ্চিত যে এ সম্পর্কে ন্যায্য পরিমাণ আলোচনা হয়েছিল, এবং আমি ধারণা করতে পারি যে tryবিবৃতিটির else:ধারাটির সাথে সামঞ্জস্যতার জন্য এই পছন্দটি করা হয়েছিল (যা আমারও সন্ধান করতে হবে), এবং তালিকার তালিকায় যোগ না করার লক্ষ্য নিয়ে। পাইথনের সংরক্ষিত শব্দ। সম্ভবত নির্বাচনের কারণগুলি elseএর কার্যকারিতাটি স্পষ্ট করে এটিকে আরও স্মরণীয় করে তুলবে, তবে আমি নামটি ফাংশনটিতে সংযুক্ত করার পরে করছি, historicalতিহাসিক ব্যাখ্যার পরে নয়।

উত্তর এই প্রশ্ন , যা আমার প্রশ্ন সংক্ষিপ্তভাবে সদৃশ হিসাবে বন্ধ ছিল, আকর্ষণীয় ফিরে গল্প অনেকটা ধারণ করে। আমার প্রশ্নের আলাদা ফোকাস রয়েছে ( elseকীওয়ার্ড পছন্দের সাথে নির্দিষ্ট শব্দার্থকে কীভাবে সংযুক্ত করবেন ) তবে আমি মনে করি যে কোথাও এই প্রশ্নের একটি লিঙ্ক থাকা উচিত।


23
কীভাবে "যদি পুনরাবৃত্তি করার কিছু বাকি থাকে ... অন্যথায়"
ওয়ান ক্রিকেটার

4
আমি মনে করি আপনি এই প্রশ্নটি লেখার পরে এখন এটি মনে করতে পারেন :)
জ্যাস্পার

11
elseমূলত এর অর্থ, "যদি ধারাবাহিকতা শর্তটি ব্যর্থ হয়"। লুপের জন্য একটি traditional i < 42if i < 42; execute the loop body; else; do that other thing
তিহ্যবাহী

1
এটি সমস্ত সত্য, এবং আমি বিশেষত ড্রকের উত্তর পছন্দ করি তবে অন্য একটি বিষয় বিবেচনা করতে হবে তা হ'ল অন্য একটি উপলব্ধ কীওয়ার্ড যা বাক্যবহির্ভূতভাবে কিছুটা ভাল ধারণাও তৈরি করে। আপনি চেষ্টা চেনেন / ব্যতীত সম্ভবত চেষ্টা / বৈ / পরিশেষে, কিন্তু এটি হয়েছে আর - চালানো এই কোড যদি এর ব্যতিক্রম ঘটেছে। কোনটি বিটিডব্লিউ, চেষ্টা কোডের অধীনে এই কোডটি সরিয়ে দেওয়ার মতো নয় - সংক্ষিপ্তভাবে লক্ষ্যবস্তু হলে ব্যতিক্রম হ্যান্ডলিং সবচেয়ে ভাল ব্যবহৃত হয়। সুতরাং, যদিও এটি ধারণাগত ধারণাটি তৈরি করেছে - এখানে বেশ কয়েকটি উত্তর অনুসারে - আমি মনে করি এটি কীওয়ার্ডটি আবার খেলতেও ব্যবহার করেছে - এটি নির্দিষ্ট শর্তে চালান
জেএল পেয়ারেট

1
@ ফালানওয়ে, কোডটি বের করার সময় একটি পার্থক্য রয়েছে break। ক্যানোনিকাল ইউজ কেসটি হ'ল লুপ যখন কোনও কিছুর সন্ধান করে এবং এটি খুঁজে পেলে ব্রেক হয়। elseশুধুমাত্র মৃত্যুদন্ড কার্যকর যদি কিছুই পাওয়া যায়নি হয়।
অ্যালেক্সিস

উত্তর:


212

(এটি @ মার্ক টোলোনেনের উত্তরে অনুপ্রাণিত।)

যদি একটি শর্তটি মিথ্যা হিসাবে মূল্যায়ন করে তবে একটি ifবিবৃতি তার elseধারাটি চালায় । একইভাবে, যদি একটি whileলুপ অন্য শর্তটি চালায় তবে এর শর্তটি মিথ্যা হিসাবে মূল্যায়ন করে।

এই বিধিটি আপনার বর্ণিত আচরণের সাথে মেলে:

  • সাধারণ নির্বাহের ক্ষেত্রে, শর্তটি মিথ্যা হিসাবে মূল্যায়ন না করা অবধি লুপটি বারবার চালিত হয় এবং তাই স্বাভাবিকভাবে লুপটি প্রস্থান করে অন্য ধারাটি চালায়।
  • আপনি যখন কোনও breakবিবৃতি কার্যকর করেন , আপনি শর্তটি মূল্যায়ন না করে লুপ থেকে বেরিয়ে যান, সুতরাং শর্তটি মিথ্যা হিসাবে মূল্যায়ন করতে পারে না এবং আপনি অন্য দফাটি কখনও চালান না।
  • আপনি যখন কোনও continueবিবৃতি কার্যকর করেন , আপনি আবার শর্তটি মূল্যায়ন করেন এবং লুপ পুনরাবৃত্তির শুরুতে আপনি সাধারণভাবে যা করেন তা ঠিক করেন। সুতরাং, যদি শর্তটি সত্য হয় তবে আপনি লুপিং চালিয়ে যান, তবে এটি মিথ্যা হলে আপনি অন্য ধারাটি চালান।
  • লুপটি থেকে বেরিয়ে আসার অন্যান্য পদ্ধতিগুলি যেমন returnশর্তটি মূল্যায়ন করে না এবং অন্য কোনও ধারাটি চালায় না।

forলুপগুলি একইভাবে আচরণ করে। কেবলমাত্র শর্তটিকে সত্য হিসাবে বিবেচনা করুন যদি পুনরুক্তিকারীর আরও উপাদান থাকে বা অন্যথায় মিথ্যা।


8
এটি একটি দুর্দান্ত উত্তর। আপনার লুপগুলি এলিফ স্টেটমেন্টগুলির একটি সিরিজের মতো আচরণ করুন এবং অন্য আচরণটি এর প্রাকৃতিক যুক্তিকে প্রকাশ করবে।
মনোনীত

1
আমি এই উত্তরটিও পছন্দ করি তবে এটি ধারাবাহিক elifবিবৃতি দিয়ে সাদৃশ্য আঁকছে না । আছে একটি উত্তর যে আছে, এবং এটি এক নেট ভোট দিন হয়েছে।
অ্যালেক্সিস

2
ভাল না ঠিক, যখন একটি লুপ শর্ত দেখা মিথ্যা অধিকার থাকতে পারে আগে এটি break, গুলি যে ক্ষেত্রে elseচলবে না কিন্তু শর্ত মিথ্যা। একইভাবে forলুপের সাহায্যে এটি breakশেষ উপাদানটি করতে পারে।
তাদগ ম্যাকডোনাল্ড-জেনসেন

36

বেটার মনে এই পথ: elseঅবরুদ্ধ করবে সবসময় যদি সবকিছু যায় কার্যকর করা অধিকার পূর্ববর্তী মধ্যে forব্লক যাতে তা নিঃশেষিত ছুঁয়েছে।

রাইট এই প্রেক্ষাপটে কোন অর্থ exception, কোন breakকোন return। হাইজ্যাকগুলি যে কোনও বিবৃতি যা থেকে নিয়ন্ত্রণ করে forতা elseব্লককে বাইপাস করে দেবে।


কোনও আইটেম অনুসন্ধান করার সময় একটি সাধারণ ব্যবহারের সন্ধান পাওয়া যায় iterable, যার জন্য আইটেমটি পাওয়া গেলে অনুসন্ধানটি বন্ধ করে দেওয়া হয় বা "not found"নীচের elseব্লকের মাধ্যমে একটি পতাকা উত্থাপন / মুদ্রণ করা হয় :

for items in basket:
    if isinstance(item, Egg):
        break
else:
    print("No eggs in basket")  

continueথেকে নিয়ন্ত্রণ হাইজ্যাক হয় না for, সুতরাং নিয়ন্ত্রণ শেষ হয়ে যাওয়ার elseপরে নিয়ন্ত্রণটি এগিয়ে যাবে for


20
খুব সুন্দর লাগছে ... তবে তারপরে elseযখন জিনিসটি ঠিক মতো না ঘটে তখন আপনি একটি ধারাটি কার্যকর করার আশা করতেন, তাই না? আমি ইতিমধ্যে আবার বিভ্রান্ত হয়ে
অ্যালেক্সিস

আমার সাথে "প্রযুক্তিগতভাবে, এটি [একে অপরের সাথে সমার্থক নয় else]" সাথে একমত হতে হবে , যেহেতু elseলুপের কোনও শর্তই সত্যের কাছে মূল্যায়ন করে না, যেহেতু আমি আমার উত্তরে
তাদগ ম্যাকডোনাল্ড- জেনসেন

@ তাধজিএমসিডোনাল্ড-জেনসেন আপনি এও লুপটি ভাঙ্গতে পারেন False। সুতরাং কিভাবে প্রশ্নে forহয় ভাঙ্গা ব্যবহারের ক্ষেত্রে উপর নির্ভর করে।
মূসা কোলেদোয়

এটা ঠিক, আমি "অন্য" (যা elseপাইথনের অন্যান্য ব্যবহারে প্রকৃতপক্ষে প্রতিফলিত হয় ) এর ইংরেজী অর্থের সাথে কী ঘটে সে সম্পর্কে কোনওভাবে যোগাযোগ করার একটি উপায় জিজ্ঞাসা করছি । আপনি else@ মোজেস কী করেন তার একটি ভাল স্বজ্ঞাত সংক্ষিপ্তসার সরবরাহ করে তবে আমরা কীভাবে এই আচরণটি "অন্য" এর সাথে সংযুক্ত করতে পারি তা নয়। যদি কোনও আলাদা কীওয়ার্ড ব্যবহার করা হয় (যেমন, সম্পর্কিত প্রশ্নের উত্তরnobreak হিসাবে উল্লিখিত ), এটি বোঝা সহজ হবে।
অ্যালেক্সিস

1
"জিনিসগুলি ঠিকঠাক হচ্ছে" এর সাথে এর আসলে কোনও সম্পর্ক নেই। অন্যটি নির্ভুলভাবে সম্পাদন করা হয় যখন if/ whileশর্তটি মিথ্যাতে মূল্যায়ন করে বা forআইটেমের বাইরে চলে যায়। breakউপস্থিত লুপ বিদ্যমান (এর পরে else)। continueফিরে গিয়ে আবার লুপের অবস্থাটি মূল্যায়ন করে।
মার্ক টোলোনেন

31

কখন একটি ifএক্সিকিউট করে else? যখন এর অবস্থা মিথ্যা। এটি while/ / এর জন্য ঠিক একই রকম else। সুতরাং আপনি while/ elseঠিক ifএটির মতোই ভাবতে পারেন যা এটির মিথ্যা মূল্যায়ন না করা অবধি তার সত্যিকারের অবস্থা চালিয়ে যায়। একটি breakযে পরিবর্তন করে না। এটি কোনও মূল্যায়ন ছাড়াই থাকা লুপ থেকে বেরিয়ে আসে। elseশুধুমাত্র মৃত্যুদন্ড কার্যকর যদি মূল্যায়নif / whileশর্ত মিথ্যা।

forসমেত এটির মিথ্যা শর্ত তার পুনরুক্তিকারীর ক্লান্তিকর হয়, অনুরূপ।

continueএবং breakমৃত্যুদণ্ড কার্যকর করবেন না else। এটা তাদের কাজ নয়। থাকা breakলুপটি প্রস্থান করে। এতে থাকা continueলুপের শীর্ষে ফিরে যায়, যেখানে লুপের অবস্থাটি মূল্যায়ন করা হয়। এটি if/ whileথেকে মিথ্যা (বা forকোনও আইটেম নেই) কার্যকর করে elseএবং অন্য কোনও উপায়ে মূল্যায়ন করার কাজ ।


1
আপনি যা বলছেন তা খুব বুদ্ধিমান মনে হয়, তবে তিনটি সমাপ্তির শর্তকে একত্রে লম্পট করা, "[শর্ত] মিথ্যা না হওয়া বা বিরতি / অব্যাহত হওয়া" পর্যন্ত ভুল: গুরুতরভাবে, elseলুপটি continue(বা সাধারণভাবে) দিয়ে বেরিয়ে এলে এই ধারাটি কার্যকর করা হয় , তবে আমরা সঙ্গে প্রস্থান যদি নাbreak । এই সূক্ষ্মতাগুলি কেন আমি সত্যিই চেষ্টা করছি যে কী elseক্যাচ করে এবং কী তা না করে।
অ্যালেক্সিস

4
@ আলেক্সিস হ্যাঁ আমাকে সেখানে পরিষ্কার করা দরকার ছিল। সম্পাদনা করা হয়েছে। চালিয়ে যাওয়া অন্যটি কার্যকর করে না, তবে লুপের শীর্ষে ফিরে আসে যা পরে মিথ্যাতে মূল্যায়ন করতে পারে।
মার্ক টোলোনেন

24

এটি এর মূল অর্থ:

for/while ...:
    if ...:
        break
if there was a break:
    pass
else:
    ...

এটি এই সাধারণ প্যাটার্নটি লেখার একটি দুর্দান্ত উপায়:

found = False
for/while ...:
    if ...:
        found = True
        break
if not found:
    ...

কারণটি কারণ হিসাবে ফাংশনটি ছেড়ে দেয় elseযদি এই ধারাটি কার্যকর করা হবে না । আপনি যা ভাবতে পারেন তার একমাত্র ব্যতিক্রম হ'ল যার উদ্দেশ্য এটি সর্বদা কার্যকর করা হয়েছে তা নিশ্চিত হওয়া।returnreturnfinally

continueএই বিষয়টি নিয়ে বিশেষ কিছু করার নেই। এটি লুপটির বর্তমান পুনরাবৃত্তিটি শেষ করে যা পুরো লুপটি শেষ হতে পারে এবং স্পষ্টত সেই ক্ষেত্রে লুপটি একটি দ্বারা শেষ হয়নি break

try/else অনুরূপ:

try:
    ...
except:
    ...
if there was an exception:
    pass
else:
    ...

20

যদি আপনি আপনার লুপগুলি এর মতো কাঠামো হিসাবে মনে করেন (কিছুটা সিউডো-কোড):

loop:
if condition then

   ... //execute body
   goto loop
else
   ...

এটি কিছুটা বেশি বোধগম্য হতে পারে। একটি লুপ মূলত কেবলমাত্র একটি ifবিবৃতি যা শর্ত না হওয়া পর্যন্ত পুনরাবৃত্তি হয় false। এবং এটি গুরুত্বপূর্ণ বিষয়। লুপটি তার অবস্থা যাচাই করে এবং এটি দেখতে পায় যে এটি falseএইভাবে চালায় else(সাধারণের মতো if/else) এবং তারপরে লুপটি সম্পন্ন হয়।

সুতরাং খেয়াল করুন যে else শর্তটি পরীক্ষা করা হলে কেবলমাত্র তারই সম্পাদন করা হয় । এর অর্থ হ'ল আপনি যদি মৃত্যুদন্ডের মাঝখানে লুপের বডিটি উদাহরণস্বরূপ ক returnবা এ দিয়ে প্রস্থান করেন break, যেহেতু শর্তটি আবার পরীক্ষা করা হয় না, কেসটি elseকার্যকর করা হবে না।

একটি continueঅন্যদিকে বর্তমান সঞ্চালনের স্টপ এবং তারপর ফিরে জাম্প আবার লুপ অবস্থার চেক করতে, যার কারণে elseএই দৃশ্যকল্প মধ্যে পৌঁছে যাবে।


আমি এই উত্তরটি বেশ পছন্দ করি তবে আপনি সহজ করতে পারেন: endলেবেলটি ছেড়ে দিন এবং কেবল শরীরের goto loopঅভ্যন্তরটি রেখে দিন if। এমনকি ifলেবেলের মতো একই লাইনে রেখে আউটডেন্টও হতে পারে এবং হঠাৎ এটি অরিগনালের মতো দেখতে খুব বেশি লাগে।
বার্গি

@ বার্গি হ্যাঁ, আমি মনে করি এটি কিছুটা পরিষ্কার করে দিয়েছে, ধন্যবাদ।
কেওয়ান

15

লুপ এর সঙ্গে আমার gotcha হয় মুহূর্ত elseদফা ছিল যখন আমি একটি টক দেখছিলাম রেমন্ড Hettinger , যিনি সম্পর্কে তিনি কিভাবে ভেবেছিলাম এটা বলা উচিত হয়েছে একটি গল্প বলা nobreak। নীচের কোডটি একবার দেখুন, আপনার কী মনে হয় এটি করবে?

for i in range(10):
    if test(i):
        break
    # ... work with i
nobreak:
    print('Loop completed')

আপনি কি অনুমান করবেন এটি কি করে? ঠিক আছে, যে অংশটি বলেছে nobreakকেবলমাত্র কার্যকর করা হবে যদি কোনও breakবিবৃতি লুপে আঘাত না করে।


8

সাধারণত আমি এই জাতীয় লুপ কাঠামোর কথা ভাবি:

for item in my_sequence:
    if logic(item):
        do_something(item)
        break

পরিবর্তনশীল সংখ্যার if/elifবিবৃতিগুলির মতো অনেকটা হতে :

if logic(my_seq[0]):
    do_something(my_seq[0])
elif logic(my_seq[1]):
    do_something(my_seq[1])
elif logic(my_seq[2]):
    do_something(my_seq[2])
....
elif logic(my_seq[-1]):
    do_something(my_seq[-1])

এই ক্ষেত্রে elseফর লুপের elseবিবৃতিটি ঠিক এর শৃঙ্খলে থাকা বিবৃতিটির মতোই কাজ করে elif, এটি কেবল তখনই কার্যকর হয় যদি শর্তগুলির সত্যতার সাথে মূল্যায়ন করার আগে এটির কোনওটিই হয় না। (বা মৃত্যুদন্ড কার্যকর করতে returnবা একটি ব্যতিক্রম সহ) যদি আমার লুপটি এই স্পেসিফিকেশনটির সাথে ফিট না করে তবে আমি সাধারণত for: elseআপনি এই প্রশ্নটি পোস্ট করেছেন তার সঠিক কারণটি ব্যবহার না করে বেছে নেওয়াকে বেছে নিই : এটি অ-স্বজ্ঞাত।


ঠিক। তবে একটি লুপ একাধিকবার চলবে, সুতরাং এটি কীভাবে আপনি লুপটিতে প্রয়োগ করতে চান তা কিছুটা অস্পষ্ট। আপনি কি স্পষ্ট করতে পারেন?
অ্যালেক্সিস

@ অ্যালেক্সিস আমি আমার উত্তরটি আবার করেছি, আমি মনে করি এটি এখন আরও পরিষ্কার।
তাদগ ম্যাকডোনাল্ড-জেনসেন

7

অন্যরা ইতিমধ্যে বলবিজ্ঞান ব্যাখ্যা while/for...else, এবং পাইথন 3 ভাষা রেফারেন্স প্রামাণিক সংজ্ঞা (দেখুন রয়েছে যখন এবং জন্য ), কিন্তু এখানে আমার ব্যক্তিগত স্মৃতিসম্বন্ধীয়, FWIW হয়। আমার ধারণা, আমার কাছে কীটি ছিল এটি দুটি ভাগে বিভক্ত করা: একটি elseলুপ শর্তসাপেক্ষের সাথে সম্পর্কিতটির অর্থ বোঝার জন্য এবং একটি লুপ নিয়ন্ত্রণ বোঝার জন্য।

আমি বুঝতে পেরে এটি সবচেয়ে সহজ while...else:

whileআপনার আরও আইটেম রয়েছে, স্টাফ করুন, elseযদি রান আউট হয় তবে এটি করুন

for...elseস্মৃতিসম্বন্ধীয় মূলত একই হল:

forপ্রতিটি আইটেম, স্টাফ করুন, তবে elseযদি আপনি রান আউট হন তবে এটি করুন

উভয় ক্ষেত্রে, else অংশটি কেবল তখনই পৌঁছে যায় যখন প্রক্রিয়া করার মতো আর কোনও আইটেম না থাকে এবং শেষ আইটেমটি নিয়মিত পদ্ধতিতে প্রক্রিয়া করা হয় (যেমন না breakবা হয় না return)। একজন continueকেবল ফিরে গিয়ে দেখেন যে আরও কোনও আইটেম রয়েছে কিনা। এই বিধিগুলির জন্য আমার স্মৃতিচারণ দুটি whileএবং এর জন্যই প্রযোজ্য for:

যখন breakআইএনএন বা returnআইএনএন করা হচ্ছে তখন কিছুই elseকরার নেই,
এবং যখন আমি বলি continueএটি আপনার জন্য "শুরু করতে ফিরে আসবে"

- "শুরুতে ফিরে ফিরে আসুন" অর্থ, স্পষ্টতই, লুপের শুরুটি যেখানে আমরা পরীক্ষা করব যে পুনরাবৃত্তযোগ্যগুলিতে আরও কোনও আইটেম রয়েছে কিনা, তাই যতদূর else বিষয়গুলি continueসত্যই আদৌ কোনও ভূমিকা রাখে না।


4
আমি পরামর্শ দিচ্ছি যে এটি / বা অন্য লুপের জন্য সাধারণ উদ্দেশ্যটি হ'ল আইটেমগুলি পরীক্ষা করা যতক্ষণ না আপনি যতটা সন্ধান করছেন এবং থামাতে চান না , বা আপনার আইটেম শেষ হয়ে গেছে। "আইটেমগুলি শেষ হয়ে গেছে (আপনি যা খুঁজছিলেন তা না পেয়ে)" অংশটি পরিচালনা করার জন্য "অন্য" উপস্থিত রয়েছে।
সুপারক্যাট

@ সুপের্যাট: হতে পারে, তবে সবচেয়ে সাধারণ ব্যবহারগুলি কী কী তা আমি জানি না। elseএছাড়াও কিছু যখন আপনি কেবল সব আইটেম প্রয়োজনীয়তা ফুরিয়ে করতে ব্যবহার করা যেতে পারে। উদাহরণগুলির মধ্যে একটি লগ এন্ট্রি লেখা, একটি ইউজার ইন্টারফেস আপডেট করা বা আপনার সম্পন্ন কিছু প্রক্রিয়া সংকেত অন্তর্ভুক্ত। কিছু হলেই হলো. এছাড়াও কোডের কিছু অংশের "সফল" breakকেসটি লুপের অভ্যন্তরে শেষ হয় এবং else"ত্রুটি" কেস পরিচালনা করতে ব্যবহৃত হয় যেখানে আপনি পুনরাবৃত্তির সময় কোনও উপযুক্ত আইটেম খুঁজে পাননি (সম্ভবত এটিই আপনি ভাবছিলেন এর?)।
ফ্যাবিয়ান ফাগেরহোম

1
কেস আমি চিন্তা ছিল ছিল অবিকল কেস যেখানে একটি "বিরতি" সঙ্গে সফল ক্ষেত্রে প্রান্ত, এবং "কিছু" হ্যান্ডলগুলি সাফল্যের অভাব। যদি কোনও লুপের মধ্যে "বিরতি" না থাকে তবে "অন্য" কোডটি কেবল এনক্লোজিং ব্লকের অংশ হিসাবে লুপটি অনুসরণ করতে পারে।
সুপারক্যাট

লুপটি কোনও পুনরায় বাধা ছাড়াই সমস্ত পুনরাবৃত্তিযোগ্য আইটেমগুলির মধ্য দিয়ে গেছে এমন ক্ষেত্রে (এবং এটি একটি সফল কেস) এবং এটি যেখানে হয়নি তার ক্ষেত্রে আলাদা করার দরকার নেই। তারপরে আপনাকে লুপের elseব্লকে "চূড়ান্তকরণ" কোডটি রাখতে হবে, বা অন্য উপায় ব্যবহার করে ফলাফলটি ট্র্যাক করতে হবে। আমি মূলত একমত, আমি কেবল বলছি যে কীভাবে লোকেরা এই বৈশিষ্ট্যটি ব্যবহার করে তা আমি জানি না এবং তাই আমি " elseসফল কেসগুলি পরিচালনা করি" পরিস্থিতি বা " elseহ্যান্ডলস ব্যর্থ কেস" পরিস্থিতি বেশি সাধারণ কিনা তা নিয়ে অনুমান করা এড়াতে চাই । তবে আপনি একটি ভাল পয়েন্ট আছে, তাই মন্তব্য upvated!
ফ্যাবিয়ান ফাগেরহোম

7

ইন টেস্ট চালিত উন্নয়ন (TDD- এ), যখন ব্যবহার ট্রান্সফরমেসন অগ্রাধিকার চত্বর দৃষ্টান্ত, আপনি শর্তসাপেক্ষ বিবৃতির একটি সাধারণীকরণ যেমন লুপ আচরণ।

আপনি যদি কেবল সাধারণ if/else(কোনও elif) বিবৃতি বিবেচনা না করেন তবে এই পদ্ধতিটি এই বাক্য গঠনটির সাথে ভালভাবে সম্মিলিত হয়েছে:

if cond:
    # 1
else:
    # 2

সাধারণকরণ:

while cond:  # <-- generalization
    # 1
else:
    # 2

চমত্কারভাবে।

অন্যান্য ভাষায়, সংগ্রহের ক্ষেত্রে একক ক্ষেত্রে থেকে টিডিডি পদক্ষেপগুলিতে আরও রিফ্যাক্টরিং প্রয়োজন।


এখানে অষ্টমলাইট ব্লগের একটি উদাহরণ রয়েছে :

অষ্টমলাইট ব্লগের লিঙ্কযুক্ত নিবন্ধে, ওয়ার্ড র‌্যাপ কাটা বিবেচনা করা হয়েছে: স্ট্রিংগুলিতে লাইন ব্রেকগুলি যুক্ত করা ( sনীচে স্নিপেটগুলিতে পরিবর্তনশীল) যাতে তাদের প্রদত্ত প্রস্থকে ফিট করতে পারে ( lengthনীচের স্নিপকেটে পরিবর্তনশীল)। এক পর্যায়ে বাস্তবায়ন নিম্নলিখিত হিসাবে দেখায় (জাভা):

String result = "";
if (s.length() > length) {
    result = s.substring(0, length) + "\n" + s.substring(length);
} else {
    result = s;
}
return result;

এবং পরবর্তী পরীক্ষা, বর্তমানে ব্যর্থ হয়:

@Test
public void WordLongerThanTwiceLengthShouldBreakTwice() throws Exception {
    assertThat(wrap("verylongword", 4), is("very\nlong\nword"));
    }

সুতরাং আমাদের কোডগুলি শর্তসাপেক্ষে কাজ করে: যখন একটি নির্দিষ্ট শর্ত পূরণ হয়, একটি লাইন ব্রেক যুক্ত হয়। আমরা একাধিক লাইন ব্রেকগুলি পরিচালনা করতে কোডটি উন্নত করতে চাই। নিবন্ধে উপস্থাপিত সমাধানটি প্রয়োগ করার প্রস্তাব করেছে (যদি-> যখন) রূপান্তরটি তবে লেখক মন্তব্য করেছেন যে:

যদিও লুপগুলির কোনও elseধারা থাকতে পারে না , সুতরাং আমাদের elseকমপক্ষে এর মাধ্যমে পথটি অপসারণ করা উচিতif পথ সরিয়ে ফেলতে হবে। আবার এটি রিফ্যাক্টরিং।

যা একটি ব্যর্থ পরীক্ষার প্রসঙ্গে কোডে আরও পরিবর্তন করতে বাধ্য করে:

String result = "";
while (s.length() > length) {
    result += s.substring(0, length) + "\n";
    s = s.substring(length);
}
result += s;

টিডিডিতে আমরা পরীক্ষাগুলি পাস করতে যতটা সম্ভব কম কোড লিখতে চাই। পাইথনের সিনট্যাক্সের জন্য নিম্নলিখিত রূপান্তরটি সম্ভব:

থেকে:

result = ""
if len(s) > length:
    result = s[0:length] + "\n"
    s = s[length:]
else:
    result += s

প্রতি:

result = ""
while len(s) > length:
    result += s[0:length] + "\n"
    s = s[length:]
else:
    result += s

6

আমি যেভাবে এটা দেখি, else: আপনি লুপটির শেষের দিকে পুনরাবৃত্তি করলে আগুন জ্বলে ওঠে।

আপনি যদি breakবা returnবা raiseআপনি পুনরুক্তি লুপ শেষে গত না থাকলে, আপনি immeadiately বন্ধ, এবং এইভাবে else:ব্লক চলবে না। আপনি continueযদি এখনও লুপের শেষের পরে পুনরাবৃত্তি করেন, তবে চালিয়ে যান, কেবল পরবর্তী পুনরাবৃত্তিতে চলে যান। এটি লুপ থামায় না।


1
আমি এটি পছন্দ করি, আমার মনে হয় আপনি কিছু নিয়ে আছেন। এটি লুপ কীওয়ার্ডের আগে খারাপ পুরানো দিনগুলিতে কীভাবে লুপিং ব্যবহার করা হত তার সাথে সামান্য সম্পর্ক। (যথা: সফলতার শীর্ষে চেকটি লুপের নীচে স্থাপন করা হয়েছিল goto।) তবে এটি শীর্ষ-ভোট প্রাপ্ত উত্তরের একটি সংক্ষিপ্ত সংস্করণ ...
অ্যালেক্সিস

@ অ্যালেক্সিস, সাবজেক্টিভ, তবে আমি আমার ভাব প্রকাশ করার উপায়টিকে আরও সহজ করে ভাবতে পারি।
উইনস্টন ইওয়ার্ট

আসলে আমি একমত শুধুমাত্র যদি এটি pithier হয়।
অ্যালেক্সিস

4

elseলুপটি নির্মাণের অংশ হিসাবে ধারাটিকে ভাবেন ; breakসম্পূর্ণরূপে লুপটি ভেঙে যায় এবং এইভাবে এড়িয়ে যায়else

তবে প্রকৃতপক্ষে, আমার মানসিক ম্যাপিংটি কেবল এটি হ'ল সি / সি ++ প্যাটার্নটির 'কাঠামোগত' সংস্করণ:

  for (...) {
    ...
    if (test) { goto done; }
    ...
  }
  ...
done:
  ...

সুতরাং যখন আমি মুখোমুখি হয়েছি for...elseবা নিজে নিজে এটি লেখার চেয়ে বরং এটি সরাসরি বুঝতে পারি , আমি মানসিকভাবে এটিকে নিদর্শনটির উপরের বোঝার মধ্যে অনুবাদ করি এবং তারপরে পাইথন সিনট্যাক্স মানচিত্রের কোন অংশটি প্যাটার্নের কোন অংশগুলিতে কাজ করি।

(আমি ভীতিজনক উক্তিগুলিতে 'কাঠামোগত' রেখেছি কারণ পার্থক্যটি কোডটি কাঠামোগত বা কাঠামোগত কিনা তা নয়, কেবল নির্দিষ্ট কাঠামোর জন্য কীওয়ার্ড এবং ব্যাকরণ নিবেদিত রয়েছে কিনা তা কেবল নয়)


1
কোথায় else? আপনি যদি প্রকৃতিকে done:দাঁড় করানোর জন্য লেবেল বোঝাতে চেয়েছিলেন বা else:, আমি বিশ্বাস করি এটি ঠিক পিছনের দিকে আছে।
অ্যালেক্সিস

@alexis 'আর' কোড পূরণ হবে '...' সামনে অবিলম্বেdone: লেবেল। সামগ্রিক চিঠিপত্রটি হ'ল, সম্ভবত সর্বোত্তমভাবে বলা হয়েছে: পাইথন else-এ-লুপ লুপ রয়েছে যাতে আপনি এই নিয়ন্ত্রণ প্রবাহ বিন্যাসটি বিনা প্রকাশ করতে পারেন goto
zwol

এই নিয়ন্ত্রণ প্রবাহের ধরণটি কার্যকর করার জন্য অন্যান্য উপায় রয়েছে, যেমন একটি পতাকা সেট করে। এটাই elseএড়িয়ে চলে।
অ্যালেক্সিস

2

আপনি পেয়ার তাহলে elseসঙ্গে for, এটা বিভ্রান্তিকর হতে পারে। আমি মনে করি না শব্দ elseএই সিনট্যাক্স একটি মহান পছন্দ ছিল, কিন্তু আপনি যদি পেয়ার elseসঙ্গে ifরয়েছে যা break, আপনি দেখতে পারেন এটা আসলে জ্ঞান করে তোলে। elseপূর্ববর্তী ifবিবৃতি না থাকলে সবেच কার্যকর এবং আমার বিশ্বাস সিটেক্স ডিজাইনার কীওয়ার্ডটি বেছে নিয়েছিলেন।

আমাকে এটি মানব ভাষায় প্রদর্শন করুন।

forসন্দেহভাজনদের ifযে কোনও একটি গ্রুপের প্রতিটি ব্যক্তিই এই অপরাধ breakতদন্ত criminal elseরিপোর্ট ব্যর্থতা।


1

আমি এটি সম্পর্কে যেভাবে চিন্তা করি, কীটি continueবরং তার অর্থ বিবেচনা করাelse

আপনি যে অন্যান্য কীওয়ার্ডগুলি উল্লেখ করেছেন লুপটি বিচ্ছিন্ন হয়ে পড়ে (অস্বাভাবিকভাবে প্রস্থান করুন) continueএটি না করে, এটি কেবল লুপের ভিতরে থাকা কোড ব্লকের বাকী অংশটি এড়িয়ে যায়। এটি লুপ সমাপ্তির আগে ঘটতে পারে তা ঘটনাচক্রে: সমাপ্তিটি লুপ শর্তসাপেক্ষ অভিব্যক্তির মূল্যায়নের মাধ্যমে স্বাভাবিকভাবে করা হয়।

তারপরে আপনাকে কেবল মনে রাখতে হবে যে elseক্লজটি স্বাভাবিক লুপ সমাপ্তির পরে কার্যকর করা হয়।


0
# tested in Python 3.6.4
def buy_fruit(fruits):
    '''I translate the 'else' below into 'if no break' from for loop '''
    for fruit in fruits:
        if 'rotten' in fruit:
            print(f'do not want to buy {fruit}')
            break
    else:  #if no break
        print(f'ready to buy {fruits}')


if __name__ == '__main__':
    a_bag_of_apples = ['golden delicious', 'honeycrisp', 'rotten mcintosh']
    b_bag_of_apples = ['granny smith', 'red delicious', 'honeycrisp', 'gala', 'fuji']
    buy_fruit(a_bag_of_apples)
    buy_fruit(b_bag_of_apples)

'''
do not want to buy rotten mcintosh
ready to buy ['granny smith', 'red delicious', 'honeycrisp', 'gala', 'fuji']
'''
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.