বিবৃতি দেওয়ার সময় পাইথনের অন্য একটি ধারা use


321

পাইথনে নিম্নলিখিত কোডটি আইনী বলে আমি লক্ষ্য করেছি। আমার প্রশ্ন কেন? একটি নির্দিষ্ট কারণ আছে?

n = 5
while n != 0:
    print n
    n -= 1
else:
    print "what the..."

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

5
@ নিকোলাস নাইট - হ্যাঁ, প্রলোভনযুক্ত হলেও এটি সম্ভবত এমন কিছু হতে পারে যা আমি প্রথম নজরে বুঝেছিলাম। অন্য যে কোনও দরিদ্র এসপকে ভাষার বৈশিষ্টটি দেখতে হবে, বা সময়মতো ফিরে এসে স্টা-হিইয়ই এখানে একটি প্রশ্ন পোস্ট করতে হবে ...
যথাক্রমে

8
'অন্য' বেছে নেওয়ার পিছনে ধারণাটি হ'ল এই কনস্ট্রাক্টটি প্রায়শই লুপের ভিতরে 'if X: ব্রেক' এর সাথে মিলিত হিসাবে ব্যবহৃত হয়। যেহেতু আমরা যদি লুপটি না ভাঙ্গি তবে 'অন্য' ধারাটি কার্যকর করা হয়, এটি 'if' কে 'অন্য' এর জন্য একটি কিন্ডা-বাছা তৈরি করে।
জোনাথন হার্টলি

12
তাদের এটি নামকরণ করা উচিত after:
nnot101

উত্তর:


388

elseযখন আপনার whileশর্তটি মিথ্যা হয়ে যায় তখনই এই ধারাটি কার্যকর করা হয় । আপনি যদিbreak লুপ থেকে বাইরে চলে যান বা কোনও ব্যতিক্রম উত্থাপিত হয় তবে তা কার্যকর করা হবে না।

এটির বিষয়ে চিন্তা করার এক উপায় হ'ল যদি / অন্যটি শর্তের সাথে সম্মত হয়:

if condition:
    handle_true()
else:
    handle_false()

লুপিং নির্মাণের সাথে সাদৃশ্যপূর্ণ:

while condition:
    handle_true()
else:
    # condition is false now, handle and go on with the rest of the program
    handle_false()

উদাহরণটি এই লাইনের সাথে থাকতে পারে:

while value < threshold:
    if not process_acceptable_value(value):
        # something went wrong, exit the loop; don't pass go, don't collect 200
        break
    value = update(value)
else:
    # value >= threshold; pass go, collect 200
    handle_threshold_reached()

42
"অন্য ধারাটি কেবল তখনই কার্যকর করা হয় যখন আপনার সময় শর্তটি মিথ্যা হয়ে যায়।" এখানে শব্দটি বোঝায় যে আপনার সময়কালের সত্য থেকে মিথ্যা হয়ে যায় এবং অন্যটির চেয়ে কার্যকর হবে exec যাইহোক, যদি সময়টি কখনই সত্য না হয় তবে অন্য ধারাটি এখনও কার্যকর করা হবে।
ব্যবহারকারী597608

pseudocode হয় তাই আমাকে সংশোধন করে আমি ভুল, কিন্তু এই যেমন ঠিক একই while {} something ব্যতীত যে somethingআপনি এড়ানো হবে breakমধ্যে whileলুপ।
ড্যানিয়েল ক্যাপলান

2
সম্ভবত সবচেয়ে সুনির্দিষ্ট সিউডোকোড হতে পারে: যখন (সত্য) - যদি (কনড) {হ্যান্ডেল_ট্রু (); } অন্য {হ্যান্ডেল_ফালস (); বিরতি; }}
ভিনগারিয়া

2
"যান না, 200 সংগ্রহ করবেন না", হাহা, যারা এখান থেকে জানেন তাদের প্রত্যেকেরই শৈশবকাল
স্টিফান অক্টাভিয়ান

102

elseলুপের শর্তটিকে আঘাত করে বা একটি চেষ্টা ব্লকের নীচে পড়ে গিয়ে আপনি যদি কোনও ব্লকটি স্বাভাবিকভাবে প্রস্থান করেন তবে এই ধারাটি কার্যকর করা হবে। এটি কার্যকর করা হয় না যদি আপনি breakবা returnকোনও ব্লক বাইরে থাকেন বা ব্যতিক্রম উত্থাপন করেন। এটি কেবল যখন এবং লুপগুলির জন্যই নয়, তবে ব্লকগুলি চেষ্টা করে।

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

for value in values:
    if value == 5:
        print "Found it!"
        break
