লুপগুলি পরে এবং যখন পাইথন 'অন্য' ব্যবহার করে?


480

আমি বুঝতে পারি যে এই নির্মাণটি কীভাবে কাজ করে:

for i in range(10):
    print(i)

    if i == 9:
        print("Too big - I'm giving up!")
        break;
else:
    print("Completed successfully")

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

আমি ভাবছি পাইথন কোডাররা কীভাবে তাদের মাথায় এই কন্সট্রাক্টটি পড়েছেন (বা যদি আপনি পছন্দ করেন তবে উচ্চস্বরে)। সম্ভবত আমি এমন কিছু হারিয়ে যাচ্ছি যা এই জাতীয় ব্লককে আরও সহজেই অনির্বচনীয় করে তুলবে?


26
আপনি এটি আপনার মাথায় "তারপর" অনুবাদ করতে পছন্দ করতে পারেন।
মার্সিন

63
পাইথনের জেনের মূল লাইনটি ভুলে যাবেন না: "... আপনি ডাচ না হলে এই পথটি প্রথমে সুস্পষ্ট হতে পারে না।"
ড্যানিয়েল রোজম্যান 16

50
আমার মাথায় আমি এটি "ব্রেক না হলে" অনুবাদ করি । এবং, যেহেতু "আমি এটি খুঁজে পেয়েছি" লুপগুলিতে breakপ্রচুর ব্যবহৃত হয় , আপনি এটি "যদি না পাওয়া যায়" তে অনুবাদ করতে পারেন যা যা পড়ে তা থেকে খুব দূরে নয়else
ম্যাস্ট্রিলিয়ন

29
আমার মনে হয় অনেকের কাছে আসল প্রশ্নটি হ'ল " লুপের পরে for ... else foo()রাখার মধ্যে কী পার্থক্য আছে foo()?" আর উত্তর যে তারা ভিন্নভাবে আচরণ হয় শুধুমাত্র যদি লুপ একটি রয়েছে break(নীচের বিস্তারিতভাবে বর্ণনা হিসাবে)।
স্যাম কফম্যান

10
অজগরের একটি সেমিকোলন ... আমার চোখ ব্যাথা করছে .. যদিও এটি সিনট্যাক্টিকভাবে সঠিক হলেও এটি করা ভাল অনুশীলন নয়
ডার্কসিগনাস

উত্তর:


278

এটি পাকা পাইথন কোডার এমনকি একটি আশ্চর্যজনক নির্মাণ। যখন ফর-লুপের সাথে একত্রে ব্যবহৃত হয় তখন এর মূল অর্থ "পুনরাবৃত্তীয় কিছু আইটেম সন্ধান করুন, অন্যথায় যদি কিছু না পাওয়া যায় তবে" ...। যেমন:

found_obj = None
for obj in objects:
    if obj.key == search_key:
        found_obj = obj
        break
else:
    print('No object found.')

তবে যে কোনও সময় আপনি এই নির্মাণটি দেখতে পাচ্ছেন, এর চেয়ে ভাল বিকল্প হ'ল হয় কোনও ফাংশনে অনুসন্ধানকে সজ্জিত করা:

def find_obj(search_key):
    for obj in objects:
        if obj.key == search_key:
            return obj

অথবা একটি তালিকা বোধগম্যতা ব্যবহার করুন:

matching_objs = [o for o in objects if o.key == search_key]
if matching_objs:
    print('Found {}'.format(matching_objs[0]))
else:
    print('No object found.')

এটি শব্দার্থগতভাবে অন্য দুটি সংস্করণের সমতুল্য নয়, তবে অ-পারফরম্যান্স সমালোচনামূলক কোডে যথেষ্ট ভাল কাজ করে যেখানে আপনি পুরো তালিকাটি পুনরাবৃত্তি করছেন কিনা তা বিবেচ্য নয়। অন্যরা দ্বিমত পোষণ করতে পারে তবে আমি ব্যক্তিগতভাবে উত্পাদন কোডে অন্যথায় বা অন্যদিকে ব্লক ব্যবহার করা এড়াতে পারি।

এছাড়াও [পাইথন-ধারণা] এর সংক্ষিপ্তসার ... অন্য থ্রেডগুলি


50
তালিকার বোঝাপড়াটি ভুল ওয়ান-লাইনার। আপনি হিসাবে, একটি আইটেম খুঁজছেন forলুপ উদাহরণ, এবং একটি জেনারেটর অভিব্যক্তি / তালিকা ধী ব্যবহার করতে চান, তাহলে আপনি চান next((o for o in objects if o.key == search_key), None)বা এটা মোড়ানো try/ exceptএবং পরিবর্তে কোনো ডিফল্ট মান ব্যবহার if/ else
agf

4
এবং ল্যান্স হেলস্টেনের উত্তরের মতো বাস্তব ঘটনাগুলিও রয়েছে যেখানে for/elseকনস্ট্রাক্ট ব্যবহার করা আরও ভাল ।
Andrean

