পাইথনের কি টেরিনারি শর্তসাপেক্ষ অপারেটর রয়েছে?


6035

পাইথনের যদি একটি ত্রৈমাসিক শর্তসাপেক্ষ অপারেটর না থাকে, তবে অন্য ভাষার নির্মাণগুলি ব্যবহার করে একজনকে অনুকরণ করা কি সম্ভব?


149
পাইথন 3.0.০ অফিসিয়াল ডকুমেন্টেশনে উপরের মন্তব্যে রেফারেন্স দেওয়া হয়েছে, এটিকে "শর্তসাপেক্ষ_প্রেম" হিসাবে উল্লেখ করা হয়েছে এবং এটি অত্যন্ত ক্রিপ্টিক্যালি সংজ্ঞায়িত। সেই ডকুমেন্টেশনে "টেরিনারি" শব্দটি অন্তর্ভুক্ত নেই, তাই আপনি কী সন্ধান করবেন তা আপনি যদি না জানতেন তবে গুগলের মাধ্যমে এটি খুঁজে পাওয়া আপনার পক্ষে কঠোর চাপ দেওয়া হবে। সংস্করণ 2 ডকুমেন্টেশন কিছুটা আরো সহায়ক হয় এবং একটি লিঙ্ক অন্তর্ভুক্ত "PEP 308" যা আকর্ষণীয় ঐতিহাসিক এই প্রশ্নের সাথে সম্পর্কিত প্রসঙ্গের অনেক রয়েছে।
নোবার

26
"তিন্নি" (তিনটি ইনপুট থাকা) এই ইমপ্লিমেন্টের একটি ফলস্বরূপ সম্পত্তি, ধারণাটির কোনও সংজ্ঞায়িত সম্পত্তি নয়। উদাহরণস্বরূপ: এসকিউএল এর case [...] { when ... then ...} [ else ... ] endঅনুরূপ প্রভাবের জন্য রয়েছে তবে এটি মোটামুটি নয়।
ব্যবহারকারীর 1313114

10
এছাড়াও আইএসও / আইইসি 9899 (সি প্রোগ্রামিং ল্যাঙ্গুয়েজ স্ট্যান্ডার্ড) বিভাগ 6.5.15 এটিকে "কনডিশনশিয়াল অপারেটর"
ইউজার 313114

9
উইকিপিডিয়া " ?: " নিবন্ধে এটিকে পুরোপুরি কভার করে ।
হ্যালো গুডবাই

9
নোবারের মন্তব্যের পর থেকে শর্তসাপেক্ষ অভিব্যক্তি ডকুমেন্টেশনগুলি শর্তসাপেক্ষ এক্সপ্রেশন (কখনও কখনও "টেরিনারি অপারেটর" নামে পরিচিত)
স্কট মার্টিন

উত্তর:


7032

হ্যাঁ, এটি 2.5 সংস্করণে যুক্ত করা হয়েছিল । এক্সপ্রেশন সিনট্যাক্সটি হ'ল:

a if condition else b

প্রথম conditionমূল্যায়ন করা হয়, তাহলে ঠিক পারেন এক aবা bমূল্যায়ন করা হয় এবং এর উপর ভিত্তি করে ফিরে বুলিয়ান মান condition। যদি conditionমূল্যায়ন করা হয় True, তবে aতা মূল্যায়ন ও ফিরে আসে তবে bতা অগ্রাহ্য করা হয়, বা অন্যথায় যখন bমূল্যায়ন করা হয় এবং ফিরে আসে তবেa উপেক্ষা করা হয়।

এটি শর্ট সার্কিট করার অনুমতি দেয় কারণ যখন conditionসত্য হয় কেবল aতখনই মূল্যায়ন হয় এবং bএকেবারেই মূল্যায়ন করা হয় না, তবে যখন conditionমিথ্যা হয় কেবল bতখনই মূল্যায়ন হয় এবংa মূল্যায়ন মোটেই হয় না।

উদাহরণ স্বরূপ:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

নোট করুন যে শর্তাদি কোনও বিবৃতি নয়, একটি অভিব্যক্তি । এর অর্থ আপনি শর্তাধীন অভিব্যক্তির মধ্যে অ্যাসাইনমেন্ট স্টেটমেন্ট বা অন্যান্য বিবৃতি ব্যবহার করতে পারবেন না :pass

>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

আপনি তবে এর মতো একটি ভেরিয়েবল বরাদ্দ করতে শর্তাধীন অভিব্যক্তি ব্যবহার করতে পারেন:

x = a if True else b

শর্তসাপেক্ষ অভিব্যক্তিটিকে দুটি মানের মধ্যে স্যুইচিং হিসাবে ভাবেন। এটি খুব কার্যকর যখন আপনি 'এক মান বা অন্য কোনও' পরিস্থিতির মধ্যে থাকেন তবে এটি আর কিছু করে না।

আপনার যদি বিবৃতি ব্যবহার করতে হয় তবে আপনাকে শর্তযুক্ত ভাবের পরিবর্তে একটি সাধারণ if বিবৃতি ব্যবহার করতে হবে ।


মনে রাখবেন যে এটি বেশ কয়েকটি কারণে পাইথোনিস্টাস দ্বারা নষ্ট হয়ে গেছে:

  • আর্গুমেন্টের ক্রমটি ক্লাসিকের থেকে আলাদা condition ? a : bঅন্যান্য অনেক ভাষার (যেমন সি, সি ++, গো, পার্ল, রুবি, জাভা, জাভাস্ক্রিপ্ট ইত্যাদি) থেকে টের্নারি অপারেটরের ক্রমটি পৃথক, যা পাইথনের সাথে অপরিচিত লোকেরা যখন বাগের দিকে নিয়ে যেতে পারে " আশ্চর্যজনক "আচরণ এটি ব্যবহার করুন (তারা তর্ক আদেশটি বিপরীত করতে পারে)।
  • কেউ কেউ এটিকে "অযৌক্তিক" বলে মনে করেন, যেহেতু এটি চিন্তার স্বাভাবিক প্রবাহের বিপরীতে যায় (প্রথমে অবস্থার কথা চিন্তা করে তারপরে এর প্রভাবগুলি)।
  • শৈলীগত কারণ। (যদিও 'ইনলাইন if' সত্যই কার্যকর হতে পারে এবং আপনার স্ক্রিপ্টটি আরও সংক্ষিপ্ত করে তুলতে পারে, এটি সত্যিই আপনার কোডটিকে জটিল করে তোলে)

