এক লাইন যদি শর্ত-বরাদ্দ থাকে


140

আমার কাছে নিম্নলিখিত কোড রয়েছে

num1 = 10
someBoolValue = True

আমার যদি মান num1হয় 20তবে someBoolValueতা নির্ধারণ করতে হবে True; এবং অন্যথায় কিছুই করবেন না। সুতরাং, এখানে তার জন্য আমার কোড

num1 = 20 if someBoolValue else num1

...else num1অংশটি আরও পরিষ্কার দেখানোর জন্য আমি কি কোনও উপায়ে এড়াতে পারি ? এর সমতুল্য

if someBoolValue:
    num1 = 20

আমি সঙ্গে এটি প্রতিস্থাপন চেষ্টা ...else passভালো: num1=20 if someBoolValue else pass। আমার যা কিছু পেয়েছিল তা ছিল সিনট্যাক্স ত্রুটি। বা আমি শুধু ...else num1অংশ বাদ দিতে পারে না ।


2
শুধু এটি সব পরিবর্তন num1 = 20 if someBoolValue else 10। তারপরে আপনিও num1=10লাইনটি সেভ করবেন ?
টমাস আহলে

ধন্যবাদ। তবে এটি ঠিক আমার কোড নয়। আমি বোঝাতে চাইছি যে num1ইতিমধ্যে ...
বিধান

উত্তর:


195

পাইথনে এটি সম্ভব বলে আমি মনে করি না, যেহেতু আপনি আসলে যা করার চেষ্টা করছেন সম্ভবত এটির মতো কোনও ক্ষেত্রে প্রসারিত হয়:

num1 = 20 if someBoolValue else num1

আপনি যদি বাদ না দেন তবে আপনি else num1একটি বাক্য গঠন ত্রুটি পাবেন যেহেতু আমি যথেষ্ট নিশ্চিত যে অ্যাসাইনমেন্টটি অবশ্যই কিছু ফিরিয়ে আনবে।

অন্যরা যেমন ইতিমধ্যে উল্লেখ করেছে, আপনি এটি করতে পারতেন তবে এটি খারাপ কারণ পরের বারের কোডটি পড়লে আপনি সম্ভবত নিজেকে বিভ্রান্ত করবেন:

if someBoolValue: num1=20

num1 = someBoolValue and 20 or num1ঠিক একই কারণে আমি কোনও বড় ভক্ত নই । লাইনটি কী করছে তা নিয়ে আমাকে আসলে দুবার ভাবতে হবে।

আপনি যা করতে চান তা অর্জনের সর্বোত্তম উপায় হ'ল আসল সংস্করণ:

if someBoolValue:
    num1 = 20

এটি সর্বোত্তম ভেরিসনের কারণ হ'ল আপনি যা করতে চান তা খুব স্পষ্ট and

এছাড়াও, পার্শ্ব নোট হিসাবে, num1 = 20 if someBoolValueবৈধ রুবি কোড, কারণ রুবি কিছুটা আলাদাভাবে কাজ করে।


8
পিইপি -308 ( ডকস.পিথথন.আর.৫.৫ / ওয়াটসনেউ / পিপি ৩০৮.ইচটিএমএল ) অনুসারে, শর্তসাপেক্ষে প্যারেনে রাখলে শর্তসাপেক্ষ প্রকাশটি আরও স্পষ্ট করা যেতে পারে num1 = (20 if someBoolValue else num1)
haridsv

46

এটা ব্যবহার কর:

num1 = 20 if someBoolValue else num1

3
এই আমি ব্যবহার করছি .. এবং বিকল্প খুঁজছি .. যাইহোক ধন্যবাদ !!
বিহার

কিভাবে এই ব্লক কল? মানে এর নাম কি?
ফুয়াত

1
এটি একটি বার্ষিক অপারেটর
ক্রিস মেইস