5
চিয়ার্স। আমার কাছে খুব খারাপভাবে ইনডেন্ট করা ফাইল রয়েছে যেখানে elseএকটিটির সাথে জুটি বাঁধতে forপেরেছিল এবং আমার আইনানুগ হওয়ার কোনও ধারণা নেই।
ম্যাক্সিওউব

3
আমি মনে করি যে লুপটি সেখানে নির্মাণকারীর মধ্যে সবচেয়ে স্পষ্ট।
মাইলস রাউথ

14
এটি উল্লেখ করার মতো যে অন্যটি ধারাটি চলবে যদিও লুপের জন্য লুপের মান রয়েছে যদি না কোনও breakবিবৃতি এই উদাহরণের মতো স্পষ্টতাই চালিত না হয়। উপরের ডক্স থেকে: " elseক্লজটির আরও একটি অনুভূত সমস্যা রয়েছে: লুপটিতে কিছু না থাকলে break, elseধারাটি কার্যত অপ্রয়োজনীয়" " উদাহরণস্বরূপfor x in [1, 2, 3]:\n print x\n else:\n print 'this executes due to no break'
dhackner

585

একটি সাধারণ কনস্ট্রাক্ট হ'ল কিছু না পাওয়া পর্যন্ত একটি লুপ চালানো এবং তারপরে লুপটি ভেঙে ফেলা। সমস্যাটি হ'ল আমি লুপটি বা লুপ শেষ হয়ে গেলে আমার কেটি কেস হয়েছে তা নির্ধারণ করতে হবে। একটি পদ্ধতি হ'ল একটি পতাকা বা স্টোর ভেরিয়েবল তৈরি করা যা লুপটি কীভাবে বেরিয়ে এসেছিল তা দেখতে আমাকে দ্বিতীয় পরীক্ষা করতে দেয়।

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

পাইথন ব্যবহার করে for... elseআপনার কাছে নির্মাণ করুন

for i in mylist:
    if i == theflag:
        break
    process(i)
else:
    raise ValueError("List argument missing terminal flag.")

এটিকে এমন পদ্ধতির সাথে তুলনা করুন যা এই সিনট্যাকটিক চিনি ব্যবহার করে না:

flagfound = False
for i in mylist:
    if i == theflag:
        flagfound = True
        break
    process(i)

if not flagfound:
    raise ValueError("List argument missing terminal flag.")

প্রথম ক্ষেত্রে raiseলুপটি এটির সাথে কাজ করে তার জন্য দৃly়ভাবে আবদ্ধ। দ্বিতীয়টিতে বাঁধাই ততটা শক্তিশালী নয় এবং রক্ষণাবেক্ষণের সময় ত্রুটিগুলি প্রবর্তিত হতে পারে।


69
এটি নির্বাচিত উত্তরের চেয়ে এটি আরও ভালভাবে ব্যাখ্যা করে যেখানে লেখক আসলে-অন্যের জন্য কী পান না!
এরিকবওয়ার্ক

17
আমি বলতে চাই এই সিনট্যাকটিক চিনি আপনার প্রকল্পের দাঁত পচে যেতে পারে। এটি কোনও Python: the good partsবই তৈরি করবে না ।
বোটকোডার 17

1
আপনি কি নিশ্চিত করতে পারেন যে আপনার উদাহরণস্বরূপ, process(i)প্রতিটি আইটেমের জন্য mylistকঠোরভাবে আগে ঘটেছিল theflag, এবং theflagনিজেই নয়? এটা কি উদ্দেশ্য ছিল?
bli

4
processiতালিকায় উপস্থিত থাকা প্রত্যেকটির theflagউপরে পৌঁছানোর আগে কার্যকর করা হবে, এটি তালিকার উপাদানগুলির পরে theflagকার্যকর হবে না এবং এটি কার্যকর করা হবে না theflag
ল্যান্স হেলস্টন

1
অন্যের বিবৃতিতেও কার্যকর করা হয় যদি পুনরাবৃত্তিযোগ্যদের কোনও উপাদান না থাকে
হারানো ক্রটচেট

173