যদি অর্ডারটি মনে রাখতে আপনার সমস্যা হয়, তবে মনে রাখবেন যে জোরে জোরে পড়লে আপনি (প্রায়) আপনার অর্থটি কী বলেছিলেন। উদাহরণস্বরূপ, x = 4 if b > 8 else 9হিসাবে জোরে পড়া হয়x will be 4 if b is greater than 8 otherwise 9

অফিসিয়াল ডকুমেন্টেশন:


268
আদেশটি কোডারদের কাছে অদ্ভুত বলে মনে হতে পারে তবে f(x) = |x| = x if x > 0 else -xগণিতবিদদের কাছে এটি খুব স্বাভাবিক। আপনি এটিকে বেশিরভাগ ক্ষেত্রে এ হিসাবেও বুঝতে পারেন, সি যখন তখন আপনার পরিবর্তে বি করা উচিত ...
যোটা

120
এটি ব্যবহার করার সময় ক্রিয়াকলাপের ক্রম সম্পর্কে সতর্কতা অবলম্বন করুন। উদাহরণস্বরূপ, লাইন z = 3 + x if x < y else y। যদি x=2এবং y=1, আপনি আশা করতে পারেন যে 4 ফলন হয়েছে তবে এটি আসলে 1 প্রদান z = 3 + (x if x > y else y)করবে সঠিক ব্যবহার।
কাল জেকডোর

11
কথাটি হ'ল যদি আপনি শর্তসাপেক্ষ মূল্যায়নের পরে অতিরিক্ত মূল্যায়ন করতে চান , যেমন ফলাফলের মধ্যে কোনও মূল্য যুক্ত করার জন্য আপনাকে উভয় পক্ষের ( z = 3 + x if x < y else 3 + y) বা অতিরিক্ত শর্তসাপেক্ষে ( z = 3 + (x if x < y else y)বা z = (x if x < y else y) + 3) গোষ্ঠী যুক্ত করতে হবে
কাল জেকডোর

4
@ মিঃজিগ, আমি আপনার অর্থটি দেখতে পাচ্ছি, সুতরাং আপনি মূলত অপারেশনগুলিকে বাসা
বেঁধে ফেলবেন: ool

3
প্রোগ্রামারদের গাণিতিকের চেয়ে আরও সঠিক নির্ভুল সূত্রের প্রয়োজন হয় কারণ গণিতে সর্বদা অন্তর্নিহিত ধারণাগুলির অবলম্বন থাকে। একটি বিশ্বাসযোগ্য যুক্তি হ'ল% অপারেটর, গণিতে "মোড" যেভাবে ব্যবহৃত হয় তা নকল করা দুর্যোগ হত। সুতরাং না, আমি আপনার যুক্তি গ্রহণ করি না। এটি সাম্রাজ্যীয় ইউনিটকে মেনে চলার মতো। গ্রোয়েটজেস অ্যালবার্ট
অ্যালবার্ট ভ্যান ডার হোর্স্ট

795

আপনি একটি টিপল ইনডেক্স করতে পারেন:

(falseValue, trueValue)[test]

testসত্য বা মিথ্যা প্রত্যাবর্তনের দরকার ।
এটি সর্বদা এটি প্রয়োগ করা আরও নিরাপদ হতে পারে:

(falseValue, trueValue)[test == True]

অথবা আপনি bool()একটি বুলিয়ান মান নিশ্চিত করতে অন্তর্নির্মিতটি ব্যবহার করতে পারেন :

(falseValue, trueValue)[bool(<expression>)]

589
মনে রাখবেন যে এটি সর্বদা সমস্ত কিছুর মূল্যায়ন করে, অন্যদিকে যদি / অন্য নির্মাণগুলি কেবল বিজয়ী অভিব্যক্তিটি মূল্যায়ন করে।
সিলভারব্যাক

117
(lambda: print("a"), lambda: print("b"))[test==true]()
ডাস্টিন গেটেজ

15
এটি লক্ষ করা উচিত যে এর মধ্যে যা []কিছু রয়েছে তা নির্বিচারে প্রকাশ হতে পারে। এছাড়াও, সুরক্ষার জন্য আপনি স্পষ্টভাবে লেখার মাধ্যমে সত্যতার পরীক্ষা করতে পারেন [bool(<expression>)]bool()ফাংশন v2.2.1 যেহেতু হয়েছে প্রায়।
মার্টিনিউ

12
আমি একটি অনুরূপ কৌশল করেছি - কেবল একবার বা দু'বার, কিন্তু এটি দিয়েছি - অভিধানে Trueএবং Falseকীগুলির সাহায্যে অভিধানে ইনডেক্স করে : {True:trueValue, False:falseValue}[test]আমি জানি না এটি কোনও কম দক্ষ কিনা, তবে এটি কমপক্ষে পুরোটা এড়িয়ে যায় "মার্জিত" বনাম "কুরুচিপূর্ণ" বিতর্ক। এখানে কোনও অস্পষ্টতা নেই যা আপনি কোনও ইন্টের চেয়ে বুলিয়ান নিয়ে কাজ করছেন।
জেডিএম


338

2.5 এর পূর্ববর্তী সংস্করণগুলির জন্য, কৌশলটি এখানে রয়েছে:

[expression] and [on_true] or [on_false]

on_true এটিতে ভুল ফলাফল দিতে পারে যখন একটি মিথ্যা বুলেটিন মান থাকে। 1
যদিও এটির বাম থেকে ডান অভিব্যক্তিগুলি মূল্যায়নের সুবিধা রয়েছে যা আমার মতে আরও স্পষ্ট।

1. সি এর সমতুল্য কি "?:" টার্নারি অপারেটর আছে?


