পাইথনে ল্যাম্বদা বোঝা এবং একাধিক যুক্তি পাস করার জন্য এটি ব্যবহার করা


90

ল্যাম্বডায় আমি যা দেখতে পাচ্ছি তার সব কিছু পড়ার পরেও, আমি কী চাই তা কীভাবে এটি করব তা আমি এখনও বুঝতে পারি না।

প্রত্যেকে উদাহরণ ব্যবহার করে:

lambda x, y : x + y

কেন আপনি উভয় xএবং yআগে উভয় বিবরণ প্রয়োজন :? এছাড়াও আপনি কীভাবে এটি একাধিক যুক্তি ফিরিয়ে আনবেন?

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

self.buttonAdd_1 = Button(self, text='+', command=lambda : self.calculate(self.buttonOut_1.grid_info(), 1))

এটি ঠিক কাজ করে। তবে নিম্নলিখিত কোডটি করে না:

self.entry_1.bind("<Return>", lambda : self.calculate(self.buttonOut_1.grid_info(), 1))

এটি ত্রুটিটি দেয়:

প্রকারের ত্রুটি: () কোনও আর্গুমেন্ট নেয় না (1 দেওয়া)

উত্তর:


136

':' এর আগে আপনাকে 'x' এবং 'y' উভয়ই কেন বলা দরকার?

কারণ একটি ল্যাম্বডা (ধারণাগতভাবে) কোনও ফাংশন হিসাবে একই, কেবল ইনলাইন লিখিত। আপনার উদাহরণ সমান

def f(x, y) : return x + y

যেমন একটি নামের সাথে আবদ্ধ না করে f

এছাড়াও আপনি কীভাবে এটি একাধিক যুক্তি ফিরিয়ে আনবেন?

একইভাবে একটি ফাংশন সঙ্গে। সাধারণত, আপনি একটি টুপল ফিরে:

lambda x, y: (x+y, x-y)

বা একটি তালিকা, বা একটি শ্রেণী, বা যা কিছু।

self.entry_1.bindডেমোস্টেনেক্স দ্বারা জিনিসটির উত্তর দেওয়া উচিত।


4
সত্যিই তাদের বাইরে অন্তত বিট পেতে, আপনি আপনি আরও ভাল প্রোগ্রামার করতে হবে কিছু কার্যকরী প্রোগ্রামিং, যা একটি ভয়ঙ্কর অভিজ্ঞতা যখন আপনি এটি বুঝতে শুরু চেষ্টা করতে পারে, এবং সম্ভবত </ অপপ্রচার>।
phipsgabler

4
আপনি আমার দেবতা এবং আপনার প্রচার আমার প্রতিদিনের রুটি। তবুও, আমি এটি একটি টিউপলের উপর প্রয়োগ করার চেষ্টা করেছি: (train["pred_idx_cos"],train["target"]).apply(lambda x,y: get_result(x, y))এবং মনে হচ্ছে এটি কার্যকর হয় না। অনুগ্রহ করে প্রক্রিয়াজাত প্রোগ্রামিংয়ের ভুল থেকে আমার আত্মাকে বাঁচান
মনিকার জন্য রেভোলিউশন

@ রিভোলুসিওনফোর্স মনিকা কিছুটা দেরিতে জবাব দিলেও
ম্যাস ডট নেট

11

আমি বিশ্বাস করি বাইন্ড সবসময় ইভেন্টের প্যারামিটার প্রেরণের চেষ্টা করে। চেষ্টা করুন:

self.entry_1.bind("<Return>", lambda event: self.calculate(self.buttonOut_1.grid_info(), 1))

আপনি প্যারামিটারটি গ্রহণ করেন এবং এটি কখনই ব্যবহার করবেন না।


হ্যাঁ, আমি এত দিন ধরে এটি নিয়ে কাজ করেছিলাম এবং তারপরে 1 মিনিটের ফ্ল্যাটে আমি একটি কাজের উত্তর পাই ... বিটিডব্লিউ, আপনি কি জানেন যে কেন জিনিসগুলি কলোনগুলির সামনে যায়?
তালিসিন

4
কারণ তারা ফেকশন প্যারামিটার
phipsgabler

4
এটিকে একটি ডিফল্ট মান দেওয়ার জন্য আপনি "ইভেন্ট = কিছুই নয়" চেষ্টা করতে পারেন, তারপরে বাঁধা এবং বোতামটির জন্য ফাংশনটি ব্যবহার করা যেতে পারে।
ডেমোস্টেনেক্স

5

কেন আপনি উভয় xএবং yআগে উভয় বিবরণ প্রয়োজন :?

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

আপনার ত্রুটি বার্তার অর্থ হ'ল টাকায় আপনার ল্যাম্বডাকে একটি যুক্তি দিয়ে কল করা হচ্ছে, যখন আপনার ল্যাম্বদা কোনও যুক্তি স্বীকার করার জন্য লিখিত হয়েছে। আপনার যদি যুক্তির প্রয়োজন না হয় তবে কেবল একটি গ্রহণ করুন এবং এটি ব্যবহার করবেন না। ( ডেমোস্টেনেক্সের কোড রয়েছে , আমি এটি পোস্ট করতাম তবে এতে মারধর করা হত))


ব্যাখ্যার জন্য ধন্যবাদ. আমি মনে করি আমি অবশেষে এই সম্পর্কে আমার মাথা পেতে।
তালিসিন

3

':' এর আগে আপনাকে 'x' এবং 'y' উভয়ই কেন বলা দরকার?

আপনি আসলে কিছু পরিস্থিতিতে (যখন আপনার কেবলমাত্র একটি যুক্তি থাকতে পারে) x এবং y এর আগে ":" রাখবেন না।

>>> flist = []
>>> for i in range(3):
...     flist.append(lambda : i)

তবে ল্যাম্বডায় আমি নাম দ্বারা আবদ্ধ হবে, তাই,

>>> flist[0]()
2
>>> flist[2]()
2
>>>

আপনি যা চাইতে পারেন তার থেকে আলাদা।

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