রাইমন্ড হেট্টিনারের একটি দুর্দান্ত উপস্থাপনা রয়েছে, যার রূপান্তর কোডটি বিউটিফুল, আইডিয়োম্যাটিক পাইথন-এ শিরোনাম রয়েছে , যেখানে তিনি সংক্ষেপে for ... elseনির্মাণের ইতিহাসকে সম্বোধন করেছেন । প্রাসঙ্গিক বিভাগটি 15:50 থেকে শুরু হয়ে প্রায় তিন মিনিট অব্যাহত রেখে "লুপগুলিতে একাধিক প্রস্থান পয়েন্টগুলিকে আলাদা করে" । এখানে উচ্চ পয়েন্ট:

  • for ... elseকনস্ট্রাক্ট নির্দিষ্ট জন্য একটি প্রতিস্থাপন হিসাবে ডোনাল্ড Knuth দ্বারা চিন্তিত ছিল GOTOব্যবহারের ক্ষেত্রে;
  • মূলশব্দটিকে পুনরায় ব্যবহার করা অর্থবোধ করে elseকারণ " নূথ এটিই ব্যবহার করেছিলেন এবং লোকেরা জানত যে, তখন [সমস্ত forবিবৃতি] একটি ifএবং GOTOনীচে এম্বেড করেছিল এবং তারা প্রত্যাশা করেছিল যে else";
  • অন্ধকারে, একে বলা উচিত ছিল "বিরতি" (বা সম্ভবত "নোব্রেক"), এবং তারপরে এটি বিভ্রান্তিকর হবে না *

সুতরাং, যদি প্রশ্নটি হয়, "তারা এই কীওয়ার্ডটি পরিবর্তন করে না কেন?" তারপরে ক্যাট প্লাস প্লাস সম্ভবত সবচেয়ে সঠিক উত্তর দিয়েছে - এই মুহুর্তে, বিদ্যমান কোডটির ব্যবহারিক হতে হবে এটি খুব ধ্বংসাত্মক হবে। তবে আপনি যে প্রশ্নটি সত্যিই জিজ্ঞাসা করছেন তা হ'ল elseপ্রথমে কেন পুনরায় ব্যবহার করা হয়েছিল, ভাল, স্পষ্টতই মনে হয়েছিল সেই সময়টিতে এটি একটি ভাল ধারণা বলে মনে হয়েছিল।

ব্যক্তিগতভাবে, লুপের অন্তর্ভুক্ত হিসাবে এক নজরে, # no breakযেখানে elseভুল হতে পারে সেখানে লাইনটিতে মন্তব্য করার সমঝোতা আমার পছন্দ হয়েছে । এটি যুক্তিযুক্তভাবে পরিষ্কার এবং সংক্ষিপ্ত। এই বিকল্পটি সংক্ষিপ্তসারটির একটি সংক্ষিপ্ত উল্লেখ পেয়েছে যা বজর্ন তার উত্তর শেষে যুক্ত করেছে:

সম্পূর্ণতার জন্য, আমার উল্লেখ করতে হবে যে সিনট্যাক্সে সামান্য পরিবর্তন আনার সাথে, প্রোগ্রামাররা যারা এই বাক্য গঠনটি চান তারা এখনই এটি পেতে পারেন:

for item in sequence:
    process(item)
else:  # no break
    suite

* ভিডিওর সেই অংশের বোনাসের উদ্ধৃতি: "আমরা যদি ল্যাম্বদাটিকে মেকফিউশন বলেছিলাম, কেউ জিজ্ঞাসা করবে না, ' ল্যাম্বদা কী করে?"


33

কারণ তারা ভাষায় কোনও নতুন কীওয়ার্ড প্রবর্তন করতে চায়নি। প্রত্যেকেই একটি শনাক্তকারীকে চুরি করে এবং পিছনের দিকে সামঞ্জস্যতা সমস্যার কারণ হয়ে থাকে, তাই এটি সাধারণত একটি শেষ অবলম্বন।


2
মনে finallyহয় এমন ক্ষেত্রে আরও ভাল পছন্দ হত। এই কনস্ট্রাক্টটি চালু হওয়ার সময় কী শেষ পর্যন্ত কীওয়ার্ডটি উপস্থিত ছিল না?
পোনকাদুডল

26
@ ওয়ালাকোলো এর finallyচেয়ে বেশি ভাল নয়, কারণ এটি বোঝায় যে ব্লকটি সর্বদা লুপের পরে কার্যকর করা হবে এবং এটি হয় না (কারণ এটি কেবল লুপটির পরে চালানোর জন্য কোডটি রেখে ফালতু হতে হবে)।
ক্যাট প্লাস প্লাস

এটিও হতে পারে না finallyকারণ অন্য ক্লজটি কার্যকর করা হয় যখন continueলুপের জন্য ব্যবহৃত হয় - এটি সম্ভবত বহুবার এবং কেবল শেষে নয়।
pepr

6
@ পেপার elseক্লজ এক্সিকিউশন continue( দস্তাবেজ এবং পরীক্ষার কোড ) দ্বারা প্রভাবিত হয় না
এয়ার

@ এয়ারথোমাস: +1। তুমি ঠিক. elseমৃত্যুদন্ড কার্যকর করা হয় শুধুমাত্র যখন continueগত পুনরাবৃত্তির জন্য একজন।
পিআরপি

33

এটিকে সহজ করার জন্য, আপনি এটি এর মতো ভাবতে পারেন;

  • এটি লুপে breakকমান্ডের মুখোমুখি হলে for, elseঅংশটি কল করা হবে না।
  • এটি লুপে breakকমান্ডের মুখোমুখি না forহলে elseঅংশটি কল করা হবে।