67
প্রতিকারটি হ'ল (পরীক্ষা এবং [সত্য_মূল্য] বা [মিথ্যা_মূল্য]) [0], যা এই ফাঁদটিকে এড়িয়ে চলে।
থমাস এইচ

5
টার্নারি অপারেটর সাধারণত দ্রুত সম্পাদন করে (কখনও কখনও 10-25% দ্বারা)।
আগ্নেয়গিরি

7
@ ভলকানো আপনার কাছে কি আমার জন্য উত্স আছে?
অরেঞ্জটাক্স

4
@OrangeTux এখানে অনেকত্রিত কোড আছে । থমাসএহ প্রস্তাবিত পদ্ধতিটি ব্যবহার করা আরও ধীর হবে।
mbomb007

264

<expression 1> if <condition> else <expression 2>

a = 1
b = 2

1 if a > b else -1 
# Output is -1

1 if a > b else -1 if a < b else 0
# Output is -1

83
এই একটি টার্নারি অপারেটরের প্রাথমিক উদ্দেশ্যকে গুরুত্ব দেয়: মান নির্বাচন। এটি আরও দেখায় যে একাধিক ত্রিনিরি একসাথে একক অভিব্যক্তিতে বেঁধে রাখা যেতে পারে।
রায় টিঙ্কার 21

6
@ ক্রেইগ, আমি একমত, তবে যখন কোন বন্ধনী নেই তখন কী হবে তা জানার জন্য এটিও সহায়ক। বাস্তব কোডে, আমিও সুস্পষ্ট প্যারেনগুলি সন্নিবেশ করানোর প্রবণতা করব।
জন কোম্বস 21

158

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

শর্তসাপেক্ষ এক্সপ্রেশন (কখনও কখনও "টার্নারি অপারেটর" নামে পরিচিত) এর সমস্ত পাইথন অপারেশনগুলির সর্বনিম্ন অগ্রাধিকার থাকে।

এক্সপ্রেশন x if C else yপ্রথমে শর্তটি মূল্যায়ন করে, সি ( এক্স নয় ); যদি সি সত্য হয়, এক্সকে মূল্যায়ন করা হয় এবং এর মান ফিরে আসে; অন্যথায়, y এর মূল্যায়ন করা হয় এবং এর মান ফেরত দেওয়া হয়।

শর্তাধীন অভিব্যক্তি সম্পর্কে আরও তথ্যের জন্য পিইপি 308 দেখুন ।

সংস্করণ 2.5 থেকে নতুন।


119

পাইথন শর্তসাপেক্ষ প্রকাশের জন্য একটি অপারেটর পাইথন বর্ধন প্রস্তাবনা 308 এর অংশ হিসাবে 2006 সালে যুক্ত হয়েছিল । এর ফর্মটি সাধারণ ?:অপারেটরের থেকে পৃথক এবং এটি:

<expression1> if <condition> else <expression2>

যা এর সমান:

if <condition>: <expression1> else: <expression2>

এখানে একটি উদাহরণ:

result = x if a > b else y

আরেকটি সিনট্যাক্স যা ব্যবহার করা যেতে পারে (2.5 এর আগে সংস্করণের সাথে সামঞ্জস্যপূর্ণ):

result = (lambda:y, lambda:x)[a > b]()

অপারেশন যেখানে অলসভাবে মূল্যায়ন করা হয়

আরেকটি উপায় হ'ল একটি টিপলকে সূচক করে দেওয়া (যা বেশিরভাগ অন্যান্য ভাষার শর্তসাপেক্ষ অপারেটরের সাথে সামঞ্জস্য নয়):

result = (y, x)[a > b]

বা স্পষ্টভাবে নির্মিত অভিধান:

result = {True: x, False: y}[a > b]

আরেকটি (কম নির্ভরযোগ্য) তবে সহজ পদ্ধতিটি হ'ল ব্যবহার করা andএবংor অপারেটরগুলি:

result = (a > b) and x or y

তবে এটি কাজ করবে না যদি x হবে False

একটি সম্ভাব্য কর্মসূচী তৈরি করা xএবংyনিম্নলিখিত হিসাবে যেমন তালিকা তালিকাই দেওয়া :

result = ((a > b) and [x] or [y])[0]

বা:

result = ((a > b) and (x,) or (y,))[0]

আপনি যদি ডিকশনারি নিয়ে কাজ করে থাকেন, তবে কোনও শর্তাধীন শর্তসাপেক্ষ ব্যবহার করার পরিবর্তে, আপনি সুবিধা নিতে পারেন get(key, default), উদাহরণস্বরূপ:

shell = os.environ.get('SHELL', "/bin/sh")

সূত্র: ?: উইকিপিডিয়ায় পাইথনে


1
result = {1: x, 0: y}[a > b]অন্য সম্ভাব্য রূপটি ( Trueএবং Falseপ্রকৃতপক্ষে মানগুলির সাথে পূর্ণসংখ্যা 1এবং 0)
ওয়াল্টার ট্রস

97

দুর্ভাগ্যক্রমে,

(falseValue, trueValue)[test]

সমাধানের শর্ট সার্কিট আচরণ নেই; সুতরাং উভয় falseValueএবং trueValueশর্ত নির্বিশেষে মূল্যায়ন করা হয়। এটি suboptimal বা এমনকি বাগি হতে পারে (অর্থাত্ উভয় trueValueএবং)falseValue পদ্ধতি হতে হবে এবং পার্শ্ব প্রতিক্রিয়া হতে পারে)।

এর একটি সমাধান হ'ল

(lambda: falseValue, lambda: trueValue)[test]()

(বিজয়ী পরিচিত না হওয়া পর্যন্ত কার্যকরকরণ বিলম্বিত হয়;)) তবে এটি কলযোগ্য এবং অ-কলযোগ্য বস্তুর মধ্যে অসঙ্গতি পরিচয় করিয়ে দেয়। তদতিরিক্ত, বৈশিষ্ট্যগুলি ব্যবহার করার সময় এটি কেসটি সমাধান করে না।

