python সহজ কেন পাইথন lambdas দরকারী?




সহজ ভাষায় পাইথন ৩ pdf (21)

আমি পাইথন lambdas খুঁজে বের করার চেষ্টা করছি। লাম্বা কি সেই "আকর্ষণীয়" ভাষাগুলির মধ্যে একটি যা বাস্তব জীবনে ভুলে যাওয়া উচিত?

আমি নিশ্চিত যে কিছু প্রান্তের ক্ষেত্রে এটি প্রয়োজন হতে পারে তবে এটির অস্পষ্টতা দেওয়া হয়েছে, ভবিষ্যতের প্রকাশগুলিতে এটির সম্ভাব্যতা (আমার সংজ্ঞাগুলি বিভিন্ন সংজ্ঞাগুলির উপর ভিত্তি করে) এবং কম কোডিং স্বচ্ছতা - এটি হওয়া উচিত অবহেলিত?

এটি আমাকে সি টাইপের বর্ধিত (বাফার ওভারফ্লো) মনে করিয়ে দেয় - অন্য ক্ষেত্রের মানগুলি সেট করতে উপরের পরিবর্তনশীল এবং ওভারলোডিংয়ের দিকে নির্দেশ করে। এটি একটি techie showmanship কিন্তু রক্ষণাবেক্ষণ কোডার দুঃস্বপ্ন সাজানোর মত মনে হয়।


আমি ডেভিড মার্টেজের বইটি আজ পাইথনের পাঠ্য প্রক্রিয়াকরণটি পড়তে শুরু করেছি। অ্যাপারেন্ডিক এ-তে বর্ণিত ব্যাখ্যা অনুসারে ল্যামডার প্রথম অধ্যায়ের উদাহরণগুলির সাথে তার মোটামুটিভাবে বর্ণিত বর্ণনা রয়েছে, তবে আমার জন্য পৃষ্ঠাটি বন্ধ করে দিয়েছে (অবশেষে) এবং হঠাৎ আমি তাদের মূল্য বুঝতে পেরেছি। তার ব্যাখ্যাটি আপনার জন্য কাজ করবে না এবং আমি এখনও আবিষ্কারের পর্যায়ে আছি তাই আমি নিম্নলিখিতগুলি ব্যতীত এই প্রতিক্রিয়াগুলি যোগ করার চেষ্টা করব না: আমি পাইথনতে নতুন নই, আমি ওপ ল্যামদাসের জন্য নতুন ছিলাম আমার জন্য সংগ্রাম এখন আমি মার্টেজ পড়ি, আমি মনে করি আমি তাদের পেয়েছি এবং আমি তাদেরকে খুব দরকারী হিসাবে দেখছি মনে হচ্ছে তারা প্রোগ্রামিংয়ের জন্য ক্লিনার পদ্ধতির অনুমতি দেয়।

তিনি পাইথনের জিনকে পুনরুত্পাদন করেন, যার একটি লাইন জটিল থেকে জটিল। লাম্বডাসের সাথে একটি অ-ওওপি প্রোগ্রামার পড়ার কোড হিসাবে (এবং গত সপ্তাহে তালিকা বোঝার পর্যন্ত) আমি ভাবলাম - এটা কি সহজ? ।অবশেষে আজ বুঝতে পেরেছি যে এই বৈশিষ্ট্যগুলি কোডটিকে আরও বেশি পাঠযোগ্য করে তুলতে পারে, এবং বিকল্পের চেয়ে বোঝার যোগ্য-যা কোনও ধরণের একটি লুপ। আমি বুঝতে পেরেছিলাম যে আর্থিক বিবৃতিগুলির মতো পাইথন নবীন ব্যবহারকারীর জন্য ডিজাইন করা হয়নি, বরং এটি এমন ব্যবহারকারীর জন্য ডিজাইন করা হয়েছে যা শিক্ষিত হতে চায়। আমি এই ভাষা কিভাবে শক্তিশালী বিশ্বাস করতে পারবেন না। যখন এটি আমার উপর (অবশেষে) Lambbas এর উদ্দেশ্য এবং মূল্য প্রদর্শিত হয়, আমি প্রায় 30 টি প্রোগ্রাম ছিনতাই করতে চাই এবং উপযুক্ত যেখানে lambdas নির্বাণ শুরু।


