পাইথনের যদি একটি ত্রৈমাসিক শর্তসাপেক্ষ অপারেটর না থাকে, তবে অন্য ভাষার নির্মাণগুলি ব্যবহার করে একজনকে অনুকরণ করা কি সম্ভব?
case [...] { when ... then ...} [ else ... ] end
অনুরূপ প্রভাবের জন্য রয়েছে তবে এটি মোটামুটি নয়।
পাইথনের যদি একটি ত্রৈমাসিক শর্তসাপেক্ষ অপারেটর না থাকে, তবে অন্য ভাষার নির্মাণগুলি ব্যবহার করে একজনকে অনুকরণ করা কি সম্ভব?
case [...] { when ... then ...} [ else ... ] end
অনুরূপ প্রভাবের জন্য রয়েছে তবে এটি মোটামুটি নয়।
উত্তর:
হ্যাঁ, এটি 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
।
অফিসিয়াল ডকুমেন্টেশন:
f(x) = |x| = x if x > 0 else -x
গণিতবিদদের কাছে এটি খুব স্বাভাবিক। আপনি এটিকে বেশিরভাগ ক্ষেত্রে এ হিসাবেও বুঝতে পারেন, সি যখন তখন আপনার পরিবর্তে বি করা উচিত ...
z = 3 + x if x < y else y
। যদি x=2
এবং y=1
, আপনি আশা করতে পারেন যে 4 ফলন হয়েছে তবে এটি আসলে 1 প্রদান z = 3 + (x if x > y else y)
করবে সঠিক ব্যবহার।
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
) গোষ্ঠী যুক্ত করতে হবে
আপনি একটি টিপল ইনডেক্স করতে পারেন:
(falseValue, trueValue)[test]
test
সত্য বা মিথ্যা প্রত্যাবর্তনের দরকার ।
এটি সর্বদা এটি প্রয়োগ করা আরও নিরাপদ হতে পারে:
(falseValue, trueValue)[test == True]
অথবা আপনি bool()
একটি বুলিয়ান মান নিশ্চিত করতে অন্তর্নির্মিতটি ব্যবহার করতে পারেন :
(falseValue, trueValue)[bool(<expression>)]
(lambda: print("a"), lambda: print("b"))[test==true]()
[]
কিছু রয়েছে তা নির্বিচারে প্রকাশ হতে পারে। এছাড়াও, সুরক্ষার জন্য আপনি স্পষ্টভাবে লেখার মাধ্যমে সত্যতার পরীক্ষা করতে পারেন [bool(<expression>)]
। bool()
ফাংশন v2.2.1 যেহেতু হয়েছে প্রায়।
True
এবং False
কীগুলির সাহায্যে অভিধানে ইনডেক্স করে : {True:trueValue, False:falseValue}[test]
আমি জানি না এটি কোনও কম দক্ষ কিনা, তবে এটি কমপক্ষে পুরোটা এড়িয়ে যায় "মার্জিত" বনাম "কুরুচিপূর্ণ" বিতর্ক। এখানে কোনও অস্পষ্টতা নেই যা আপনি কোনও ইন্টের চেয়ে বুলিয়ান নিয়ে কাজ করছেন।
2.5 এর পূর্ববর্তী সংস্করণগুলির জন্য, কৌশলটি এখানে রয়েছে:
[expression] and [on_true] or [on_false]
on_true
এটিতে ভুল ফলাফল দিতে পারে যখন একটি মিথ্যা বুলেটিন মান থাকে। 1
যদিও এটির বাম থেকে ডান অভিব্যক্তিগুলি মূল্যায়নের সুবিধা রয়েছে যা আমার মতে আরও স্পষ্ট।
<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
ডকুমেন্টেশন থেকে :
শর্তসাপেক্ষ এক্সপ্রেশন (কখনও কখনও "টার্নারি অপারেটর" নামে পরিচিত) এর সমস্ত পাইথন অপারেশনগুলির সর্বনিম্ন অগ্রাধিকার থাকে।
এক্সপ্রেশন
x if C else y
প্রথমে শর্তটি মূল্যায়ন করে, সি ( এক্স নয় ); যদি সি সত্য হয়, এক্সকে মূল্যায়ন করা হয় এবং এর মান ফিরে আসে; অন্যথায়, y এর মূল্যায়ন করা হয় এবং এর মান ফেরত দেওয়া হয়।শর্তাধীন অভিব্যক্তি সম্পর্কে আরও তথ্যের জন্য পিইপি 308 দেখুন ।
সংস্করণ 2.5 থেকে নতুন।
পাইথন শর্তসাপেক্ষ প্রকাশের জন্য একটি অপারেটর পাইথন বর্ধন প্রস্তাবনা 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")
সূত্র: ?: উইকিপিডিয়ায় পাইথনে
result = {1: x, 0: y}[a > b]
অন্য সম্ভাব্য রূপটি ( True
এবং False
প্রকৃতপক্ষে মানগুলির সাথে পূর্ণসংখ্যা 1
এবং 0
)
দুর্ভাগ্যক্রমে,
(falseValue, trueValue)[test]
সমাধানের শর্ট সার্কিট আচরণ নেই; সুতরাং উভয় falseValue
এবং trueValue
শর্ত নির্বিশেষে মূল্যায়ন করা হয়। এটি suboptimal বা এমনকি বাগি হতে পারে (অর্থাত্ উভয় trueValue
এবং)falseValue
পদ্ধতি হতে হবে এবং পার্শ্ব প্রতিক্রিয়া হতে পারে)।
এর একটি সমাধান হ'ল
(lambda: falseValue, lambda: trueValue)[test]()
(বিজয়ী পরিচিত না হওয়া পর্যন্ত কার্যকরকরণ বিলম্বিত হয়;)) তবে এটি কলযোগ্য এবং অ-কলযোগ্য বস্তুর মধ্যে অসঙ্গতি পরিচয় করিয়ে দেয়। তদতিরিক্ত, বৈশিষ্ট্যগুলি ব্যবহার করার সময় এটি কেসটি সমাধান করে না।
এবং গল্পটি যায় - 3 টি উল্লিখিত সমাধানগুলির মধ্যে বেছে নেওয়া হ'ল শর্ট সার্কিট বৈশিষ্ট্য হ'ল কমপক্ষে অ্যাসথন 2.5 (আইএমএইচও কোনও সমস্যা হয় না) ব্যবহার করে এবং " trueValue
মূল্যায়ন-থেকে-মিথ্যা" ত্রুটি হওয়ার আশঙ্কা না করে একটি বাণিজ্য-বাণিজ্য is ।
if else if
।
এখানে আমি কয়েকটি 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
পাইথন 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)
এটি সমস্ত পাইথন সংস্করণের সাথে সামঞ্জস্যপূর্ণ।
q("blob", on_true, on_false)
ফেরত দেয় on_false
, যেখানে on_true if cond else on_false
ফিরে আসে on_true
। একটি ওয়ার্কঅ্যারাউন্ড প্রতিস্থাপন করতে হয় cond
সঙ্গে cond is not None
যদিও একটি নির্ভুল সমাধান হয় না, এই ক্ষেত্রে।
bool(cond)
তার বদলে কেন হবে না cond is True
? পূর্ববর্তীটির সত্যতা পরীক্ষা করে cond
, পরেরটি True
বস্তুর সাথে পয়েন্টার-সমতার জন্য পরীক্ষা করে । @AndrewCecil দ্বারা হাইলাইট হিসাবে, "blob"
truthy কিন্তু এটা is not True
।
[on_false, on_True][cond is True]
পারেন যাতে প্রকাশটি সংক্ষিপ্ত হয়ে যায়।
আপনি প্রায়ই খুঁজে পেতে পারেন
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
পাইথনের কি টেরিনারি শর্তসাপেক্ষ অপারেটর রয়েছে?
হ্যাঁ. থেকে ব্যাকরণ ফাইল :
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
যা শব্দার্থবিজ্ঞানের সমতুল্য। নোট করুন যে কিছু স্টাইল-গাইডগুলি স্বচ্ছতার ভিত্তিতে এই ব্যবহারকে সীমাবদ্ধ করতে পারে - এটি খুব সামান্য বাক্য গঠনতে প্রচুর অর্থ প্যাক করে।
expression1 or expression2
expression1 || expression2
জাভাস্ক্রিপ্টের মতো একই এবং একই রকম ত্রুটিগুলি /
expressionN
সমস্ত দৃষ্টান্তের জন্য মেটাস্যান্স্যাকট্যাক্টিকের ব্যবহার সামঞ্জস্যপূর্ণ, নামকরণের সাথে বোঝা সহজ হতে পারে যা শর্তসাপেক্ষ পরীক্ষার এক্সপ্রেশনটিকে দুটি ফলাফলের অভিব্যক্তি থেকে পৃথক করে; যেমন result1 if condition else result2
,। এটি বিশেষত স্পষ্ট যখন (chaining ওরফে) পাখির: result1 if condition1 else result2 if condition2 else result3
। আরও কত ভাল যে এইভাবে পড়া?
পাইথন টার্নারি অপারেটর সিমুলেট করা।
উদাহরণ স্বরূপ
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
ফাংশনটি ব্যবহার করেন না কেন ?
টার্নারি শর্তসাপেক্ষ অপারেটর কেবলমাত্র একক লাইনে শর্ত পরীক্ষা করার অনুমতি দেয় যদি একাধিক লাইন প্রতিস্থাপন করে-যদি অন্যথায় কোডটি কমপ্যাক্ট তৈরি করে।
[on_true] যদি [এক্সপ্রেশন] অন্য [অন_ফালস]
# 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
# 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
# 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
if-else
আসলে টেরিনারি অপারেটরের পুনর্লিখন নয়, এবং a এবং b এর নির্বাচিত মানগুলির জন্য আলাদা আউটপুট উত্পন্ন করবে (বিশেষত যদি কোনও এমন এক ধরণের যা একটি উদ্ভট __ne__
পদ্ধতি প্রয়োগ করে )।
তুমি এটি করতে পারো :-
[condition] and [expression_1] or [expression_2] ;
উদাহরণ: -
print(number%2 and "odd" or "even")
সংখ্যাটি বিজোড় হলে এটি "বিজোড়" বা সংখ্যাটি সমান হলেও "এমনকি" মুদ্রণ করবে।
বিঃদ্রঃ :- 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
। গৃহীত উত্তরটি ব্যবহার করুন।
উত্তরের চেয়ে আরও বেশি টিপস (হুন্ড্রিথ সময়ের জন্য সুস্পষ্ট পুনরাবৃত্তি করার দরকার নেই), তবে আমি কখনও কখনও এ জাতীয় নির্মাণে অনলাইনার শর্টকাট হিসাবে ব্যবহার করি:
if conditionX:
print('yes')
else:
print('nah')
, হয়ে:
print('yes') if conditionX else print('nah')
কিছু (অনেক :) এটিকে অযৌক্তিক হিসাবে চিহ্নিত করতে পারে (এমনকি, রুবি-ইশ :), তবে আমি ব্যক্তিগতভাবে এটিকে আরও প্রাকৃতিক বলে মনে করি - যেমন আপনি কীভাবে এটি স্বাভাবিকভাবে প্রকাশ করেন, এছাড়াও কোডের বৃহত ব্লকগুলিতে আরও কিছু দৃশ্যমানভাবে আবেদনযোগ্য।
print( 'yes' if conditionX else 'nah' )
আপনার উত্তর চেয়ে পছন্দ । :-)
print()
উভয় ক্ষেত্রেই চান - এবং এটি দেখতে আরও কিছুটা অজগর দেখায়, আমাকে স্বীকার করতে হবে :) তবে যদি একমাত্র সত্যবাদী print('yes') if conditionX else True
হওয়ার জন্য মত প্রকাশ / ক্রিয়াগুলি একই না হয়print()
conditionX
print('yes') if conditionX else print('nah')
হ'ল এটি পাইথন 2-এ একটি সিন্ট্যাক্সেরর দেয়।
print "yes"
, পাইথন 3 এ এটি একটি ফাংশন - print("yes")
। এটি হয় একটি বিবৃতি হিসাবে ব্যবহার করে সমাধান করা যেতে পারে, বা আরও ভাল - from future import print_function
।
পাইথনের শর্তাধীন অভিব্যক্তির বিকল্পগুলির মধ্যে একটি
"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()
মূল্যায়ন করা হয়।
অনেকগুলি প্রোগ্রামিং ভাষার উত্স থেকে প্রাপ্ত 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'
আশাকরি এটা সাহায্য করবে.
ইতিমধ্যে উত্তর হিসাবে, হ্যাঁ পাইথনে একটি টের্নারি অপারেটর রয়েছে:
<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
পিএস: অবশ্যই, একটি শর্ট-সিরকিট মূল্যায়ন কোনও টেরিনারি অপারেটর নয় তবে প্রায়শই শর্ট সার্কিট পর্যাপ্ত হবে এমন ক্ষেত্রে টের্নারি ব্যবহার করা হয়।
short-circuit
মূল্যায়নের জন্য উত্সাহ দিন ।
হ্যাঁ, অজগরটির একটি টেরিনারি অপারেটর রয়েছে, এখানে সিনট্যাক্স এবং একই উদাহরণটি দেখানোর জন্য একটি উদাহরণ কোড রয়েছে :)
#[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")
print
এটি সত্যিই খুব ভাল পছন্দ নয়, কারণ এটি পাইথন 2-এ একটি সিনট্যাক্স এরর দেবে।
পাইথনের অ্যাসাইনমেন্টের জন্য একটি ত্রৈমাসিক ফর্ম রয়েছে; তবে একটি সংক্ষিপ্ত ফর্ম এমনকি লোকদের সচেতন হওয়া উচিত।
একটি শর্তের উপর নির্ভর করে ভেরিয়েবলের একটি মান বা অন্যটি নির্ধারণ করা খুব সাধারণ
>>> 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'
>>>
আমি সর্বদা সি টার্নারি সিনট্যাক্স পছন্দ করি তবে পাইথন এটিকে আরও একধাপ এগিয়ে নিয়ে যায়!
আমি বুঝতে পারি যে কেউ কেউ বলতে পারে এটি একটি ভাল স্টাইলিস্টিক পছন্দ নয় কারণ এটি এমন মেকানিক্সের উপর নির্ভর করে যা সমস্ত বিকাশকারীদের সাথে তাত্ক্ষণিকভাবে দৃশ্যমান নয়। আমি ব্যক্তিগতভাবে সেই দৃষ্টিভঙ্গির সাথে একমত নই। পাইথন এমন একটি বাক্য গঠন সমৃদ্ধ ভাষা যা প্রচুর প্রতিমাস্ত্রিক কৌশল সহ যা ডাবলারের সাথে তাত্ক্ষণিকভাবে স্পষ্ট হয় না। তবে আপনি অন্তর্নিহিত সিস্টেমের যান্ত্রিকগুলি যত বেশি শিখবেন এবং বুঝতে পারবেন, ততই আপনি এটির প্রশংসা করবেন।
অন্যান্য উত্তর পাইথন টার্নারি অপারেটর সম্পর্কে সঠিকভাবে কথা বলে। আমি এমন একটি দৃশ্যের উল্লেখ করে পরিপূরক করতে চাই যার জন্য প্রায়শই টেরিনারি অপারেটর ব্যবহৃত হয় তবে এর জন্য আরও ভাল প্রতিমা রয়েছে। এটি একটি ডিফল্ট মান ব্যবহারের দৃশ্য।
ধরুন, 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)
যদি ভেরিয়েবল সংজ্ঞায়িত হয় এবং আপনি এটির মূল্য দিতে পারেন তবে এটি পরীক্ষা করতে চান 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
x if x else y
, কিন্তু না x if z else y
।
একাধিক অপারেটরকে চেইন করার একটি ঝরঝরে উপায়:
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
আমি ডিফল্ট অজগর সিনট্যাক্সকে জটিল মনে করি 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
।