অন্য কথায়, লুপের পুনরাবৃত্তির জন্য যদি "ভাঙ্গা" না হয় breakতবে elseঅংশটি কল করা হবে।


elseব্লক যদি লুপ শরীরের একটি ব্যতিক্রম উত্থাপন না মৃত্যুদন্ড কার্যকর করা হবে না।
অমল কে

17

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

for a in range(3):
    print(a)
    if a==4: # change value to force break or not
        break
else: #no break  +10 for whoever thought of this decoration
    print('for completed OK')

print('statement after for loop')

"বিরতিটি ব্লকটি থেকে ঝাঁপিয়ে পড়ে, এবং তাই 'অন্য' ধারাটি 'ওপরে' লাফিয়ে যায় - যদিও এটি" পাওয়ার " for:/ এর উপায় হিসাবে সহায়ক হতে পারে তবে else:এটি কীওয়ার্ডটির পক্ষে সত্যতা প্রমাণ করে না else। এখানে দেওয়া ফ্রেমিং দেওয়া, দেখে then:মনে হচ্ছে এটি অনেক বেশি প্রাকৃতিক হবে। (সেখানে হয় কারণ elseমনোনীত হচ্ছে, অন্যান্য উত্তর দেওয়া - তারা শুধু করছি এখানে প্রদান করেননি।)
মার্ক এ Amery

15

আমি মনে করি নথিপত্রের একটি দুর্দান্ত ব্যাখ্যা করেছেন আর , অবিরত

[...] তালিকার ক্লান্তির মাধ্যমে লুপটি শেষ হয়ে গেলে (সাথে সহ) বা শর্তটি মিথ্যা (যখন সহ) হয়ে যায়, তবে যখন লুপটি ব্রেক স্টেটমেন্ট দ্বারা সমাপ্ত হয় তখন এটি সম্পাদন করা হয়।

উত্স: পাইথন 2 ডক্স: নিয়ন্ত্রণ প্রবাহ সম্পর্কিত টিউটোরিয়াল


13

আমি এটি কিছু পড়তে:

যদি এখনও লুপটি চালানোর শর্তে থাকে তবে স্টাফ করুন, অন্য কিছু করুন।


শর্তগুলির বিষয়ে আপনার এখনও সহায়ক (+1) যদিও এটি ভুল - এটি মানব ;-)
ওল্ফ

-1; for:/ এর এই উচ্চারণটি else:এটিকে শব্দ করে তোলে যেন else:সর্বদা লুপের পরে চলবে, যা এটি নয়।
মার্ক অ্যামেরি

11

প্রযুক্তিগত অংশটি যেহেতু বেশ উত্তর পেয়েছে, তাই আমার মন্তব্যটি এই পুনর্ব্যবহৃত কীওয়ার্ডটি তৈরি করে এমন বিভ্রান্তির সাথে সম্পর্কিত ।

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

পরিবর্তে, এই কীওয়ার্ডটি whileএবং forবিবৃতিগুলির সাথে ব্যবহার বিভ্রান্তি সৃষ্টি করে। কারণ, প্রোগ্রামার হিসাবে আমাদের ক্যারিয়ার আমাদের শিখিয়েছে যে elseবিবৃতিটি সিদ্ধান্তের গাছের মধ্যেই থাকে; এর যৌক্তিক সুযোগ , একটি মোড়ক যা শর্তাধীনভাবে অনুসরণের জন্য কোনও পথ ফেরায়। এদিকে লুপের বিবৃতিগুলির কোনও কিছুর কাছে পৌঁছানোর লক্ষণীয় স্পষ্ট লক্ষ্য রয়েছে। প্রক্রিয়াটির ক্রমাগত পুনরাবৃত্তির পরে লক্ষ্যটি পূরণ করা হয়।

if / else অনুসরণ করতে একটি পথ নির্দেশ করুন । লুপগুলি "লক্ষ্য" শেষ না হওয়া অবধি কোনও পথ অনুসরণ করে

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

শেষে, কীওয়ার্ডটি পাইথনে থাকবে। এটি পরিষ্কার ছিল যে এটি ভুল ছিল, পরিষ্কার যখন প্রতিটি প্রোগ্রামার কিছু স্মৃতিগত ডিভাইসের মতো এর ব্যবহারটি বোঝার জন্য একটি গল্প নিয়ে আসে। যদি তারা পরিবর্তে কীওয়ার্ডটি পছন্দ করে থাকে তবে আমি পছন্দ করতাম then। আমি বিশ্বাস করি যে এই শব্দ তড়কা পুরোপুরি যে পুনরাবৃত্ত প্রবাহিত প্রতিদান লুপ পরে।