আমি আপনাকে একটি উদাহরণ দিতে পারি যেখানে আমি আসলে lambda গুরুতর প্রয়োজন। আমি একটি গ্রাফিকাল প্রোগ্রাম তৈরি করছি, যেখানে একটি ফাইলটিতে ডান ক্লিক ক্লিক করে এবং এটি তিনটি বিকল্পের একটি নির্ধারণ করে। এটি দেখা গেছে যে টিকিটারে (যে GUI ইন্টারফেসিং প্রোগ্রাম আমি এটি লিখছি), যখন কেউ একটি বোতাম টিপবে, তখন এটি আর্গুমেন্টগুলিতে কোন কমান্ডটি বরাদ্দ করা যাবে না। তাই যদি আমি বিকল্পগুলির মধ্যে একটি বেছে নিই এবং আমার পছন্দের ফলাফলটি চাইতাম:

print 'hi there'

তারপর কোন বড় চুক্তি। কিন্তু যদি আমার কোনও নির্দিষ্ট বিবরণের জন্য আমার পছন্দ প্রয়োজন। উদাহরণস্বরূপ, যদি আমি পছন্দ A নির্বাচন করি, এটি এমন একটি ফাংশনকে কল করে যা কিছু আর্গুমেন্ট গ্রহণ করে যা পছন্দসই A, B বা C তে নির্ভর করে, TKinter এইটিকে সমর্থন করতে পারে না। আসলেই এই আশেপাশে পেতে লামদা একমাত্র বিকল্প ছিল ...


Lambda একটি পদ্ধতি নির্মাতা। আপনি রান সময় সময়ে প্রোগ্রাম সংশ্লেষ করতে পারেন, যদিও পাইথন এর ল্যাম্বা খুব শক্তিশালী নয়। উল্লেখ্য যে কয়েকজন মানুষ এ ধরনের প্রোগ্রামিং বুঝতে পারে।


lambda শুধু function বলার একটি অভিনব উপায়। এর নাম ব্যতীত অন্য কিছু অস্পষ্ট, ভীতিজনক বা রহস্যজনক নয়। যখন আপনি নিম্নলিখিত লাইনটি পড়েন, তখন আপনার মনের মধ্যে function দ্বারা lambda প্রতিস্থাপন করুন:

>>> f = lambda x: x + 1
>>> f(3)
4

এটা শুধু x একটি ফাংশন সংজ্ঞায়িত। কিছু অন্যান্য ভাষা, যেমন R , স্পষ্টভাবে বলুন:

> f = function(x) { x + 1 }
> f(3)
4

আপনি দেখতে? এটি প্রোগ্রামিং সবচেয়ে প্রাকৃতিক জিনিস এক।


একটি Lambda একটি অত্যন্ত গুরুত্বপূর্ণ বিমূর্তন প্রক্রিয়া অংশ যা উচ্চ আদেশ ফাংশন সঙ্গে কাজ করে। তার মান সঠিক বোঝার জন্য, অনুগ্রহ করে অ্যাবেলসন এবং সুসমানের উচ্চমানের পাঠগুলি দেখুন এবং SICP বইটি SICP

এই আধুনিক সফটওয়্যার ব্যবসায়ের মধ্যে প্রাসঙ্গিক সমস্যা, এবং কখনও জনপ্রিয় হয়ে উঠছে।


আপনি Lambda ফাংশন সম্পর্কে কথা বলছেন? মত

lambda x: x**2 + 2*x - 5

যারা জিনিস আসলে বেশ দরকারী। পাইথন কার্যকরী প্রোগ্রামিং নামক প্রোগ্রামিংয়ের একটি স্টাইল সমর্থন করে যেখানে আপনি অন্য কাজগুলিতে ফাংশনগুলি প্রেরণ করতে পারেন। উদাহরণ:

mult3 = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])

[3, 6, 9] থেকে [3, 6, 9] , মূল তালিকার সেই উপাদানগুলিকে [3, 6, 9] mult3 সেট করে। এটি ছোট (এবং, কোনটি যুক্তিযুক্ত, সুস্পষ্ট হতে পারে)

def filterfunc(x):
    return x % 3 == 0
mult3 = filter(filterfunc, [1, 2, 3, 4, 5, 6, 7, 8, 9])

অবশ্যই, এই বিশেষ ক্ষেত্রে, আপনি তালিকা বোঝার মতো একই জিনিস করতে পারেন:

mult3 = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]

(অথবা এমনকি range(3,10,3) ), তবে আরও অনেক বেশি পরিশীলিত ব্যবহার ক্ষেত্রে রয়েছে যেখানে আপনি একটি তালিকা বোঝার ব্যবহার করতে পারবেন না এবং ল্যাম্বা ফাংশনটি কিছু লেখার সংক্ষিপ্ত উপায় হতে পারে।

  • অন্য ফাংশন থেকে একটি ফাংশন ফিরে

    >>> def transform(n):
    ...     return lambda x: x + n
    ...
    >>> f = transform(3)
    >>> f(4)
    7

    এটি প্রায়ই প্যাথন এর সজ্জাকারীদের মতো ফাংশন র্যাপার তৈরি করতে ব্যবহৃত হয়।

  • reduce() সঙ্গে একটি পুনরাবৃত্ত ক্রম উপাদান মিশ্রন reduce()

    >>> reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])
    '1, 2, 3, 4, 5, 6, 7, 8, 9'
  • একটি বিকল্প কী দ্বারা সাজানো

    >>> sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
    [5, 4, 6, 3, 7, 2, 8, 1, 9]

আমি নিয়মিত lambda ফাংশন ব্যবহার। এটি ব্যবহার করার জন্য আমাকে কিছু সময় লেগেছিল, কিন্তু অবশেষে আমি বুঝতে পেরেছিলাম যে তারা ভাষাটির একটি মূল্যবান অংশ।


আমি lambdaপ্যারামিটার অন্তর্ভুক্ত যে callbacks তৈরি করতে ব্যবহার করুন । এটি একই কার্যকারিতা সঞ্চালনের জন্য একটি পদ্ধতি লেখার চেয়ে একটি লম্বাতে একটি লাম্বার লেখা।

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

import imported.module

def func():
    return lambda: imported.module.method("foo", "bar")

উল্টোদিকে:

import imported.module

def func():
    def cb():
        return imported.module.method("foo", "bar")
    return cb

প্রথম অভিনন্দন যে lambda চিন্তা পরিচালিত। আমার মতে এই সঙ্গে কাজ করার জন্য সত্যিই শক্তিশালী গঠন। কার্যকরী প্রোগ্রামিং ভাষাগুলির দিকে এই দিনগুলির প্রবণতা নিশ্চয়ই একটি নির্দেশক যে এটি এড়াতে হবে না এবং এটি নিকট ভবিষ্যতে পুনরায় সংজ্ঞায়িত করা হবে।

আপনি শুধু একটু ভিন্ন চিন্তা করতে হবে। আমি শীঘ্রই আপনি এটা ভালবাসা নিশ্চিত। কিন্তু আপনি শুধুমাত্র পাইথন সঙ্গে মোকাবিলা যদি সতর্কতা অবলম্বন করা আবশ্যক। কারণ লাম্বা একটি বাস্তব বন্ধন নয়, এটি কোনভাবেই "ভাঙা" হয়: পাইথন লম্বডা ভাঙা হয়


আমি পাইথনের ল্যাম্বার বিশেষ বাস্তবায়ন নিয়ে কথা বলতে পারি না, তবে সাধারণ লম্বা ফাংশনগুলি সত্যিই কার্যকরী। তারা কার্যকরী প্রোগ্রামিং একটি মূল কৌশল (সম্ভবত এমনকি কৌশল), এবং তারা বস্তু ভিত্তিক প্রোগ্রামে খুব ব্যবহার্য। নির্দিষ্ট ধরনের সমস্যার জন্য, তারা সবচেয়ে ভাল সমাধান, তাই অবশ্যই ভুলে যাওয়া উচিত নয়!