এবং গল্পটি যায় - 3 টি উল্লিখিত সমাধানগুলির মধ্যে বেছে নেওয়া হ'ল শর্ট সার্কিট বৈশিষ্ট্য হ'ল কমপক্ষে অ্যাসথন 2.5 (আইএমএইচও কোনও সমস্যা হয় না) ব্যবহার করে এবং " trueValueমূল্যায়ন-থেকে-মিথ্যা" ত্রুটি হওয়ার আশঙ্কা না করে একটি বাণিজ্য-বাণিজ্য is ।


2
ল্যাম্বডাস ট্রিকের টিপলটি কাজ করার সময়, টার্নারি অপারেটর হিসাবে এটি প্রায় 3 মিনিট সময় নেয়। এটি কেবলমাত্র একটি যুক্তিসঙ্গত ধারণা হতে পারে যদি এটি একটি দীর্ঘ চেইন প্রতিস্থাপন করতে পারে if else if
পারকিনস

71

বিভিন্ন প্রোগ্রামিং ভাষায় টার্নারি অপারেটর

এখানে আমি কয়েকটি ternary operatorপ্রোগ্রামিং ভাষার মধ্যে কিছু গুরুত্বপূর্ণ পার্থক্য দেখানোর চেষ্টা করি ।

জাভাস্ক্রিপ্টে টার্নারি অপারেটর

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0

রুবিতে টার্নারি অপারেটর

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0

স্কালায় টার্নারি অপারেটর

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0

আর প্রোগ্রামিংয়ে টার্নারি অপারেটর

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0

পাইথনে টার্নারি অপারেটর

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0


5
এটি মতামত শোনায়; তবে এটি মূলত যা বলে তা হ'ল পাইথন সিনট্যাক্সটি এমন কোনও ব্যক্তির দ্বারা বোঝা সম্ভব হবে যা কখনই কোনও টেরিনারি অপারেটর দেখেনি, যদিও খুব কম লোকই স্বাভাবিক সিনট্যাক্সটি বুঝতে পারে যদি না তাদের প্রথমে বোঝানো হয় তবে এর অর্থ কী।
ফ্রেলেউ

1
Algol68: a = .if। .true। .then। 1 .হয়। 0 .fi। এটি একটি = (। সত্য | 1 | 0) হিসাবে প্রকাশিত হতে পারে যথারীতি Algol68 এর উত্তরসূরীদের তুলনায় একটি উন্নতি।
অ্যালবার্ট ভ্যান ডার হোর্স্ট

63

পাইথন 2.5 এবং আরও নবীনদের জন্য একটি নির্দিষ্ট বাক্য গঠন রয়েছে:

[on_true] if [cond] else [on_false]

পুরানো পাইথনসে একটি টার্নারি অপারেটর প্রয়োগ করা হয় না তবে এটি অনুকরণ করা সম্ভব।

cond and on_true or on_false

যদিও, একটি সম্ভাব্য সমস্যা রয়েছে, যা যদি condএটির জন্য মূল্যায়ন করে Trueএবং on_trueততক্ষণে মূল্যায়ন করে Falseতবে on_falseতার পরিবর্তে ফিরে আসে on_true। আপনি যদি এই আচরণটি চান পদ্ধতিটি ঠিক আছে, অন্যথায় এটি ব্যবহার করুন:

{True: on_true, False: on_false}[cond is True] # is True, not == True

যা দ্বারা আবৃত হতে পারে:

def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]

এবং এইভাবে ব্যবহৃত:

q(cond, on_true, on_false)

এটি সমস্ত পাইথন সংস্করণের সাথে সামঞ্জস্যপূর্ণ।


2
আচরণটি অভিন্ন নয় - q("blob", on_true, on_false)ফেরত দেয় on_false, যেখানে on_true if cond else on_falseফিরে আসে on_true। একটি ওয়ার্কঅ্যারাউন্ড প্রতিস্থাপন করতে হয় condসঙ্গে cond is not Noneযদিও একটি নির্ভুল সমাধান হয় না, এই ক্ষেত্রে।

5
bool(cond)তার বদলে কেন হবে না cond is True? পূর্ববর্তীটির সত্যতা পরীক্ষা করে cond, পরেরটি Trueবস্তুর সাথে পয়েন্টার-সমতার জন্য পরীক্ষা করে । @AndrewCecil দ্বারা হাইলাইট হিসাবে, "blob"truthy কিন্তু এটা is not True
জোনাস কলকার

বাহ, দেখতে সত্যিই হ্যাকি! :) প্রযুক্তিগতভাবে, আপনি এমনকি লিখতে [on_false, on_True][cond is True]পারেন যাতে প্রকাশটি সংক্ষিপ্ত হয়ে যায়।
আর্সেনি

এই উত্তরের কোনও শর্ট সার্কিট নেই। যদি on_true এবং on_false কল করা ব্যয়বহুল হয় তবে এটি একটি খারাপ উত্তর।
হকার

44

আপনি প্রায়ই খুঁজে পেতে পারেন

cond and on_true or on_false

on_true == 0 এ এ সমস্যার সৃষ্টি করে

>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1

যেখানে আপনি এই ফলাফলের জন্য সাধারণ টের্নারি অপারেটরের জন্য আশা করতে পারেন

>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1

38

পাইথনের কি টেরিনারি শর্তসাপেক্ষ অপারেটর রয়েছে?

হ্যাঁ. থেকে ব্যাকরণ ফাইল :

test: or_test ['if' or_test 'else' test] | lambdef

আগ্রহের অংশটি হ'ল:

or_test ['if' or_test 'else' test]

সুতরাং, একটি ত্রৈমাসিকী শর্তসাপেক্ষ অপারেশনটি ফর্মটির:

expression1 if expression2 else expression3

expression3অলসভাবে মূল্যায়ন করা হবে (এটি যদি expression2বুলিয়ান প্রসঙ্গে মিথ্যা হয় তবেই মূল্যায়ন করা হবে )। এবং পুনরাবৃত্ত সংজ্ঞাটির কারণে আপনি এগুলি অনির্দিষ্টকালের জন্য চেইন করতে পারেন (যদিও এটি খারাপ স্টাইল হিসাবে বিবেচিত হতে পারে))

