যদি একটি লাইনে একটি এলিফ-অন্য বিবৃতি দেওয়া?


123

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

যদি কোনও এলিফ-অন্য বিবৃতি লেখার সহজ উপায় থাকে তবে এটি এক লাইনে ফিট করে?
উদাহরণ স্বরূপ,

if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3

বা একটি বাস্তব বিশ্বের উদাহরণ:

if i > 100:
    x = 2
elif i < 100:
    x = 1
else:
    x = 0

আমি কেবল অনুভব করি যদি উপরের উদাহরণটি নিম্নলিখিত উপায়ে লেখা যায় তবে এটি আরও সংক্ষিপ্তর মতো দেখাতে পারে।

x=2 if i>100 elif i<100 1 else 0 [WRONG]

উত্তর:


183

না, এটি সম্ভব নয় (কমপক্ষে স্বেচ্ছাচারিতামূলক বক্তব্য দিয়ে নয়) বা এটিও কাম্য নয়। এক লাইনে সমস্ত কিছু ফিটিং করা সম্ভবত PEP-8 লঙ্ঘন করবে যেখানে আদেশ দেওয়া হয়েছে যে লাইনগুলি দৈর্ঘ্যে 80 টি অক্ষরের বেশি হওয়া উচিত নয়।

এটি পাইথনের জেনের বিরুদ্ধেও: "পঠনযোগ্যতার গণনা"। (পুরোটি import thisপড়ার জন্য পাইথন প্রম্পটে টাইপ করুন )।

আপনি পাইথনে একটি ত্রৈমাসিক ভাবটি ব্যবহার করতে পারেন, তবে কেবলমাত্র প্রকাশের জন্য, বিবৃতিগুলির জন্য নয়:

>>> a = "Hello" if foo() else "Goodbye"

সম্পাদনা:

আপনার সংশোধিত প্রশ্নটি এখন দেখায় যে নির্ধারিত মান বাদে তিনটি বিবৃতি অভিন্ন। সেক্ষেত্রে একটি শৃঙ্খলযুক্ত টের্নারি অপারেটর কাজ করে তবে আমি এখনও মনে করি এটি কম পাঠযোগ্য:

>>> i=100
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
0
>>> i=101
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
2
>>> i=99
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
1

দ্বিতীয় প্রকাশটি কেন 0 ফেরেনি? আমি 100 এর উপরে
অ্যাস্ট্রাল ওল্ফ

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

1
আপনার যদি এটি আরও পঠনযোগ্য হওয়ার প্রয়োজন হয় তবে আপনি এটির চারপাশে বন্ধনী রেখে দিতে পারেন: a = 1 if i < 100 else (2 if i > 100 else 0)(স্বাক্ষরিত তবে আমার মনে হয় এটি কাজ করা উচিত)
জ্যাক

@ টিমপিটজ্যাকার আপনি কীভাবে এক্সপ্রেশন এবং বিবৃতিতে পার্থক্য বর্ণনা করবেন?
AsheKetchum

62

আপনার যদি কেবলমাত্র বিভিন্ন ক্ষেত্রে ভিন্ন ভিন্ন অভিব্যক্তি দরকার হয় তবে এটি আপনার পক্ষে কাজ করতে পারে:

expr1 if condition1 else expr2 if condition2 else expr

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

a = "neg" if b<0 else "pos" if b>0 else "zero"

1
"pos"হয় না এক বিবৃতিতে, এটি একটি অভিব্যক্তি।
টিম পিটজ্যাকার

@ টিমপিটজ্যাকার থ্যাঙ্কস এর, আমি পোস্টটি আরও নির্ভুল হতে আপডেট করেছি।
লিচা

20

অন্যের বিবৃতিতে ক্লজ থাকলে ঠিক অন্য একটি নেস্ট করুন। তবে এটি কোনও প্রিমিয়ার দেখতে দেয় না।

>>> x=5
>>> x if x>0 else ("zero" if x==0 else "invalid value")
5
>>> x = 0
>>> x if x>0 else ("zero" if x==0 else "invalid value")
'zero'
>>> x = -1
>>> x if x>0 else ("zero" if x==0 else "invalid value")
'invalid value'

1
আমার জন্য এটি গৃহীত উত্তরের চেয়ে অনেক বেশি পঠনযোগ্য কারণ এটি প্রথম ধারাটির কাঠামো এবং ধারণাটি বজায় রাখে; শুধু বিষয়গত বিষয়।
এজারাট 11