আমি আপনাকে Closures এবং ম্যাপ ফাংশন (এটি পাইথন ডক্সের লিঙ্কগুলি, কিন্তু কার্যকরী গঠনগুলিকে সমর্থন করে এমন প্রায় প্রতিটি ভাষাতে বিদ্যমান) এটি পড়ার জন্য আপনাকে পরামর্শ দেয়।


আপনি lambda সঙ্গে অনেক কিছু করতে পারেন আপনি নামযুক্ত ফাংশন বা তালিকা এবং জেনারেটরের এক্সপ্রেশন সঙ্গে ভাল করতে পারেন।

ফলস্বরূপ, অধিকাংশ অংশে আপনি কেবলমাত্র যে কোনও পরিস্থিতিতেই এটির মধ্যে একটি হওয়া উচিত (সম্ভবত ইন্টারেক্টিভ ইন্টারপ্রেটারে লেখা স্ক্র্যাচ কোডের জন্য)।


পাইথন ইন, lambda শুধুমাত্র ফাংশন ইনলাইন সংজ্ঞায়িত করার একটি উপায়,

a = lambda x: x + 1
print a(1)

এবং..

def a(x): return x + 1
print a(1)

ঠিক একই।

Lambda দিয়ে আপনি কিছুই করতে পারবেন না যা আপনি নিয়মিত ফাংশন দিয়ে করতে পারবেন না-পাইথন ফাংশনগুলি অন্য কোনও জিনিসের মতোই একটি বস্তু এবং lambdas কেবল একটি ফাংশন সংজ্ঞায়িত করে:

>>> a = lambda x: x + 1
>>> type(a)
<type 'function'>

আমি সত্যই মনে করি পাইথন-এ lambda শব্দটি অকার্যকর বলে মনে lambda আমি কখনই তাদের ব্যবহার করার প্রয়োজন ছিল না (অথবা ব্যবহৃত নিয়মিত ফাংশন, তালিকা-বোঝার বা অনেকগুলি অন্তর্নির্মিত কাজগুলির পরিবর্তে এটি ব্যবহার করা যেতে পারে)

সম্পূর্ণরূপে র্যান্ডম উদাহরণের জন্য, নিবন্ধটি থেকে "পাইথন ল্যাম্বা ভেঙ্গে গেছে!" :

কিভাবে lambda ভাঙা দেখতে, ফাংশন একটি তালিকা তৈরি করার চেষ্টা করুন fs=[f0,...,f9] যেখানে fi(n)=i+n । প্রথম প্রচেষ্টা:

>>> fs = [(lambda n: i + n) for i in range(10)]
>>> fs[3](4)
13

আমি যুক্তি দিই, এমনকি যদি এটি কাজ করে, এটি ভয়ঙ্কর এবং "অযৌক্তিক", একই কার্যকারিতা অগণিত অন্যান্য উপায়ে লেখা যেতে পারে, উদাহরণস্বরূপ:

>>> n = 4
>>> [i + n for i in range(10)]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

হ্যাঁ, এটি একই নয়, তবে আমি এমন কোনো কারণ দেখিনি যেখানে একটি তালিকাতে Lambda ফাংশনগুলির একটি গ্রুপ তৈরি করা প্রয়োজন। এটি অন্য ভাষায় ইন্দ্রিয়গ্রাহ্য হতে পারে, তবে পাইথন হ্যাসেল না (অথবা লিস্প, বা ...)

দয়া করে নোট করুন যে আমরা ল্যাম্বা ব্যবহার করতে পারি এবং এখনও এই ভাবে প্রত্যাশিত ফলাফল অর্জন করতে পারি:

>>> fs = [(lambda n,i=i: i + n) for i in range(10)]
>>> fs[3](4)
7

সম্পাদনা:

Lambda দরকারী কিছু ক্ষেত্রে আছে, উদাহরণস্বরূপ এটি PyQt অ্যাপ্লিকেশনগুলিতে সিগন্যাল সংযোজন করার সময় এটি সুবিধাজনক, যেমন:

w = PyQt4.QtGui.QLineEdit()
w.textChanged.connect(lambda event: dothing())

শুধু w.textChanged.connect(dothing) একটি অতিরিক্ত event আর্গুমেন্ট সহ dothing পদ্ধতি কল করবে এবং একটি ত্রুটি সৃষ্টি করবে। Lambda ব্যবহার করে আমরা একটি মোড়ানো ফাংশন সংজ্ঞায়িত ছাড়া যুক্তিযুক্তভাবে যুক্তি ড্রপ করতে পারেন।


আমার মতামত অনুসারে lambda সম্পর্কে চমৎকার জিনিসগুলির মধ্যে একটি হল যে এটি কার্যকর হওয়া পর্যন্ত সাধারণ ফর্মগুলির জন্য মূল্যায়ন নির্ধারণ করার উপায়। আমাকে বিস্তারিত বলতে দাও.

অনেক লাইব্রেরি রুটিন বাস্তবায়িত হয় যাতে নির্দিষ্ট প্যারামিটারগুলিকে ক্যালেবল (যার মধ্যে Lambda হয়) করতে অনুমতি দেয়। ধারণাটি হল যে প্রকৃত মানটি কেবল তখনই গণনা করা হবে যখন এটি ব্যবহার করা হবে (বরং এটি যখন বলা হয়)। একটি (বানানো) উদাহরণ বিন্দু ব্যাখ্যা করতে সাহায্য করতে পারে। ধরুন আপনি একটি রুটিন যা একটি নির্দিষ্ট টাইমস্ট্যাম্প লগ করতে যাচ্ছি। আপনি রুটিন বর্তমান সময় 30 মিনিট বিয়োগ ব্যবহার করতে চান। আপনি তাই এটি কল চাই

log_timestamp(datetime.datetime.now() - datetime.timedelta(minutes = 30))

এখন অনুমান করুন যে প্রকৃত ফাংশন কেবল তখনই বলা যেতে পারে যখন একটি নির্দিষ্ট ইভেন্ট ঘটে এবং আপনি টাইমস্ট্যাম্পটি শুধুমাত্র তখনই গণনা করতে চান। আপনি তাই ভালো করতে পারেন

log_timestamp(lambda : datetime.datetime.now() - datetime.timedelta(minutes = 30))

log_timestamp অনুমান করা এই মত log_timestamp হ্যান্ডেল করতে পারে, এটি যখন এটি প্রয়োজন হবে এটি মূল্যায়ন এবং আপনি যে সময় টাইমস্ট্যাম্প পাবেন।

অবশ্যই এটি করার বিকল্প উপায় আছে (উদাহরণস্বরূপ operator মডিউল ব্যবহার করে) তবে আমি আশা করি আমি পয়েন্টটি প্রকাশ করেছি।

আপডেট : Here একটি সামান্য আরো কংক্রিট বাস্তব বিশ্বের উদাহরণ।

আপডেট 2 : আমি মনে করি এটি একটি উদাহরণ যা একটি thunk বলা হয়।


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

Lambdas বিভ্রান্তিকর করতে ঝোঁক, কিন্তু একবার একটি কঠিন বোঝার প্রাপ্ত হয়, আপনি এই মত পরিষ্কার মার্জিত কোড লিখতে পারেন:

squared = map(lambda x: x*x, [1, 2, 3, 4, 5])

কোডের উপরের লাইনটি তালিকার সংখ্যাগুলির স্কোয়ারগুলির একটি তালিকা প্রদান করে। অবশেষে, আপনি এটি করতে পারেন:

def square(x):
    return x*x

squared = map(square, [1, 2, 3, 4, 5])