expression1 if expression2 else expression3 if expression4 else expression5 # and so on

ব্যবহার সম্পর্কে একটি নোট:

নোট করুন যে প্রতিটি ifএকটি সঙ্গে অনুসরণ করা আবশ্যক else। তালিকার বোধগম্যতা এবং জেনারেটর এক্সপ্রেশন শেখার লোকেরা এটি শেখা একটি কঠিন পাঠ হতে পারে - নিম্নলিখিতটি কাজ করবে না, কারণ পাইথন অন্যটির জন্য তৃতীয় ভাব প্রকাশের প্রত্যাশা করে:

[expression1 if expression2 for element in iterable]
#                          ^-- need an else here

যা উত্থাপন a SyntaxError: invalid syntax। সুতরাং উপরেরটি হ'ল লজিকের একটি অসম্পূর্ণ অংশ (সম্ভবত ব্যবহারকারী মিথ্যা শর্তে কোনও অপশাসনের প্রত্যাশা করে) বা অভিপ্রায় 2 কে ফিল্টার হিসাবে ব্যবহার করার উদ্দেশ্য রয়েছে - নোট করুন যে নিম্নলিখিতটি পাইথন:

[expression1 for element in iterable if expression2]

expression2তালিকা ধী জন্য আপনি একটি ফিল্টার হিসাবে কাজ করে, এবং না একটি তিন শর্তসাপেক্ষ অপারেটর।

আরও সংকীর্ণ ক্ষেত্রে বিকল্প বাক্য গঠন:

আপনি নিম্নলিখিত লিখতে কিছুটা বেদনাদায়ক মনে করতে পারেন:

expression1 if expression1 else expression2

expression1উপরের ব্যবহারের সাথে দুবার মূল্যায়ন করতে হবে। এটি কেবলমাত্র স্থানীয় পরিবর্তনশীল হলে এটি অতিরিক্ত কাজকে সীমাবদ্ধ করতে পারে। যাইহোক, এই ব্যবহারের ক্ষেত্রে একটি সাধারণ এবং পারফরম্যান্ট পাইথোনিক আইডিয়ামটি হ'ল শর্টকাটিং orআচরণ ব্যবহার করা:

expression1 or expression2

যা শব্দার্থবিজ্ঞানের সমতুল্য। নোট করুন যে কিছু স্টাইল-গাইডগুলি স্বচ্ছতার ভিত্তিতে এই ব্যবহারকে সীমাবদ্ধ করতে পারে - এটি খুব সামান্য বাক্য গঠনতে প্রচুর অর্থ প্যাক করে।


1
expression1 or expression2expression1 || expression2জাভাস্ক্রিপ্টের মতো একই এবং একই রকম ত্রুটিগুলি /
ধনাত্মকতার সাথে

1
ধন্যবাদ, @ সেলুর্বেদু - আপনি এটি সোজা না হওয়া পর্যন্ত বিভ্রান্তিকর হতে পারে। আমি হার্ড উপায় শিখেছি, যাতে আপনার উপায় হিসাবে কঠিন না হতে পারে। ;) জেনারেটর এক্সপ্রেশন বা তালিকা বোঝার শেষে অন্যটি না থাকলে ব্যবহার করে পুনরাবৃত্তিযোগ্য ফিল্টার হবে। সামনে, এটি একটি ত্রৈমাসিকের শর্তসাপেক্ষ অপারেশন এবং অন্যটি প্রয়োজন। চিয়ার্স !!
অ্যারন হল

@ অ্যারনহল যদিও আপনার expressionNসমস্ত দৃষ্টান্তের জন্য মেটাস্যান্স্যাকট্যাক্টিকের ব্যবহার সামঞ্জস্যপূর্ণ, নামকরণের সাথে বোঝা সহজ হতে পারে যা শর্তসাপেক্ষ পরীক্ষার এক্সপ্রেশনটিকে দুটি ফলাফলের অভিব্যক্তি থেকে পৃথক করে; যেমন result1 if condition else result2,। এটি বিশেষত স্পষ্ট যখন (chaining ওরফে) পাখির: result1 if condition1 else result2 if condition2 else result3। আরও কত ভাল যে এইভাবে পড়া?
tchrist

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

23

পাইথন টার্নারি অপারেটর সিমুলেট করা।

উদাহরণ স্বরূপ

a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()

আউটপুট:

'b greater than a'

result = (y, x)[a < b]আপনি কেবল lambdaফাংশনটি ব্যবহার করেন না কেন ?
গ্রিজেশ চৌহান

5
@ গ্রিজেশচৌহান কারণ "সম্মতিযুক্ত" মত প্রকাশের উপর, যেমন কোনও ফাংশন কল জড়িত ইত্যাদি কারণে, উভয় ক্ষেত্রেই এটি কার্যকর করা হবে। এটি চেয়েছিল নাও হতে পারে।
glglgl

20

টার্নারি শর্তসাপেক্ষ অপারেটর কেবলমাত্র একক লাইনে শর্ত পরীক্ষা করার অনুমতি দেয় যদি একাধিক লাইন প্রতিস্থাপন করে-যদি অন্যথায় কোডটি কমপ্যাক্ট তৈরি করে।

বাক্য গঠন :

[on_true] যদি [এক্সপ্রেশন] অন্য [অন_ফালস]

1- টার্নারি অপারেটরটি ব্যবহারের সহজ পদ্ধতি:

# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10

2- টিপলস, অভিধান এবং ল্যাম্বদা ব্যবহারের সরাসরি পদ্ধতি:

# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda  we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10

3- টার্নারি অপারেটর যদি নেস্টেড হিসাবে লেখা যায় তবে অন্যথায়:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")

উপরোক্ত পদ্ধতির লিখিতভাবে লেখা যেতে পারে:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal") 
# Output: b is greater than a