এটি এমন পরিস্থিতিটির সাথে সাদৃশ্যপূর্ণ যে কোনও খেলনা খেলনা জড়ো করার প্রতিটি পদক্ষেপ অনুসরণ করার পরে: এবং তারপর বাবা কী?


আমি মনে করি যে এই উত্তরটি বিভ্রান্তির বিষয়টিকে সম্বোধন করে বলে আমি মনে করি যে ওপি কথা বলছিল। অন্যটির কীওয়ার্ডটি যখন এর ক্রিয়াতে সংযুক্ত থাকে তখন আপনি অন্যরকম ইংরেজি অর্থের কাছ থেকে যা প্রত্যাশা করেন তার ঠিক বিপরীত কাজ করে। তত্ত্ব অনুসারে, ... অন্যটি অন্যরকমভাবে কাজ করতে পারত যে লুপটি ভেঙে যাওয়ার পরে আপনি অন্য অংশে শেষ হয়ে যেতে পারেন, তবে সমস্যাটি হ'ল এক্সটি এলিমেন্ট খুঁজে পেতে এবং এক্সটি কেসটি পরিচালনা করার জন্য এটি ব্যবহার করা উচিত খুঁজে পাওয়া যায় নি, আপনাকে পুরো পতাকা ব্যবহার করার পরে একটি পতাকা বা অন্য কোনও পরীক্ষা ব্যবহার করতে হতে পারে .. অন্যথায় নির্মাণ করুন
স্পেসেন জ্যাসেট

7

আমি এটি পড়লাম "যখন যখন iterableসম্পূর্ণরূপে নিঃশেষ হয়ে যায় এবং কার্যকর করার পরে পরবর্তী বিবৃতিতে কাজ শেষ হয় for, অন্য ধারাটি কার্যকর করা হবে।" সুতরাং, যখন পুনরাবৃত্তিটি ভেঙে যায় break, এটি কার্যকর করা হবে না।


6

আমি সম্মত হই, এটি আরও বেশি 'এলিফের মতো নয় (শর্তে) উত্থাপন]' like

আমি জানি এটি একটি পুরানো থ্রেড, তবে আমি এখনই একই প্রশ্নের সন্ধান করছি এবং আমি নিশ্চিত নই যে এই প্রশ্নের উত্তরটি যেভাবে আমি বুঝতে পেরেছি কেউ তা গ্রহণ করেছে।

আমার জন্য, elseইন For... elseবা While... elseস্টেটমেন্টগুলিতে "পড়ার" তিনটি উপায় রয়েছে , যেগুলির সমস্ত সমতুল্য:

  1. else == if the loop completes normally (without a break or error)
  2. else == if the loop does not encounter a break
  3. else == else not (condition raising break) (সম্ভবতঃ এরকম একটি অবস্থা রয়েছে, বা আপনার কোনও লুপ নেই)

সুতরাং, মূলত, একটি লুপের "অন্য" আসলেই একটি "এলিফ ..." যেখানে '...' (1) কোন বিরতি নয়, যা (2) নয় [শর্ত (গুলি) বাড়ানোর ব্রেক] এর সমান।

আমি মনে করি কীটি হ'ল else'বিরতি' ব্যতীত অর্থহীন, সুতরাং এর মধ্যে একটি for...elseরয়েছে:

for:
    do stuff
    conditional break # implied by else
else not break:
    do more stuff

সুতরাং, একটি for...elseলুপের প্রয়োজনীয় উপাদানগুলি নিম্নরূপ: এবং আপনি এগুলি সরল ইংরেজীতে পড়বেন:

for:
    do stuff
    condition:
        break
else: # read as "else not break" or "else not condition"
    do more stuff

অন্য পোস্টারগুলি যেমন বলেছে, আপনার লুপটি কী সন্ধান করছে তা সনাক্ত করতে সক্ষম হয়ে সাধারণত একটি বিরতি উত্থাপিত হয়, তাই else: "লক্ষ্য আইটেমটি না থাকলে কী করতে হবে" তা হয়ে যায়।

উদাহরণ

আপনি ব্যতিক্রম হ্যান্ডলিং, ব্রেক এবং সমস্ত একসাথে লুপগুলির জন্যও ব্যবহার করতে পারেন।

for x in range(0,3):
    print("x: {}".format(x))
    if x == 2:
        try:
            raise AssertionError("ASSERTION ERROR: x is {}".format(x))
        except:
            print(AssertionError("ASSERTION ERROR: x is {}".format(x)))
            break
else:
    print("X loop complete without error")

ফলাফল

x: 0
x: 1
x: 2
ASSERTION ERROR: x is 2
----------
# loop not completed (hit break), so else didn't run

উদাহরণ

বিরতিতে আঘাত হানার সাথে সাধারণ উদাহরণ।

for y in range(0,3):
    print("y: {}".format(y))
    if y == 2: # will be executed
        print("BREAK: y is {}\n----------".format(y))
        break
else: # not executed because break is hit
    print("y_loop completed without break----------\n")