এটি পূর্বের কোডটি সংক্ষিপ্ত, এবং এটি বিশেষ করে সত্যই যদি আপনি মানচিত্র ফাংশন (অথবা কোনও অনুরূপ ফাংশন যা একটি পরামিতি হিসাবে একটি ফাংশন নেয়) ব্যবহার করতে চান। এই কোড আরও স্বজ্ঞাত এবং মার্জিত করে তোলে।

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

আরো বাস্তব দৃষ্টিকোণ থেকে, সম্প্রতি আমার জন্য lambdas বৃহত্তম সুবিধা একটি জিআইআই এবং ইভেন্ট চালিত প্রোগ্রামিং হয়েছে। আপনি যদি Tkinter মধ্যে callbacks একটি চেহারা নিতে, তারা আর্গুমেন্ট হিসাবে গ্রহণ সব ঘটনা যে তাদের triggered। যেমন

def define_bindings(widget):
    widget.bind("<Button-1>", do-something-cool)

def do-something-cool(event):
    #Your code to execute on the event trigger

এখন যদি আপনার কিছু আর্গুমেন্ট পাস পাস? মাউস-ক্লিকের সমন্বয়গুলি সংরক্ষণ করতে 2 টি আর্গুমেন্ট পাস করার মতো সহজ কিছু। আপনি সহজেই এটির মতো এটি করতে পারেন:

def main():
    # define widgets and other imp stuff
    x, y = None, None
    widget.bind("<Button-1>", lambda event: do-something-cool(x, y))

def do-something-cool(event, x, y):
    x = event.x
    y = event.y
    #Do other cool stuff

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

সংক্ষেপে, lambdas দুর্দান্ত এবং কখনও underestimated করা উচিত নয়। পাইথন lambdas যদিও LISP lambdas হিসাবে একই নয় (যা আরো শক্তিশালী), কিন্তু আপনি সত্যিই তাদের সঙ্গে অনেক জাদু উপাদান করতে পারেন।


উপরে বর্ণিত হিসাবে, পাইথন মধ্যে Lambda অপারেটর একটি বেনামী ফাংশন সংজ্ঞায়িত, এবং পাইথন ফাংশন বন্ধ হয়। অপারেটর Lambda সঙ্গে বন্ধের ধারণা বিভ্রান্ত না গুরুত্বপূর্ণ, যা তাদের জন্য সিন্ট্যাকটিক মেথডোন হয়।

কয়েক বছর আগে যখন আমি পাইথনে শুরু করি, তখন আমি ল্যাম্বডগুলি ব্যবহার করতাম, মনে করতাম যে তারা তালিকা বোঝার সাথে সাথে শীতল ছিল। যাইহোক, আমি কয়েক হাজার ফাংশন পয়েন্ট ক্রম অনুযায়ী পাইথন লিখিত একটি বড় ওয়েবসাইট বজায় রাখা এবং আছে। আমি অভিজ্ঞতা থেকে শিখেছি যে lambdas জিনিসগুলি প্রোটোটাইপ করতে পারে তবে কিছু কী-স্টোক সঞ্চয় করার জন্য, অথবা কখনও কখনও নয়, তবে ইনলাইন ফাংশন (নামধারী বন্ধকরণ) ছাড়া কিছুই অফার করে না।

মূলত এই কয়েকটি পয়েন্ট নিচে boils:

  • অর্থপূর্ণ নামগুলি ব্যবহার করে স্পষ্টভাবে লিখিত সফ্টওয়্যার পড়ার পক্ষে সহজ। সংজ্ঞা দ্বারা বেনামী closures একটি অর্থপূর্ণ নাম থাকতে পারে না, তাদের নাম নেই। এই বিরক্তি মনে হয়, কিছু কারণে, ল্যাম্বা পরামিতিগুলিকেও সংক্রামিত করতে পারে, তাই আমরা প্রায়শই উদাহরণ দেখতে পাচ্ছি যেমন ল্যাম্বা x: x + 1
  • নামকরণ বন্ধগুলি পুনঃব্যবহার করা আরও সহজ, কারণ এটি একবারের নাম দ্বারা উল্লেখ করা যেতে পারে, যখন তাদের দ্বারা উল্লেখ করা একটি নাম থাকে।
  • lambdas এর পরিবর্তে নামযুক্ত বন্ধকরণ ব্যবহার করা কোডটি ডিবাগ করা সহজ, কারণ ট্রেসব্যাকগুলিতে নামটি প্রদর্শিত হবে এবং ত্রুটির কাছাকাছি।

