python - programming - পাইথন কেন শিখব




সংক্ষিপ্ত লেখার উপায়(a+b== c বা a+c== b বা b+c== a) (11)

বুলিয়ান এক্সপ্রেশন লিখতে আরও কমপ্যাক্ট বা পাইথোনিক উপায় আছে কি?

a + b == c or a + c == b or b + c == a

আমি সাথে এসেছি

a + b + c in (2*a, 2*b, 2*c)

তবে এটি কিছুটা অদ্ভুত।


অনুরোধটি আরও কমপ্যাক্ট বা আরও বেশি পাইথোনিকের জন্য - আমি আরও কমপ্যাক্টে আমার হাতটি চেষ্টা করেছিলাম।

প্রদত্ত

import functools, itertools
f = functools.partial(itertools.permutations, r = 3)
def g(x,y,z):
    return x + y == z

এটি আসলটির চেয়ে 2 টি অক্ষর কম

any(g(*args) for args in f((a,b,c)))

সাথে পরীক্ষা:

assert any(g(*args) for args in f((a,b,c))) == (a + b == c or a + c == b or b + c == a)

অতিরিক্তভাবে, প্রদত্ত:

h = functools.partial(itertools.starmap, g)

এটি সমতুল্য

any(h(f((a,b,c))))

অ্যালেক্স ভার্গা "এ ইন (বি + সি, বিসি, সিবি)" প্রদত্ত সমাধানটি কমপ্যাক্ট এবং গাণিতিকভাবে সুন্দর, তবে আমি আসলে কোডটি লিখব না কারণ পরবর্তী বিকাশকারী সাথে সাথে কোডটির উদ্দেশ্য বুঝতে পারে না ।

মার্ক র্যানসমের সমাধান

any((a + b == c, a + c == b, b + c == a))

আরও স্পষ্ট তবে এর চেয়ে বেশি সাফল্য নয়

a + b == c or a + c == b or b + c == a

কোড লেখার সময় অন্য কারও দিকে নজর রাখতে হবে বা আমাকে অনেক পরে দেখতে হবে যখন আমি যখন লিখছিলাম তখন আমি কী ভাবছিলাম তা ভুলে গিয়েছি, খুব ছোট বা চতুর হওয়ার চেয়ে ভাল হওয়ার চেয়ে আরও বেশি ক্ষতি করার ঝোঁক রয়েছে। কোড পাঠযোগ্য হবে। সুতরাং সংশ্লেষ ভাল, তবে এতটা সংক্ষিপ্ত নয় যে পরবর্তী প্রোগ্রামার এটি বুঝতে পারে না।


আপনি যদি জানেন যে আপনি কেবল ইতিবাচক সংখ্যার সাথেই কাজ করছেন, এটি কার্যকর হবে এবং বেশ পরিষ্কার:

a, b, c = sorted((a, b, c))
if a + b == c:
    do_stuff()

আমি যেমন বলেছি, এটি কেবল ধনাত্মক সংখ্যার জন্যই কাজ করে; তবে যদি আপনি জানেন যে তারা ইতিবাচক হতে চলেছেন তবে এটি একটি খুব পঠনযোগ্য সমাধান আইএমও, এমনকি কোনও কার্যের বিপরীতে সরাসরি কোডে।

আপনি এটি করতে পারেন, যা কিছুটা পুনরাবৃত্তি গণনা করতে পারে; তবে আপনি আপনার লক্ষ্য হিসাবে কর্মক্ষমতা নির্দিষ্ট করেন নি:

from itertools import permutations

if any(x + y == z for x, y, z in permutations((a, b, c), 3)):
    do_stuff()

অথবা বিনা permutations() এবং পুনরাবৃত্তি গণনার সম্ভাবনা:

if any(x + y == z for x, y, z in [(a, b, c), (a, c, b), (b, c, a)]:
    do_stuff()

আমি সম্ভবত এটি বা অন্য কোনও সমাধান একটি ফাংশনে রেখে দেব। তারপরে আপনি কেবল আপনার কোডটিতে পরিষ্কারভাবে ফাংশনটি কল করতে পারেন।

ব্যক্তিগতভাবে, কোডটি থেকে আমার আরও নমনীয়তার প্রয়োজন না হলে আমি আপনার প্রশ্নের প্রথম পদ্ধতিটি ব্যবহার করব। এটি সহজ এবং দক্ষ। আমি এখনও এটি একটি ফাংশনে রাখতে পারি:

def two_add_to_third(a, b, c):
    return a + b == c or a + c == b or b + c == a

if two_add_to_third(a, b, c):
    do_stuff()

এটি সুন্দর পাইথোনিক, এবং এটি করার সম্ভবত সবচেয়ে কার্যকর উপায় (অতিরিক্ত ফাংশন কল একপাশে); যদিও আপনার কার্য সম্পাদন সম্পর্কে খুব বেশি চিন্তা করা উচিত নয়, যদি না এটি আসলে কোনও সমস্যা তৈরি করে।


আমার প্রোগ্রামিংয়ের পুরাতন অভ্যাস হিসাবে, আমি মনে করি কোনও অনুচ্ছেদে ডানদিকে জটিল ভাব প্রকাশ করা এটিকে আরও পাঠযোগ্য করে তুলতে পারে:

a == b+c or b == a+c or c == a+b

প্লাস () :

((a == b+c) or (b == a+c) or (c == a+b))

এবং আমি আরও মনে করি যে মাল্টি-লাইনগুলি ব্যবহার করা আরও এ জাতীয় সংবেদন করতে পারে:

((a == b+c) or 
 (b == a+c) or 
 (c == a+b))

একটি জন্য তিনটি সমতা সমাধান:

a in (b+c, b-c, c-b)

এটি চেষ্টা করুন এবং সরল করুন না। পরিবর্তে, আপনি একটি ফাংশন দিয়ে কি করছেন নাম দিন :

def any_two_sum_to_third(a, b, c):
  return a + b == c or a + c == b or b + c == a

if any_two_sum_to_third(foo, bar, baz):
  ...

"চালাক" এমন কিছু দিয়ে শর্তটি প্রতিস্থাপন করুন যা এটি সংক্ষিপ্ত করে তুলতে পারে তবে এটি এটিকে আরও পঠনযোগ্য করে তুলবে না। এটি তবে খুব পঠনযোগ্য নয় তবে এটি ছেড়ে দেওয়া, কারণ আপনি কেন তিনটি শর্তটি এক নজরে পরীক্ষা করছেন তা জানা মুশকিল। এটি আপনি যা যা পরীক্ষা করছেন তা একেবারে স্ফটিক করে তোলে।

পারফরম্যান্স সম্পর্কে, এই পদ্ধতির কোনও ফাংশন কলের ওভারহেড যুক্ত করে, তবে আপনি যদি কোনও বাঁধা না পেয়ে থাকেন তবে অবশ্যই সম্পাদনার জন্য পাঠযোগ্যতার ত্যাগ করতে হবে না absolutely এবং সর্বদা পরিমাপ করুন, যেহেতু কিছু চতুর বাস্তবায়ন কিছু পরিস্থিতিতে কিছু ফাংশন কলগুলি সরিয়ে আনতে এবং অনুকূলিত করতে সক্ষম।


নীচের কোডটি প্রতিটি উপাদানকে অন্যের যোগফলের সাথে পুনরাবৃত্তভাবে তুলনা করতে ব্যবহার করা যেতে পারে, যা উপাদানটিকে বাদ দিয়ে পুরো তালিকার যোগফল থেকে গণনা করা হয়।

 l = [a,b,c]
 any(sum(l)-e == e for e in l)

পাইথন 3:

(a+b+c)/2 in (a,b,c)
(a+b+c+d)/2 in (a,b,c,d)
...

এটি যেকোন সংখ্যক ভেরিয়েবলের স্কেল করে:

arr = [a,b,c,d,...]
sum(arr)/2 in arr

তবে, সাধারণভাবে আমি সম্মত হই যে আপনার যদি তিনটির বেশি ভেরিয়েবল না থাকে তবে মূল সংস্করণটি আরও পঠনযোগ্য।


যদি আমরা পাইথনের জেনটি দেখি তবে জোর দেওয়া আমার:

টিম পিটার্স দ্বারা নির্মিত পাইথনের জেন

কদর্য চেয়ে সুন্দর।
সুস্পষ্ট বর্ণিত চেয়ে ভাল।
সহজ জটিল চেয়ে ভাল।
জটিল জটিল চেয়ে ভাল।
ফ্ল্যাট বাসা থেকে ভাল।
গা Sp়ের চেয়ে বিরাগই ভাল।
পঠনযোগ্যতা গণনা।
বিশেষ কেসগুলি নিয়ম ভাঙার পক্ষে যথেষ্ট বিশেষ নয়।
যদিও ব্যবহারিকতা বিশুদ্ধতা বীট।
ত্রুটিগুলি কখনই নিঃশব্দে কাটানো উচিত নয়।
স্পষ্টভাবে নিরব না হলে।
অস্পষ্টতার মুখে অনুমান করার প্রলোভনটিকে অস্বীকার করুন।
এটির জন্য একটি - এবং অগ্রাধিকার কেবল একটিই - প্রকাশ্য উপায় থাকতে হবে।
যদিও আপনি ডাচ না হলে এই উপায়টি প্রথমে সুস্পষ্ট নাও হতে পারে।
এখন আগের চেয়ে ভাল is
যদিও এখনই প্রায়শই এখনকার চেয়ে ভাল হয় না।
যদি বাস্তবায়নটি ব্যাখ্যা করা শক্ত হয় তবে এটি একটি খারাপ ধারণা।
বাস্তবায়নটি যদি ব্যাখ্যা করা সহজ হয় তবে এটি একটি ভাল ধারণা হতে পারে।
নেমস্পেসগুলি হ'ল একটি দুর্দান্ত ধারণা - আসুন আমরা তাদের আরও কিছু করি!

সর্বাধিক পাইথোনিক দ্রবণটি হ'ল এটি পরিষ্কার, সহজতম এবং সহজ ব্যাখ্যা:

a + b == c or a + c == b or b + c == a

আরও ভাল, এই কোডটি বুঝতে আপনার পাইথনও জানতে হবে না! এটা এত সহজ। এটি হ'ল রিজার্ভেশন ছাড়াই সেরা সমাধান। আর কিছু হ'ল বৌদ্ধিক হস্তমৈথুন।

তদ্ব্যতীত, এটি সম্ভবত সেরা পারফরম্যান্স সমাধানও হ'ল শর্ট সার্কিটগুলির সমস্ত প্রস্তাবগুলির মধ্যে এটি কেবলমাত্র একটি। যদি a + b == c কেবল একটি একক সংযোজন এবং তুলনা সম্পন্ন হবে।


সাধারণ পদ্ধতিতে,

m = a+b-c;
if (m == 0 || m == 2*a || m == 2*b) do_stuff ();

যদি, একটি ইনপুট ভেরিয়েবল পরিচালনা করা আপনার জন্য ঠিক থাকে,

c = a+b-c;
if (c==0 || c == 2*a || c == 2*b) do_stuff ();

আপনি যদি বিট হ্যাক ব্যবহার করে শোষণ করতে চান তবে আপনি "!", ">> 1" এবং "<< 1" ব্যবহার করতে পারেন

আমি বিভাজন এড়াতে পেরেছি যদিও এটি গোলাকার ত্রুটিগুলি এড়াতে দুটি গুণগুলি এড়ানোর জন্য সক্ষম করে। তবে ওভারফ্লো পরীক্ষা করে দেখুন


(a+b-c)*(a+c-b)*(b+c-a) == 0

যদি কোনও দুটি পদগুলির যোগফল তৃতীয় পদের সমান হয়, তবে এর একটি কারণ শূন্য হবে, পুরো পণ্যকে শূন্য করে তুলবে।






boolean