else:
    print "Nowhere to be found. :-("

1
আসলে একটি জিনিস জন্য একটি মোটামুটি দরকারী নির্মাণ। found_it=Falseলুপের শুরুতে আমি কতবার রেখেছি তা জানেন না , এবং তারপরে found_itশেষে যদি একটি চেক করেন
ক্রুঙ্কার

42

এর উত্তরে Is there a specific reason?, এখানে একটি আকর্ষণীয় অ্যাপ্লিকেশন: একাধিক স্তরের লুপিং ভেঙে দেওয়া।

এটি এখানে কীভাবে কাজ করে তা হল: বাইরের লুপটির শেষে একটি বিরতি রয়েছে, সুতরাং এটি কেবল একবার কার্যকর করা হবে। তবে, যদি অভ্যন্তরীণ লুপটি সম্পূর্ণ করে (কোনও বিভাজক খুঁজে পায় না), তবে এটি অন্য বিবৃতিতে পৌঁছে যায় এবং বাইরের বিরতি কখনই পৌঁছায় না। এইভাবে, অভ্যন্তরীণ লুপের একটি বিরতি কেবল একটি না হয়ে উভয় লুপকে ভেঙে ফেলবে।

for k in [2, 3, 5, 7, 11, 13, 17, 25]:
    for m in range(2, 10):
        if k == m:
            continue
        print 'trying %s %% %s' % (k, m)
        if k % m == 0:
            print 'found a divisor: %d %% %d; breaking out of loop' % (k, m)
            break
    else:
        continue
    print 'breaking another level of loop'
    break
else:
    print 'no divisor could be found!'

উভয় whileএবং forলুপগুলির জন্য, elseবিবৃতিটি শেষ পর্যন্ত কার্যকর করা হয়, যদি না হয়break ব্যবহৃত হয়।

বেশিরভাগ ক্ষেত্রে এটি করার আরও ভাল উপায় রয়েছে (এটি কোনও ফাংশনে আবৃত করা বা একটি ব্যতিক্রম উত্থাপন), তবে এটি কার্যকর!


1
আমি ডাউনভোট করি নি তবে আমি মনে করি কেন জানি কেউ করেছে। আপনি প্রশ্নের উত্তর দিচ্ছেন না এবং আপনি কেবল 2 লাইনের বর্ণনার সাথে 14 লাইন কোড সরবরাহ করছেন। যদি জিজ্ঞাসা করা প্রশ্নটির কোনও প্রাসঙ্গিকতা থাকে তবে আপনি আমাদের বলছেন না ...
ব্লুইয়েল

1
প্রতিক্রিয়াটির জন্য ব্লুএল ধন্যবাদ! আমি কোড সম্পর্কে আরও ব্যাখ্যা যুক্ত করেছি এবং এটি আরও পরিষ্কার করে দিয়েছি যে এটি কীভাবে প্রশ্নের উত্তর দেয় (কারণ এটি এর একটি অংশের উত্তর দেয়)।
চিহ্নিত করুন

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

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

উদাহরণটি অন্যদের জন্য ব্যবহার দেখায় তবে প্রশ্নটি বিশেষত যখন / অন্য সময়ে ছিল ।
আয়ান গোল্ডবি

20

অন্য শর্তটি কার্যকর করা হয় যখন যখন শর্তটি মিথ্যাতে মূল্যায়ন করে।

ডকুমেন্টেশন থেকে :

মতামতটি যতক্ষণ সত্য প্রকাশিত হয় ততক্ষণ পুনরাবৃত্তি কার্যকর করার জন্য ব্যবহৃত হয়:

while_stmt ::=  "while" expression ":" suite
                ["else" ":" suite]

এটি বারবার অভিব্যক্তি পরীক্ষা করে এবং, যদি এটি সত্য হয় তবে প্রথম স্যুটটি কার্যকর করে; যদি অভিব্যক্তিটি মিথ্যা হয় (যা প্রথমবার এটি পরীক্ষিত হতে পারে) elseক্লজের স্যুট , যদি উপস্থিত থাকে তবে কার্যকর হয় এবং লুপটি বন্ধ হয়।

breakপ্রথম স্যুটটিতে কার্যকর করা একটি বিবৃতি elseক্লজের স্যুটটি কার্যকর না করে লুপটি সমাপ্ত করে । continueপ্রথম স্যুটটিতে মৃত্যুদন্ড কার্যকর করা একটি বিবৃতি বাকী স্যুটকে এড়িয়ে যায় এবং অভিব্যক্তিটি পরীক্ষা করতে ফিরে যায়।


15

আমার উত্তরটি যখন আমরা / অন্যদিকে ব্যবহার করতে পারি তখন ফোকাস করবে।