যে তাদের বৃত্তাকার এবং তাদের নামকরণ closures রূপান্তর যথেষ্ট কারণ। যাইহোক, আমি বেনামী বন্ধের বিরুদ্ধে দুটি অন্যান্য বিরক্তি রাখা।

প্রথম ক্ষোভ কেবল যে তারা অন্য অপ্রয়োজনীয় শব্দ ভাষা আপ cluttering হয়।

দ্বিতীয় দুশ্চিন্তা গভীর এবং প্যাডডিগ স্তরের উপর, অর্থাৎ আমি পছন্দ করি না যে তারা একটি কার্যকরী-প্রোগ্রামিং শৈলীকে প্রচার করে, কারণ শৈলী বার্তা প্রেরণ, বস্তু ভিত্তিক বা পদ্ধতিগত শৈলীগুলির চেয়ে কম নমনীয়, কারণ ল্যাম্বা ক্যালকুলাসটি টুরিং- সম্পূর্ণ (ভাগ্যক্রমে পাইথন, আমরা এখনও একটি ল্যাম্বা ভিতরে যে নিষেধাজ্ঞা ভঙ্গ করতে পারেন)। ল্যাম্বাসগুলি এই শৈলীকে উত্সাহিত করার কারণগুলি হল:

  • একটি নিখুঁত রিটার্ন আছে, অর্থাত তারা মনে করে যে তারা 'কাজ করা উচিত'।

  • তারা একটি বিকল্প রাষ্ট্র গোপন প্রক্রিয়া অন্য, আরো স্পষ্ট, আরও পঠনযোগ্য, আরো পুনর্ব্যবহারযোগ্য এবং আরো সাধারণ প্রক্রিয়া: পদ্ধতি।

আমি lambda মুক্ত পাইথন লিখতে কঠিন চেষ্টা, এবং দৃষ্টিতে lambdas অপসারণ। আমি পাইথন lambdas ছাড়া সামান্য ভাল ভাষা হবে মনে করি, কিন্তু এটা আমার মতামত।


Lambambas ব্যবহার করার জন্য একটি দরকারী ক্ষেত্রে দীর্ঘ তালিকা বোঝার পঠনযোগ্যতা উন্নত করা হয় । এই উদাহরণে loop_dicস্বচ্ছতার জন্য সংক্ষিপ্ত কিন্তু কল্পনা loop_dicকরা খুব দীর্ঘ। আপনি যদি শুধুমাত্র একটি সাধারণ মান ব্যবহার করেন iযা তার মূল্যের Lambda সংস্করণ পরিবর্তে অন্তর্ভুক্ত করে তবে আপনি এটি পাবেন NameError

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]

>>> loop_dic = lambda i: {"name": i["name"] + " Wallace" }
>>> new_lis = [loop_dic(i) for i in lis]

>>> new_lis
[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]

পরিবর্তে

>>> lis = [{"name": "Peter"}, {"name": "Josef"}]

>>> new_lis = [{"name": i["name"] + " Wallace"} for i in lis]

>>> new_lis
[{'name': 'Peter Wallace'}, {'name': 'Josef Wallace'}]

আমি কয়েক বছর ধরে পাইথন ব্যবহার করছি এবং আমি এমন কোন ক্ষেত্রেই দৌড়াতে যাচ্ছি যেখানে আমি lambda প্রয়োজন । প্রকৃতপক্ষে, tutorial হিসাবে, এটি শুধুমাত্র সিন্ট্যাকটিক চিনির জন্য।


আমি একটি পাইথন শিক্ষানবিশ, তাই lambda একটি পরিষ্কার ধারণা পেতে আমি একটি 'জন্য' লুপ সঙ্গে এটি তুলনা; দক্ষতা পদে। এখানে কোড (পাইথন 2.7) -