বৃহত্তর ডেটা সেটগুলি লুপ করে নেওয়া উচিত, যদি না অন্য বিবৃতিতে শেষ হয় তবে এটি যদি একটি অপ্রয়োজনীয় অ্যাসাইনমেন্টের পরিচয় দেয় তবে এই পদ্ধতির ব্যবহার করা উচিত নয়।
dapc

21

এক লাইনে:

if someBoolValue: num1 = 20

তবে তা করবেন না। এই শৈলীটি সাধারণত প্রত্যাশিত হয় না। স্বচ্ছতা এবং ধারাবাহিকতার জন্য লোকেরা দীর্ঘতর ফর্মটি পছন্দ করে।

if someBoolValue:
    num1 = 20

(সমানভাবে, উটের ক্যাপগুলি এড়ানো উচিত So তাই বরং ব্যবহার করুন some_bool_value))

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


2
কারণ এটি পড়া শক্ত হয়ে যায় এবং আপনি সম্ভবত নিজের কোড দ্বারা বিভ্রান্ত হয়ে পড়বেন এবং এটি কখনই ভাল ধারণা নয়।
ফ্রস্ট

@ বিধার, কেন আপনি এটি একটি লাইনে রাখতে চান? এটি আর দ্রুত চলবে না, অন্য লোকেদের পক্ষে পড়া সহজ হবে
জন লা রুই

1
@gnibbler, আসলে কোনও কারণ নেই। আমি আরও ভাল পাঠযোগ্যতার সাথে একটি সংক্ষিপ্ত ফর্মটি
খুঁজছিলাম

17

আপনি নিম্নলিখিতগুলির মধ্যে একটি ব্যবহার করতে পারেন:

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal

1
দুর্দান্ত এক লাইনার শর্তসাপেক্ষ অ্যাসাইনমেন্ট
minhas23

কিভাবে "কাঠামো" বলা হয়? পাইথন শেখার months মাসের মধ্যে আমি কখনই দেখিনি।
গিমাউতে

1
কমপক্ষে এগুলি অ্যাসাইনমেন্ট নয়, যদি না আপনি তাদের সামনে একটি রাখেন এবং দ্বিতীয়ত, তারা এখানে বর্ণিত পদ্ধতিতে কাজ করবে না। প্রথমটি একটি টুপল তৈরি করে, তারপরে সূচকের মাধ্যমে এর একটি উপাদান বেছে নেয়। এটি কেবলমাত্র সেই পরীক্ষাগুলির জন্য কাজ করবে যা -1 এবং 1 এর মধ্যে একটি পূর্ণসংখ্যা ফেরত দেয়, বা True/ False, যেহেতু boolএর একটি সাবক্লাস int। সমস্ত ক্ষেত্রে যেখানে পরীক্ষাটি এমন কিছু ফিরিয়ে দেয় যা কেবল সত্যের মূল্যায়ন করতে পারে, এটি ব্যতিক্রম ব্যর্থ হয়। দ্বিতীয়টি কেবল ততক্ষণ কাজ করে যতক্ষণ trueValনা মিথ্যা নিজেই মূল্যায়ন করে না, যার ফলস্বরূপ falseValপরীক্ষাটি সত্য থাকলেও মৌমাছি নির্ধারিত হবে ।
বাচসউ