ফলাফল

y: 0
y: 1
y: 2
BREAK: y is 2
----------
# loop not completed (hit break), so else didn't run

উদাহরণ

সাধারণ উদাহরণ যেখানে বিরতি নেই, কোনও শর্ত বিরতি উত্থাপন করে না এবং কোনও ত্রুটির মুখোমুখি হয় না।

for z in range(0,3):
     print("z: {}".format(z))
     if z == 4: # will not be executed
         print("BREAK: z is {}\n".format(y))
         break
     if z == 4: # will not be executed
         raise AssertionError("ASSERTION ERROR: x is {}".format(x))
else:
     print("z_loop complete without break or error\n----------\n")

ফলাফল

z: 0
z: 1
z: 2
z_loop complete without break or error
----------

6

elseশব্দ এখানে বিভ্রান্তিকর হতে পারে, এবং হিসাবে অনেক মানুষ বাইরে ভালো কিছু নির্দিষ্ট nobreak,notbreak আরো উপযুক্ত।

for ... else ...যৌক্তিকভাবে বোঝার জন্য , এটির সাথে তুলনা করুন try...except...else, নয় if...else..., পাইথন প্রোগ্রামারদের বেশিরভাগই নিম্নলিখিত কোডের সাথে পরিচিত:

try:
    do_something()
except:
    print("Error happened.") # The try block threw an exception
else:
    print("Everything is find.") # The try block does things just find.

একইভাবে, breakএকটি বিশেষ ধরণের হিসাবে মনে করুন Exception:

for x in iterable:
    do_something(x)
except break:
    pass # Implied by Python's loop semantics
else:
    print('no break encountered')  # No break statement was encountered

পার্থক্যটি pythonবোঝানো হয়েছে except breakএবং আপনি এটি লিখতে পারবেন না, তাই এটি হয়ে যায়:

for x in iterable:
    do_something(x)
else:
    print('no break encountered')  # No break statement was encountered

হ্যাঁ, আমি জানি এই তুলনাটি কঠিন এবং ক্লান্তিকর হতে পারে, তবে এটি বিভ্রান্তিকে পরিষ্কার করে দেয়।


আপনি যখন এটি থেকে অনুলিপি করবেন তখন আপনার উত্সটিতে একটি লিঙ্ক তৈরি করা উচিত: নিক কোঘলানের পাইথন নোটস
Godaygo

লিঙ্কের জন্য @godaygo ধন্যবাদ। আমি প্রথম পাইথন শিখতে গিয়ে ধারণাটি পড়েছি এবং গ্রহণ করি, উত্তরটি লেখার সময় উত্সটি মুখস্থ করে নি।
সিজিক্সগুলি

@ সিজিক্সস আপনি " উত্সটি মুখস্থ করেননি" তবে কেবলমাত্র মন্তব্যের সম্পূর্ণ বাক্যগুলিকে মূলটির সাথে মিল রেখেই ঘটেছে? Ooookaaaay।
মার্ক আমেরি

5

লুপটি ভাঙ্গা হয়নি elseতখন স্টেটমেন্ট ব্লকের কোডগুলি কার্যকর করা forহবে।

for x in xrange(1,5):
    if x == 5:
        print 'find 5'
        break
else:
    print 'can not find 5!'
#can not find 5!

দস্তাবেজগুলি থেকে : বিবৃতিগুলি ভাঙ্গুন এবং চালিয়ে যান, এবং অন্যথায় লুপগুলিতে ক্লজ

লুপের বিবৃতিতে অন্য একটি ধারা থাকতে পারে; তালিকার ক্লান্তির মাধ্যমে লুপটি শেষ হয়ে গেলে (সাথে সহ) বা শর্তটি মিথ্যা হয়ে গেলে (যখন সাথে থাকে) তা কার্যকর করা হয় তবে ব্রেক স্টেটমেন্টের সাহায্যে লুপটি সমাপ্ত হয় না not এটি নিম্নলিখিত লুপ দ্বারা উদাহরণস্বরূপ, যা প্রধান সংখ্যাগুলি অনুসন্ধান করে:

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         # loop fell through without finding a factor
...         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

(হ্যাঁ, এটি সঠিক কোড closely নিবিড়ভাবে দেখুন: অন্য ধারাটি লুপের সাথে সম্পর্কিত, যদি বিবৃতি নয় not)

যখন একটি লুপের সাথে ব্যবহার করা হয়, অন্য ধারাটি চেষ্টা স্টেটমেন্টের অন্য ক্লজের সাথে মিল থাকলে তার চেয়ে বেশি মিল থাকে: যদি কোনও ব্যতিক্রম না ঘটে তখন ট্রাই স্টেটমেন্টের অন্য ধারাটি চলে এবং লুপের অন্য ক্লজটি চলতে থাকে । চেষ্টা বিবৃতি এবং ব্যতিক্রম সম্পর্কিত আরও তথ্যের জন্য, ব্যতিক্রমগুলি পরিচালনা করা দেখুন see