import time
start = time.time() # Measure the time taken for execution

def first():
    squares = map(lambda x: x**2, range(10))
    # ^ Lambda
    end = time.time()
    elapsed = end - start
    print elapsed + ' seconds'
    return elapsed # gives 0.0 seconds

def second():
    lst = []
    for i in range(10):
        lst.append(i**2)
    # ^ a 'for' loop
    end = time.time()
    elapsed = end - start
    print elapsed + ' seconds'
    return elapsed # gives 0.0019998550415 seconds.

print abs(second() - first()) # Gives 0.0019998550415 seconds!(duh)

আমি কোড সদৃশ এড়াতে lambdas ব্যবহার। এটা ফাংশন সহজে বুঝতে সক্ষম হবে যেমন:

def a_func()
  ...
  if some_conditon:
     ...
     call_some_big_func(arg1, arg2, arg3, arg4...)
  else
     ...
     call_some_big_func(arg1, arg2, arg3, arg4...)

আমি যে একটি temp Lambda সঙ্গে প্রতিস্থাপন

def a_func()
  ...
  call_big_f = lambda args_that_change: call_some_big_func(arg1, arg2, arg3, args_that_change)
  if some_conditon:
     ...
     call_big_f(argX)
  else
     ...
     call_big_f(argY)

দুই লাইন সারাংশ:

  1. Closures : খুব দরকারী। তাদের শিখুন, তাদের ব্যবহার করুন, তাদের ভালোবাসুন।
  2. পাইথন এর lambda কীওয়ার্ড: অপ্রয়োজনীয়, মাঝে মাঝে দরকারী। যদি আপনি নিজের সাথে কিছু দূরবর্তী জটিল কাজ করেন, এটি সরান এবং একটি বাস্তব ফাংশন সংজ্ঞায়িত করুন।

lambdas জিআইআই প্রোগ্রামিং অত্যন্ত দরকারী। উদাহরণস্বরূপ, বলুন আপনি বোতামগুলির একটি গোষ্ঠী তৈরি করছেন এবং আপনি প্রতি বোতামে একটি অনন্য কলব্যাকের পরিবর্তে একটি একক প্যারামিটারাইজড কলব্যাক ব্যবহার করতে চান। Lambda আপনি সহজে যে অর্জন করতে দেয়:

for value in ["one","two","three"]:
    b = tk.Button(label=value, command=lambda arg=value: my_callback(arg))
    b.pack()

(দ্রষ্টব্যঃ যদিও এই প্রশ্নটি বিশেষভাবে lambda সম্পর্কে জিজ্ঞাসা করা হয়, আপনি একই ধরনের ফলাফল পেতে functools.partial ব্যবহার করতে পারেন)

বিকল্প প্রতিটি বোতামের জন্য একটি পৃথক কলব্যাক তৈরি করা যা ডুপ্লিকেট কোড হতে পারে।


আমি প্রায়শই এটি ব্যবহার করি, প্রধানত একটি নল বস্তু হিসাবে বা আংশিকভাবে একটি ফাংশন পরামিতি আবদ্ধ।

এখানে উদাহরণ:

নল বস্তু প্যাটার্ন বাস্তবায়ন:

{
    DATA_PACKET: self.handle_data_packets
    NET_PACKET: self.handle_hardware_packets
}.get(packet_type, lambda x : None)(payload)

পরামিতি বাঁধাই জন্য:

বলুন যে আমার নিম্নলিখিত API আছে

def dump_hex(file, var)
    # some code
    pass

class X(object):
    #...
    def packet_received(data):
        # some kind of preprocessing
        self.callback(data)
    #...

তারপর, যখন আমি দ্রুত প্রাপ্ত তথ্যটিকে একটি ফাইলে ডাম্প করতে চাই না তখন আমি তা করি:

dump_file = file('hex_dump.txt','w')
X.callback = lambda (x): dump_hex(dump_file, x)
...
dump_file.close()




closures