এটি খুব সংক্ষিপ্ত, তবে নিরাপদে "প্রস্তাবিত প্যাটার্ন" হিসাবে ব্যবহার করা খুব জটিল , বাচ্চাউর উপরের মন্তব্যটি দেখুন ... (তাই আমি এটিকে
কমিয়ে দিয়েছি

6

না, আমি অনুমান করি আপনি আশা করেছিলেন যে এরকম কিছু কার্যকর num1 = 20 if someBoolValueহবে তবে এটি কার্যকর হয় না। আমি মনে করি যে ifআপনি যেভাবে বিবৃতি লিখেছেন সেভাবেই সর্বোত্তম উপায় :

if someBoolValue:
    num1 = 20

5
num1 = 10 + 10*(someBoolValue is True)

এটি আমার নতুন চূড়ান্ত উত্তর পূর্বের উত্তরটি নিম্নরূপ ছিল এবং বর্ণিত সমস্যার জন্য ওভারকিল ছিল। প্রাপ্তি_টূ_ক্লাওয়ার == not Good। এখানে পূর্বের উত্তরটি দেওয়া আছে ... আপনি যদি Trueকনডের জন্য একটি জিনিস এবং অন্যটির জন্য যুক্ত করতে চান তবে এখনও ভাল False:

num1 = 10 + (0,10)[someBoolValue is True]

আপনি উল্লেখ করেছেন num1যে ইতিমধ্যে একা থাকা উচিত এমন একটি মান থাকবে। আমি ধরে নিলাম num1 = 10যে এটি পোস্টের প্রথম বিবৃতি, তাই অপারেশনটি 20যোগ করতে হবে 10

num1 = 10
someBoolValue = True

num1 = 10 + (0,10)[someBoolValue is True]

print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')

এই আউটপুট উত্পাদন

num1 = 20
someBoolValue = True

এখন আমি ভাবছি যে আমার 'num1 = 10 + 10 * (someBoolValue == সত্য) এর উত্তর দেওয়া উচিত ছিল' মূলত নো-অপ্ট হিসাবে 'ফ্যালস' শর্ত হিসাবে সংজ্ঞায়িত সমস্যা। যদি এটি 'মিথ্যা'র জন্য আলাদা মান যুক্ত করার পছন্দ হতে পারে তবে পূর্বের উত্তরটি আরও ভাল। আমি কি আমার পোস্টটি সম্পাদনা করব বা মন্তব্যগুলিতে এটি করব?
মাইকিবি


2

যদি কোনও বুলেটিয়ান সত্য হয় তবে আপনি কোনও পদ্ধতি শুরু করতে চান, আপনি else Noneট্রাইনারিটি বন্ধ করতে পারেন ।

>>> a=1
>>> print(a) if a==1 else None
1
>>> print(a) if a==2 else None
>>> a=2
>>> print(a) if a==2 else None
2
>>> print(a) if a==1 else None
>>>

1

যদি আপনার জন্য একটি লাইন কোড অবশ্যই হয়ে থাকে, পাইথন ৩.৮ স্পষ্টভাবে "ওয়ালরাস অপারেটর" হিসাবে পরিচিত অ্যাসাইনমেন্ট এক্সপ্রেশনগুলির সাথে পরিচয় করিয়ে দেয় ।

:=

someBoolValue and (num := 20)

20নির্ধারিত করা হবে numযদি প্রথম বুলিয়ান অভিব্যক্তি True। অ্যাসাইনমেন্টটি অবশ্যই এখানে প্রথম বন্ধনীগুলির মধ্যে থাকতে হবে অন্যথায় আপনি একটি বাক্য গঠন ত্রুটি পাবেন।

num = 10
someBoolValue = True

someBoolValue and (num := 20)
print(num) # 20

num = 10
someBoolValue = False

someBoolValue and (num := 20)
print(num) # 10

0

গুগল থেকে ভবিষ্যতের ভ্রমণকারীদের জন্য, এখানে একটি নতুন উপায় রয়েছে (পাইথন ৩.৮ থেকে পরবর্তী):

b = 1
if a := b:
    # this section is only reached if b is not 0 or false.
    # Also, a is set to b
    print(a, b)


-1

এখানে আমি পরামর্শ দিতে পারেন কি। ক্লজটি প্রাপ্ত করতে অন্য পরিবর্তনশীলটি ব্যবহার করুন এবং এটিকে num1 এ নির্ধারণ করুন।

কোড:

num2 =20 if someBoolValue else num1
num1=num2


-1

আপনি এটি এইভাবে করতে পারেন।

try:
    a = [i for i in [20] if False][0]
except IndexError:
    print("Do what ever you want here")

আপনি আপনার সমস্যাটি এইভাবে সমাধান করতে পারেন তবে, 'ট্রাই / ব্লক ব্যতীত' ব্যবহার করা অজগরটির পক্ষে সেরা অনুশীলন নয়।

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