1
নোট করুন যে টেরিনারি অপারেটর ছোট (মেমোরিতে) এবং নেস্টেড থাকলে এর চেয়ে দ্রুত। এছাড়াও, আপনার নেস্টেড if-elseআসলে টেরিনারি অপারেটরের পুনর্লিখন নয়, এবং a এবং b এর নির্বাচিত মানগুলির জন্য আলাদা আউটপুট উত্পন্ন করবে (বিশেষত যদি কোনও এমন এক ধরণের যা একটি উদ্ভট __ne__পদ্ধতি প্রয়োগ করে )।
পারকিনস

19

তুমি এটি করতে পারো :-

[condition] and [expression_1] or [expression_2] ;

উদাহরণ: -

print(number%2 and "odd" or "even")

সংখ্যাটি বিজোড় হলে এটি "বিজোড়" বা সংখ্যাটি সমান হলেও "এমনকি" মুদ্রণ করবে।


ফলাফল: - শর্তটি সত্য হলে exp_1 কার্যকর হয় অন্যথায় exp_2 কার্যকর করা হয়।

বিঃদ্রঃ :- 0, কিছুই নয়, মিথ্যা, শূন্য তালিকা, খালি স্ট্রিং মিথ্যা হিসাবে মূল্যায়ন করে। এবং 0 ছাড়া অন্য যে কোনও ডেটা সত্যকে মূল্যায়ন করে।

এখানে কিভাবে এটা কাজ করে:

যদি কন্ডিশন [শর্ত] তখন "সত্য" হয়, এক্সপ্রেশন_1 মূল্যায়ন করা হবে তবে এক্সপ্রেশন 2 নয়। যদি আমরা "এবং" 0 (শূন্য) সহ কিছু করি তবে ফলাফল সর্বদা দ্রুততর হবে S নীচের বিবৃতিতে তাই,

0 and exp

এক্সপ্রেশন এক্সপ একেবারেই মূল্যায়ন করা হবে না যেহেতু "এবং" সহ 0 সর্বদা শূন্যকে মূল্যায়ন করবে এবং এক্সপ্রেশনটি মূল্যায়ন করার প্রয়োজন নেই। সংকলক নিজেই সমস্ত ভাষায় কাজ করে।

ভিতরে

1 or exp

এক্সপ্রেশন এক্সপ মোটেও মূল্যায়ন করা হবে না যেহেতু "বা" 1 দিয়ে সর্বদা 1 হবে। সুতরাং এক্সপ্রেশন এক্সপাকে মূল্যায়ন করা বিরক্ত করবে না যেহেতু ফলাফল যাইহোক 1 হবে। (সংকলক অপ্টিমাইজেশন পদ্ধতি)।

তবে ক্ষেত্রে

True and exp1 or exp2

দ্বিতীয় এক্সপ্রেশন 2 এর পরে মূল্যায়ন করা হবে না True and exp1 এক্সপেট 1 টি মিথ্যা নয় isn't

একইভাবে ইন

False and exp1 or exp2

এক্সপ্রেশন এক্সপ্রেসের মূল্যায়ন করা হবে না যেহেতু মিথ্যা 0 লিখার সমতুল্য এবং "এবং" 0 দিয়ে 0 হবে তবে Exp1 পরে "বা" ব্যবহার করা হয়েছে, এটি "বা" এর পরে এক্সপ্রেস এক্সপ্রেসের মূল্যায়ন করবে।


দ্রষ্টব্য: - "বা" এবং "এবং" ব্যবহার করে এই ধরণের শাখাগুলি কেবল তখনই ব্যবহার করা যেতে পারে যখন এক্সপ্রেশন_1 এর মিথ্যা (বা 0 বা কোনও বা খালি তালিকা [] বা ফাঁকা তালিকা '') থাকে না, যেহেতু এক্সপ্রেশন_1 হয়ে যায় মিথ্যা, তারপরে এক্সপ্রেশন এবং এক্সপোস্টের মধ্যে "বা" উপস্থিতির কারণে এক্সপ্রেশন 3 মূল্যায়ন করা হবে।

আপনি যদি এখনও এটিকে সমস্ত ক্ষেত্রে কার্যকর করতে চান তবে exp_1 এবং exp_2 সত্য মান কী তা নির্বিশেষে করুন: -

[condition] and ([expression_1] or 1) or [expression_2] ;


যদি আপনি এটি প্রসঙ্গে ব্যবহার করতে চান x = [condition] and ([expression_1] or 1) or [expression_2]এবং expression_1ভুয়া মূল্যায়ণ করেন তবে তা xহবে 1না expression_1। গৃহীত উত্তরটি ব্যবহার করুন।
moi

18

উত্তরের চেয়ে আরও বেশি টিপস (হুন্ড্রিথ সময়ের জন্য সুস্পষ্ট পুনরাবৃত্তি করার দরকার নেই), তবে আমি কখনও কখনও এ জাতীয় নির্মাণে অনলাইনার শর্টকাট হিসাবে ব্যবহার করি:

if conditionX:
    print('yes')
else:
    print('nah')

, হয়ে:

print('yes') if conditionX else print('nah')

কিছু (অনেক :) এটিকে অযৌক্তিক হিসাবে চিহ্নিত করতে পারে (এমনকি, রুবি-ইশ :), তবে আমি ব্যক্তিগতভাবে এটিকে আরও প্রাকৃতিক বলে মনে করি - যেমন আপনি কীভাবে এটি স্বাভাবিকভাবে প্রকাশ করেন, এছাড়াও কোডের বৃহত ব্লকগুলিতে আরও কিছু দৃশ্যমানভাবে আবেদনযোগ্য।


5
আমি print( 'yes' if conditionX else 'nah' )আপনার উত্তর চেয়ে পছন্দ । :-)
frederick99

এটিই যদি আপনি print()উভয় ক্ষেত্রেই চান - এবং এটি দেখতে আরও কিছুটা অজগর দেখায়, আমাকে স্বীকার করতে হবে :) তবে যদি একমাত্র সত্যবাদী print('yes') if conditionX else Trueহওয়ার জন্য মত প্রকাশ / ক্রিয়াগুলি একই না হয়print()conditionX
টডর