প্রথম নজরে, মনে হয় ব্যবহার করার সময় আলাদা কিছু নেই

while CONDITION:
    EXPRESSIONS
print 'ELSE'
print 'The next statement'

এবং

while CONDITION:
    EXPRESSIONS
else:
    print 'ELSE'
print 'The next statement'

কারণ print 'ELSE'বিবৃতি সর্বদা উভয় ক্ষেত্রেই কার্যকর করা হয় বলে মনে হয় ( whileলুপ শেষ হয়ে গেলে বা না চালানো উভয়ই )।

তারপরে, যখন স্টেটমেন্টটি print 'ELSE'কার্যকর হবে না তখনই এটি আলাদা । এটি যখন breakকোড ব্লকের অভ্যন্তরে থাকেwhile

In [17]: i = 0

In [18]: while i < 5:
    print i
    if i == 2:
        break
    i = i +1
else:
    print 'ELSE'
print 'The next statement'
   ....:
0
1
2
The next statement

যদি ভিন্ন হয়:

In [19]: i = 0

In [20]: while i < 5:
    print i
    if i == 2:
        break
    i = i +1
print 'ELSE'
print 'The next statement'
   ....:
0
1
2
ELSE
The next statement

return এই বিভাগে নেই, কারণ এটি উপরের দুটি ক্ষেত্রে একই প্রভাব ফেলে।

ব্যতিক্রম উত্থাপনও তফাত সৃষ্টি করে না, কারণ যখন এটি উত্থাপিত হয়, যেখানে পরবর্তী কোডটি কার্যকর করা হবে ব্যতিক্রম হ্যান্ডলার (ব্লক ব্যতীত), elseক্লজ বা ডান পরে ডানদিকে কোড whileকার্যকর করা হবে না।


4

আমি জানি এটি পুরানো প্রশ্ন তবে ...

রেমন্ড হেটেঞ্জার যেমন বলেছিলেন, তার while/no_breakপরিবর্তে এটি কল করা উচিত while/else
আপনি যদি এই স্নিপেটটি দেখেন তবে আমি আন্ডারট্যান্ড করা সহজ।

n = 5
while n > 0:
    print n
    n -= 1
    if n == 2:
        break
if n == 0:
    print n

লুপের পরে শর্তটি যাচাই করার পরিবর্তে আমরা এটিকে অদলবদল করতে পারি elseএবং সেই চেকটি থেকে মুক্তি পেতে পারি।

n = 5
while n > 0:
    print n
    n -= 1
    if n == 2:
        break
else:  # read it as "no_break"
    print n

while/no_breakকোডটি বোঝার জন্য আমি সর্বদা এটি পড়েছি এবং সেই বাক্য গঠনটি আমার কাছে আরও বেশি অর্থবোধ করে।


3

অন্য শর্তটি কেবল তখনই কার্যকর করা হয় যখন যখন শর্তটি মিথ্যা হয়ে যায়।

এখানে কিছু উদাহরন:

উদাহরণ 1: প্রাথমিকভাবে শর্তটি মিথ্যা, সুতরাং অন্য-ধারাটি কার্যকর করা হয়।

i = 99999999

while i < 5:
    print(i)
    i += 1
else:
    print('this')

আউটপুট:

this

উদাহরণ 2: যখন-শর্ত i < 5 কখনো মিথ্যা কারণ হয়ে ওঠে i == 3বিরতি লুপ, তাই অন্য-দফা মৃত্যুদন্ড কার্যকর করা হয় নি।

i = 0

while i < 5:
    print(i)
    if i == 3:
        break
    i += 1
else:
    print('this')

আউটপুট:

0
1
2
3

উদাহরণ 3: যখন-শর্ত i < 5 মিথ্যা যখন ওঠে iছিল 5, তাই আর-দফা মৃত্যুদন্ড কার্যকর করা হয়।

i = 0

while i < 5:
    print(i)
    i += 1
else:
    print('this')

আউটপুট:

0
1
2
3
4
this

0

else:বিবৃতি কার্যকর কখন এবং শুধুমাত্র যখন লুপ আর তার শর্ত পূরণ করে (আপনার উদাহরণে, যখন n != 0মিথ্যা)।

সুতরাং আউটপুট এই হবে:

5
4
3
2
1
what the...

আমি জানি তবে এই জাতীয় সময় / জাভাতে কাজ করে না। পাইথনে এটি কাজ করে যখন আমি বুঝতে পারি এটি বেশ আকর্ষণীয় মনে হয়। আমি কেবল কৌতূহলী ছিলাম এবং প্রযুক্তিগত কারণটি জানতে চাইছিলাম।
ইভান