চালিয়ে যাওয়া বিবৃতি, সি থেকেও ধার নেওয়া লুপের পরবর্তী পুনরাবৃত্তির সাথে অব্যাহত থাকে:

>>> for num in range(2, 10):
...     if num % 2 == 0:
...         print("Found an even number", num)
...         continue
...     print("Found a number", num)
Found an even number 2
Found a number 3
Found an even number 4
Found a number 5
Found an even number 6
Found a number 7
Found an even number 8
Found a number 9

1
এটি কিছুই যোগ করে না এবং প্রশ্নের উত্তর দেয় না, যা কীভাবে নয় তবে কেন
এয়ার

5

এখানে এটি সম্পর্কে চিন্তা করার একটি উপায় যা আমি উপরে আর কাউকে উল্লেখ করতে দেখিনি:

প্রথমে মনে রাখবেন যে লুপগুলি মূলত যখন লুপগুলি প্রায় থাকে কেবল সিনট্যাকটিক চিনি। উদাহরণস্বরূপ, লুপ

for item in sequence:
    do_something(item)

(প্রায়) হিসাবে পুনরায় লেখা যেতে পারে

item = None
while sequence.hasnext():
    item = sequence.next()
    do_something(item)

দ্বিতীয়ত, মনে রাখবেন যে যখন-লুপগুলি মূলত কেবল-যদি ব্লকগুলি পুনরাবৃত্তি হয়! আপনি "যদি এই অবস্থাটি সত্য হয় তবে শরীরকে কার্যকর করুন, তারপরে ফিরে এসে আবার যাচাই করুন" হিসাবে কিছুক্ষণ লুপ পড়তে পারেন।

সুতরাং / অন্যটি সঠিকভাবে বোঝায়: এটি ঠিক একই কাঠামো যেমন / অন্যটি, লুপিংয়ের যুক্ত কার্যকারিতা সহ শর্তটি একবারে একবারে পরীক্ষা করার পরিবর্তে শর্তটি মিথ্যা না হওয়া পর্যন্ত।

এবং তারপরে / অন্যটিও নিখুঁত ধারণা দেয়: কারণ সমস্ত লুপগুলি যখন লুপগুলির উপরে থাকে কেবল সিনট্যাকটিক চিনি, আপনার কেবলমাত্র লুপটির অন্তর্নিহিত শর্তসাপেক্ষ কী তা নির্ধারণ করতে হবে এবং তারপরে অন্যটি তার সাথে মিলে যায় শর্তটি মিথ্যা হয়ে যায়।


4

দুর্দান্ত উত্তরগুলি হ'ল:

  • এই যা ইতিহাস ব্যাখ্যা, এবং
  • এটি আপনার অনুবাদ / বুঝতে সহজ করার জন্য সঠিক প্রশংসা দেয়।

ডোনাল্ড নুথ একবার যা বলেছিলেন (দুঃখের সাথে রেফারেন্সটি খুঁজে পাচ্ছেন না) এখানে আমার নোটটি এসেছে যেখানে এমন একটি নির্মাণ রয়েছে যেখানে অন্যথায় যদি পাইথন থেকে পৃথক করা যায়:

x = 2
while x > 3:
    print("foo")
    break
else:
    print("boo")

একই প্রবাহ রয়েছে (নিম্ন স্তরের পার্থক্যগুলি বাদ দিয়ে):

x = 2
if x > 3:
    print("foo")
else:
    print("boo")

মুল বক্তব্যটি হ'ল যদি-অন্যকে সিনট্যাকটিক চিনির হিসাবে বিবেচনা করা যায় তবে অন্যটি যা breakএর ifব্লকের শেষে অন্তর্ভুক্ত থাকে । বিপরীত প্রভাব, যে whileলুপটি এক্সটেনশন হয় if, এটি বেশি সাধারণ (এটি কেবল পুনরাবৃত্তি / লুপযুক্ত শর্তযুক্ত চেক), কারণ ifপ্রায়শই আগে শেখানো হয় while। তবে এটি সত্য নয় কারণ এর অর্থ হ'ল elseব্লক ইন-অন্য সময় প্রতিটি সময় কার্যকর করা হবে শর্তটি মিথ্যা হলে ।

আপনার বোধগম্যতাটিকে সেভাবে এটি ভাবতে সহজ করার জন্য:

ছাড়া break, returnইত্যাদি, লুপটি কেবল তখনই শেষ হয় যখন শর্তটি আর সত্য হয় না এবং এরকম ক্ষেত্রে elseব্লকটিও একবার কার্যকর করা হবে। পাইথনের ক্ষেত্রে forআপনাকে অবশ্যই সি-স্টাইলের forলুপগুলি বিবেচনা করতে হবে (শর্তাদি সহ) বা এগুলিতে অনুবাদ করতে হবে while