11

কিছু অন্যান্য উত্তর সত্ত্বেও: হ্যাঁ এটি সম্ভব :

if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3

নিম্নলিখিত এক লাইনারে অনুবাদ করে:

statement1 if expression1 else (statement2 if expression2 else statement3)

আসলে আপনি অনন্ত পর্যন্ত এগুলিকে বাসাতে পারেন। উপভোগ করুন;)


কিভাবে সময় নেওয়া সম্পর্কে? আমি মনে করি, এই মুটি-লুপিংগুলি অনেক বেশি সময় সাশ্রয়ী হবে। গ্রাহকের আরও ভাল গতির জন্য নেস্টেড লুপগুলির বিকল্প থাকতে পারে।
ভালবাসা

হাই @loveR, এই কোন লুপ, তার মাত্র একটি আর বিবৃতি যদি নেস্টেড, এবং তুচ্ছ সময় তজ্জন্য
gustavz

7

আপনি সাধারণত getএকটি এর পদ্ধতিটি ব্যবহার করতে পারেন dict:

x = {i<100: -1, -10<=i<=10: 0, i>100: 1}.get(True, 2)

getকীগুলির মধ্যে একটি যদি মূল্যায়নের জন্য গ্যারান্টিযুক্ত থাকে তবে আপনার পদ্ধতির দরকার নেই True:

x = {i<0: -1, i==0: 0, i>0: 1}[True]

বেশিরভাগ কীগুলির আদর্শভাবে মূল্যায়ন করা উচিত True। যদি একাধিক কী মূল্যায়ণ করে Trueতবে ফলাফলটি অনাকাঙ্ক্ষিত বলে মনে হতে পারে।


6

আমার মতামতটিতে এমন একটি বিকল্প রয়েছে যা বেশ অপঠনযোগ্য তবে আমি যেভাবেই কৌতূহল হিসাবে ভাগ করব:

x = (i>100 and 2) or (i<100 and 1) or 0

এখানে আরও তথ্য: https://docs.python.org/3/library/stdtyype.html#boolean-operation-and-or-not


2
এটি ক্যানোনিকাল জাভাস্ক্রিপ্টের মতো দেখাচ্ছে ;-)
এন্ট 6

4
if i > 100:
    x = 2
elif i < 100:
    x = 1
else:
    x = 0

আপনি যদি একটি লাইনে উপরে বর্ণিত কোডটি ব্যবহার করতে চান তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

x = 2 if i > 100 else 1 if i < 100 else 0

এটি করার পরে, x 2 কে i, 100> 1, i <100 এবং 0 যদি i = 100 প্রদান করা হবে


3

এটি আপনার এক্সপ্রেশনগুলির প্রকৃতির উপরও নির্ভর করে। "এটি না করা" এর অন্যান্য উত্তরের সাধারণ পরামর্শ জেনেরিক বক্তব্য এবং জেনেরিক প্রকাশের জন্য যথেষ্ট বৈধ।

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

কিছুটা এইরকম:

def save(): 
   ...
def edit():
   ...
options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"}

option = get_input()
result = options[option]()

যদি অন্যথায় পরিবর্তে:

if option=="save":
    save()
...

2

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

x = 2*(i>100) | 1*(i<100)

তুলনাগুলি সত্য বা মিথ্যা হবে এবং সংখ্যার সাথে গুণিত করার পরে 1 বা 0 হবে One মাঝখানে.


1

তিন অপারেটর একটি সংক্ষিপ্ত এক্সপ্রেশন ভাল উপায়। বাক্য গঠনটি হ'ল variable = value_1 if condition else value_2। সুতরাং, আপনার উদাহরণস্বরূপ, আপনাকে অবশ্যই দ্বিগুণ অপারেটর প্রয়োগ করতে হবে:

i = 23 # set any value for i
x = 2 if i > 100 else 1 if i < 100 else 0

0

বিবৃতি থাকলে আপনি নেস্টেড টের্নারি ব্যবহার করতে পারেন।

# if-else ternary construct
country_code = 'USA'
is_USA = True if country_code == 'USA' else False
print('is_USA:', is_USA)

# if-elif-else ternary construct
# Create function to avoid repeating code.
def get_age_category_name(age):
    age_category_name = 'Young' if age <= 40 else ('Middle Aged' if age > 40 and age <= 65 else 'Senior')
    return age_category_name

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