6
@ ইভান: এটি এতটা নয় যে এটি জাভাতে কাজ করে না তবে জাভাতে এটি বিদ্যমান নেই । এটি কাজ করার জন্য তৈরি করা যেতে পারে, যদি কেউ ভাষাতে এটি যুক্ত করার চিন্তা করে।
ইগনাসিও ওয়াজকেজ-আব্রামস

1
না, যখন মিথ্যা: .. অন্যথায় .. এখনও অন্য ক্লজটি চালায়। এটি বলা আরও সঠিক: লুপটি ভেঙে গেলে কেবল চালানো হয় না।
লিও উফিমটসেভ

0

লুপটি না ভেঙে গেলে অন্যটি কার্যকর করা হয়।

আমি 'রানার' রূপক দিয়ে এটি ভাবতে চাই।

"অন্য" হ'ল ফিনিস লাইনটি পার হওয়ার মতো, আপনি ট্র্যাকের শুরুতে বা শেষে শুরু করেছিলেন কিনা তা অপ্রাসঙ্গিক। "অন্যথায়" কেবলমাত্র কার্যকর করা হয় না যদি আপনি এর মধ্যে কোথাও ভেঙে যান।

runner_at = 0 # or 10 makes no difference, if unlucky_sector is not 0-10
unlucky_sector = 6
while runner_at < 10:
    print("Runner at: ", runner_at)
    if runner_at == unlucky_sector:
        print("Runner fell and broke his foot. Will not reach finish.")
        break
    runner_at += 1
else:
    print("Runner has finished the race!") # Not executed if runner broke his foot.

প্রধান ব্যবহারের কেসগুলি নেস্টেড লুপগুলি এই ব্রেকিং ব্যবহার করে বা লুপটি কোথাও না ভেঙে যদি আপনি কিছু বিবৃতি চালাতে চান তবে (ভাঙ্গাটিকে অস্বাভাবিক পরিস্থিতি বলে ভাবেন)।

উদাহরণস্বরূপ, ভেরিয়েবলগুলি ব্যবহার না করে কীভাবে অভ্যন্তরীণ লুপটি ভেঙে ফেলা যায় বা চেষ্টা / ধরার চেষ্টা করা যায় তার একটি পদ্ধতি নীচে দেওয়া আছে:

for i in [1,2,3]:
    for j in ['a', 'unlucky', 'c']:
        print(i, j)
        if j == 'unlucky':
            break
    else: 
        continue  # Only executed if inner loop didn't break.
    break         # This is only reached if inner loop 'breaked' out since continue didn't run. 

print("Finished")
# 1 a
# 1 b
# Finished

-1

'যখন: অন্যথায়:' পাইথনের নির্মাণ আরও ভাল হবে যদি 'লুপটি কার্যকর না করা হয় তবে' অন্য 'বিবৃতি কার্যকর করা হয়। এটি আজ যেভাবে কাজ করে তা বোঝায় না কারণ আপনি একই ফলাফলের সাথে নীচের কোডটি ব্যবহার করতে পারেন ...

n = 5
while n != 0:
    print n
    n -= 1
print "what the..."

8
না, পার্থক্যটি হ'ল elseআপনি breakবা returnকীওয়ার্ড ব্যবহার করে লুপ ছেড়ে দিলে ব্লকটি কার্যকর করা হবে না । আপনার উদাহরণে, printলুপটি breakকমান্ডটি শেষ হয়ে গেলেও কার্যকর করা হবে ।
notsurewuttodo

2
আপনি বর্ণনা করেছেন যে বেশিরভাগ লোকেরা বৈশিষ্ট্যটি কীভাবে কাজ করে তা কীভাবে কাজ করে তা বাস্তবে কীভাবে কাজ করে না!
dotancohen

-2

এটি সামাজিক মিথস্ক্রিয়া জন্য দরকারী।

while (Date != "January 1st"):
    time.sleep(1)
else:
    print("Happy new year!")

2
এবং এখানকার উদ্দেশ্য ঠিক কী else? কোডটি এটিকে ছাড়াই ঠিক একই কাজ করে।
wovano

যদি আপনার breakগণনা চলাকালীন আপনার ঘড়ি এবং ক্যালেন্ডার , ব্যবহার না করা elseআপনাকে "নতুন বছরের শুভ শুভ!" তাত্ক্ষণিকভাবে যা কোনও ধারণা রাখে না।
গুইমোট

@ গুইমোট, "যদি আপনার ঘড়ি এবং ক্যালেন্ডার break" থাকে তবে আপনার অর্থ কী ? সেখানে নেই breakকোডে।
ওয়াভানো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.