আরেকটি নোট:

অকাল break, returnইত্যাদি ভিতরে লুপ কারণ মৃত্যুদন্ড গোষ্ঠীর বাইরে jumped যখন শর্ত সত্য ছিল এবং এটি কখনোই ফিরে আসা আবার চেক করতে হবে শর্ত মিথ্যা পরিণত অসম্ভব করে তোলে।


3

আপনি elseবাকী জিনিসগুলির মতো বা অন্যান্য স্টাফের মতো এটি ভাবতে পারেন যা লুপে করা হয়নি।


3
for i in range(3):
    print(i)

    if i == 2:
        print("Too big - I'm giving up!")
        break;
else:
    print("Completed successfully")

"অন্য" এখানে ক্রেজি সহজ সরল, ঠিক আছে

1, "যদি for clauseসম্পন্ন হয়"

for i in range(3):
    print(i)

    if i == 2:
        print("Too big - I'm giving up!")
        break;
if "for clause is completed":
    print("Completed successfully")

"ক্লজটি সম্পূর্ণ হয়ে গেছে" এর মতো দীর্ঘ বিবৃতি লেখার পক্ষে তাত্পর্যপূর্ণ, তাই তারা "অন্য" পরিচয় করিয়ে দেয়।

else এখানে তার প্রকৃতি যদি একটি হয়।

2, তবে, কেমন for clause is not run at all

In [331]: for i in range(0):
     ...:     print(i)
     ...: 
     ...:     if i == 9:
     ...:         print("Too big - I'm giving up!")
     ...:         break
     ...: else:
     ...:     print("Completed successfully")
     ...:     
Completed successfully

সুতরাং এটি সম্পূর্ণ বিবৃতি যুক্তিযুক্ত সংমিশ্রণ:

if "for clause is completed" or "not run at all":
     do else stuff

বা এটি এইভাবে রাখুন:

if "for clause is not partially run":
    do else stuff

বা এইভাবে:

if "for clause not encounter a break":
    do else stuff

অন্যথায় এসকিউএলে "লেনদেন" হিসাবে কাজ করে।
ক্যালকুলাস

2

এখানে অনুসন্ধানের পাশাপাশি আরও একটি প্রতিমা ব্যবহারের মামলা রয়েছে। ধরা যাক আপনি কোনও শর্তটি সত্য হওয়ার জন্য অপেক্ষা করতে চেয়েছিলেন, উদাহরণস্বরূপ, কোনও সময়সীমা সহ একটি পোর্ট কোনও দূরবর্তী সার্ভারে খোলা থাকবে। তারপরে আপনি while...elseএরকম একটি নির্মাণ কাজে লাগাতে পারেন:

import socket
import time

sock = socket.socket()
timeout = time.time() + 15
while time.time() < timeout:
    if sock.connect_ex(('127.0.0.1', 80)) is 0:
        print('Port is open now!')
        break
    print('Still waiting...')
else:
    raise TimeoutError()

1

আমি নিজেই আবার এটি বোঝার চেষ্টা করছিলাম। আমি খুঁজে পেয়েছি যে নিম্নলিখিত সাহায্য করে!

elseলুপটির ifঅভ্যন্তরে (জোড়ার পরিবর্তে for) জোড় করা হিসাবে ভাবুন - শর্তটি পূরণ হলে লুপটি ভেঙে ফেলুন, অন্যথায় এটি করুন - ব্যতীত এটি elseএকাধিক ifs এর সাথে যুক্ত হয় !
No যদি কোনও ifএস মোটেই সন্তুষ্ট না হন তবে তা করুন else
Multiple একাধিক ifগুলি আসলে হিসাবে হিসাবে চিন্তা করা যেতে পারে if- elifগুলি!


-2

আমি কাঠামোটিকে (যদি) অন্য অন্য বি হিসাবে বিবেচনা করি, এবং (যদি) -এর জন্য একটি বিশেষ যদি অন্যথায় হয় , মোটামুটিভাবে । এটি অন্য বুঝতে সাহায্য করতে পারে ।

A এবং B একবারে মৃত্যুদন্ড কার্যকর করা হয় যা অন্য-কাঠামোর মতো the

(যদি) একটি বিশেষ হিসাবে বিবেচিত হতে পারে if, যদি একটি শর্ত পূরণের চেষ্টা করতে একটি লুপ করে। যদি শর্তটি পূরণ হয় তবে ক এবং বিরতি ; অন্য , বি।


-2

পাইথন লুপগুলির পরে এবং এর পরে অন্য কোনও ব্যবহার করে যাতে লুপের জন্য যদি কিছুই প্রয়োগ না হয় তবে অন্য কিছু ঘটে। উদাহরণ স্বরূপ:

test = 3
while test == 4:
     print("Hello")
else:
     print("Hi")

আউটপুট বার বার 'হাই' হবে (আমি সঠিক হলে)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.