ফ্রেডরিক 99 এর মন্তব্যে যোগ করতে, এড়ানোর আরেকটি কারণ print('yes') if conditionX else print('nah')হ'ল এটি পাইথন 2-এ একটি সিন্ট্যাক্সেরর দেয়।
থিয়েরি লাথুইলে

এটি সিনট্যাক্স ত্রুটি দেওয়ার একমাত্র কারণটি পাইথন 2 প্রিন্টে একটি বিবৃতি - print "yes", পাইথন 3 এ এটি একটি ফাংশন - print("yes")। এটি হয় একটি বিবৃতি হিসাবে ব্যবহার করে সমাধান করা যেতে পারে, বা আরও ভাল - from future import print_function
টডর মিনাকভ

18
a if condition else b

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

     condition
  if           else
a                   b 

13

পাইথনের শর্তাধীন অভিব্যক্তির বিকল্পগুলির মধ্যে একটি

"yes" if boolean else "no"

নিম্নলিখিত:

{True:"yes", False:"no"}[boolean]

যার নীচের সুন্দর এক্সটেনশন রয়েছে:

{True:"yes", False:"no", None:"maybe"}[boolean_or_none]

সবচেয়ে সংক্ষিপ্ত বিকল্পটি রয়ে গেছে:

("no", "yes")[boolean]

তবে এর বিকল্প নেই

yes() if boolean else no()

আপনি যদি মূল্যায়ন এড়াতে চান yes() এবং no() কারণ

(no(), yes())[boolean]  # bad

উভয় no()এবং yes()মূল্যায়ন করা হয়।


9

অনেকগুলি প্রোগ্রামিং ভাষার উত্স থেকে প্রাপ্ত Cসাধারণত টার্নারি শর্তসাপেক্ষ অপারেটরের নিম্নলিখিত বাক্য গঠন থাকে:

<condition> ? <expression1> : <expression2>

প্রথমে, Python বি এনিভলেন্ট ডি অ্যাক্টেটর এফ বা এল ইফি (মানে গুয়েডো ভ্যান রসুম অবশ্যই) এটিকে প্রত্যাখ্যান করেছে (যেহেতু অ-পাইথোনিক স্টাইল হিসাবে), যেহেতু Cভাষা ব্যবহার না করা লোকদের পক্ষে এটি বোঝা বেশ কঠিন । এছাড়াও, কোলন চিহ্নটিতে :ইতিমধ্যে অনেকগুলি ব্যবহার রয়েছে Pythonপিইপি 308 অনুমোদিত হওয়ার পরে Pythonঅবশেষে এটির নিজস্ব শর্টকাট শর্তসাপেক্ষ অভিব্যক্তি (আমরা এখন কী ব্যবহার করি) পেয়েছি:

<expression1> if <condition> else <expression2>

সুতরাং, প্রথমত এটি শর্তটি মূল্যায়ন করে। যদি এটি ফিরে আসে True, এক্সপ্রেশন 1 ফলাফল দেওয়ার জন্য মূল্যায়ন করা হবে , অন্যথায় এক্সপ্রেশন 2 মূল্যায়ন করা হবে। অলস মূল্যায়ন মেকানিক্সের কারণে - কেবলমাত্র একটি এক্সপ্রেশন কার্যকর করা হবে।

এখানে কয়েকটি উদাহরণ রয়েছে (শর্তগুলি বাম থেকে ডানে মূল্যায়ন করা হবে):

pressure = 10
print('High' if pressure < 20 else 'Critical')

# Result is 'High'

টার্নারি অপারেটরদের সিরিজে বেঁধে রাখা যায়:

pressure = 5
print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical')

# Result is 'Normal'

নিম্নলিখিতটি পূর্বের মতো একই:

pressure = 5

if pressure < 20:
    if pressure < 10:
        print('Normal')
    else:
        print('High')
else:
    print('Critical')

# Result is 'Normal'

আশাকরি এটা সাহায্য করবে.


9

ইতিমধ্যে উত্তর হিসাবে, হ্যাঁ পাইথনে একটি টের্নারি অপারেটর রয়েছে:

<expression 1> if <condition> else <expression 2>

অতিরিক্ত তথ্য:

যদি <expression 1>শর্তটি হয় তবে আপনি শর্ট-সিরকিট মূল্যায়ন ব্যবহার করতে পারেন :

a = True
b = False

# Instead of this:
x = a if a else b

# You could use Short-cirquit evaluation:
x = a or b

পিএস: অবশ্যই, একটি শর্ট-সিরকিট মূল্যায়ন কোনও টেরিনারি অপারেটর নয় তবে প্রায়শই শর্ট সার্কিট পর্যাপ্ত হবে এমন ক্ষেত্রে টের্নারি ব্যবহার করা হয়।


1
উক্ত short-circuitমূল্যায়নের জন্য উত্সাহ দিন ।
CodeIt

7

হ্যাঁ, অজগরটির একটি টেরিনারি অপারেটর রয়েছে, এখানে সিনট্যাক্স এবং একই উদাহরণটি দেখানোর জন্য একটি উদাহরণ কোড রয়েছে :)

#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false


a= input("Enter the First Number ")
b= input("Enter the Second Number ")

print("A is Bigger") if a>b else print("B is Bigger")

কোন সংখ্যাটি আরও বিস্তৃত করতে বড় তা পরীক্ষা করতে আমি একটি লাইন বিবৃতি উদাহরণ যুক্ত করেছি
পাইথনলভার

1
printএটি সত্যিই খুব ভাল পছন্দ নয়, কারণ এটি পাইথন 2-এ একটি সিনট্যাক্স এরর দেবে।
থিয়েরি লাথুইলে

@ থিরি লাথুইলে এখানে আমি মুদ্রণ ব্যবহার করেছি () ফাংশনটি মুদ্রণ বিবরণী নয়, প্রিন্ট ফাংশন পাইথন 3 এর জন্য, প্রিন্ট বিবৃতি পাইথন 2
পাইথনলভার

প্রশ্নটি ইতিমধ্যে এসওকে জিজ্ঞাসা করা হয়েছে, কেবল পাইথন 2 দিয়ে এটি ব্যবহার করে দেখুন এবং আপনি নিজেই দেখতে পাবেন। 'মুদ্রণ (' হ্যালো ') পাইথন ২.7 এ একটি সম্পূর্ণ বৈধ সিনট্যাক্স, তবে এটি যেভাবে পার্স করা হয় তা আপনার কোডটিকে উপরে একটি সিনট্যাক্সেরর ফেলে দেয়।
থিয়েরি লাথুইলে

1

পাইথনের অ্যাসাইনমেন্টের জন্য একটি ত্রৈমাসিক ফর্ম রয়েছে; তবে একটি সংক্ষিপ্ত ফর্ম এমনকি লোকদের সচেতন হওয়া উচিত।

একটি শর্তের উপর নির্ভর করে ভেরিয়েবলের একটি মান বা অন্যটি নির্ধারণ করা খুব সাধারণ

>>> li1 = None
>>> li2 = [1, 2, 3]
>>> 
>>> if li1:
...     a = li1
... else:
...     a = li2
...     
>>> a
[1, 2, 3]

Such এই জাতীয় কার্য সম্পাদনের জন্য এটি দীর্ঘ ফর্ম।

নীচে টেরিনারি ফর্মটি দেওয়া আছে। তবে এটি সর্বাধিক সংহত উপায় নয় - শেষ উদাহরণটি দেখুন।

>>> a = li1 if li1 else li2
>>> 
>>> a
[1, 2, 3]
>>> 

পাইথনের সাহায্যে আপনি কেবল orবিকল্প অ্যাসাইনমেন্টের জন্য ব্যবহার করতে পারেন ।

>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> 

উপরের কাজটি li1হ'ল Noneএবং ইন্টারপগুলি যুক্তি প্রকাশের ক্ষেত্রে মিথ্যা হিসাবে বিবেচনা করে। ইন্টারপটি এর পরে চলে যায় এবং দ্বিতীয় এক্সপ্রেশনটি মূল্যায়ন করে, যা এটি নয় Noneএবং এটি খালি তালিকা নয় - সুতরাং এটি একটিতে নির্ধারিত হয়।

এটি খালি তালিকার সাথেও কাজ করে। উদাহরণস্বরূপ, যদি আপনি aযে কোনও তালিকাতে আইটেমগুলি অর্পণ করতে চান ।

>>> li1 = []
>>> li2 = [1, 2, 3]
>>> 
>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> 

এটি জানার পরে, আপনি যখনই মুখোমুখি হন কেবল আপনি এই জাতীয় কার্যভারগুলি করতে পারেন। এটি স্ট্রিং এবং অন্যান্য পুনরাবৃত্তগুলির সাথেও কাজ করে। aযে কোনও স্ট্রিং খালি নয় এমন আপনি নির্ধারণ করতে পারেন ।

>>> s1 = ''
>>> s2 = 'hello world'
>>> 
>>> a = s1 or s2
>>> 
>>> a
'hello world'
>>> 

আমি সর্বদা সি টার্নারি সিনট্যাক্স পছন্দ করি তবে পাইথন এটিকে আরও একধাপ এগিয়ে নিয়ে যায়!

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


0

অন্যান্য উত্তর পাইথন টার্নারি অপারেটর সম্পর্কে সঠিকভাবে কথা বলে। আমি এমন একটি দৃশ্যের উল্লেখ করে পরিপূরক করতে চাই যার জন্য প্রায়শই টেরিনারি অপারেটর ব্যবহৃত হয় তবে এর জন্য আরও ভাল প্রতিমা রয়েছে। এটি একটি ডিফল্ট মান ব্যবহারের দৃশ্য।

ধরুন, option_valueসেট না করা থাকলে আমরা কোনও ডিফল্ট মান সহ ব্যবহার করতে চাই :

run_algorithm(option_value if option_value is not None else 10)

বা সহজভাবে

run_algorithm(option_value if option_value else 10)

যাইহোক, একটি আরও ভাল সমাধান সহজভাবে লিখতে হয়

run_algorithm(option_value or 10)

-2

যদি ভেরিয়েবল সংজ্ঞায়িত হয় এবং আপনি এটির মূল্য দিতে পারেন তবে এটি পরীক্ষা করতে চান just a or b

def test(myvar=None):
    # shorter than: print myvar if myvar else "no Input"
    print myvar or "no Input"

test()
test([])
test(False)
test('hello')
test(['Hello'])
test(True)

আউটপুট হবে

no Input
no Input
no Input
hello
['Hello']
True

1
অনুরূপ সমস্যার জন্য দরকারী, এটি একটি তিনটি শর্তযুক্ত নয়। এটি প্রতিস্থাপন কাজ করে x if x else y, কিন্তু না x if z else y
পারকিনস

-2

একাধিক অপারেটরকে চেইন করার একটি ঝরঝরে উপায়:

f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'

array = [(0,0),(0,1),(1,0),(1,1)]

for a in array:
  x, y = a[0], a[1]
  print(f(x,y))

# Output is:
#   equal,
#   less,
#   greater,
#   equal

-2

আমি ডিফল্ট অজগর সিনট্যাক্সকে জটিল মনে করি val = a if cond else b, তাই মাঝে মাঝে আমি এটি করি:

iif = lambda (cond, a, b): a if cond else b
# so I can then use it like:
val = iif(cond, a, b)

অবশ্যই, এটি সর্বদাই উভয় পক্ষের (ক এবং খ) মূল্যায়ন করার ক্ষয়ক্ষতি রয়েছে, তবে সিনট্যাক্সটি এটি আমার পক্ষে আরও পরিষ্কার way


এটি সাধারণ পরিসংখ্যানের চেয়ে কাজের পরিমাণ দ্বিগুণ, র‍্যামের বেশি ব্যবহার এবং আরও নিবিড় val = a if cond else b
ইটসফুড

-3
is_spacial=True if gender = "Female" else (True if age >= 65 else False)

**

এটি আপনার প্রয়োজন হিসাবে বাসা বাঁধতে পারে। শুভকামনা করছি

**

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