পাইথন ল্যাম্বডাস কেন দরকারী? [বন্ধ]


927

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

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

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


260
+1 ভাল প্রশ্ন - খারাপ অনুমান (ল্যাম্বডা অস্পষ্টতা) =) প্রোগ্রামিং কৌশলগুলির বিচারক না হওয়ার চেষ্টা করুন। এগুলি মূল্যায়ন করুন এবং এগুলি আপনার মানসিক টুলকিটে যুক্ত করুন। আপনি যদি এগুলি পছন্দ করেন না, সেগুলি ব্যবহার করবেন না এবং ধর্মীয় না হয়ে যুক্তিসঙ্গত আলোচনা করার জন্য প্রস্তুত থাকুন।
কিভেলি

41
হাস্কেল বিধি! লাম্বদা ফাংশন আপনাকে এক্সপ্রটিভিটি এবং বিমূর্ত শক্তি দেয়।
জোনাথন বারবারো

11
@JAL না পাতার মর্মর উল্লেখ করতে ...
ApproachingDarknessFish

8
@ অ্যাপোরিচিং ডার্কনেস ফিশ "আহ, এটাই আপনার বাবার প্যারেনথেসিস more - ওবি লিস্প কেনোবি
ক্ষেত্রগুলি

উত্তর:


1007

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

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

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

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

মূল তালিকার সেই উপাদানগুলিকে সেট mult3করে [3, 6, 9]যেগুলি 3 এর গুণক This এটি আরও ছোট

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(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]

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


26
উদাহরণগুলি ভালবাসুন, বুঝতে খুব সহজ। কিন্তু অংশ কমানোর জন্য। আমি যদি এই বৈশিষ্ট্যটি প্রয়োগ করতে হয়। আমি করব','.join(str(x) for x in [1,2,3,4,5,6,7,8,9])
etlds

3
বিটিডাব্লু আপনি যদি পাইথন 3 এ এটি চালান তবে প্রকৃত মানগুলি দেখতে আপনাকে ফিল্টার ফলাফলের তালিকায় কল করতে হবে, আপনারও ফান্টুলগুলি থেকে হ্রাস করতে হবে
জেরার্ড

আমরা কি উপরে "ফাংশনাল প্রোগ্রামিং" এর সংজ্ঞা সম্পর্কে নিশ্চিত? এটা আমার কাছে কিছুটা বিভ্রান্ত হয়ে এল।
stdout

3
আমি মনে করি মূল বিষয়টি হ'ল lambdaফাংশনগুলি বেনামে থাকতে পারে (যেমন তারা আপনার সমস্ত উদাহরণে রয়েছে)। যদি আপনি lambdaকোনও কিছুর জন্য একটি ফাংশন নির্ধারণ করে থাকেন তবে আপনি এটি ভুল করছেন এবং defপরিবর্তে ব্যবহার করা উচিত
Chris_Rands

1
@zgulser এটি কোনও সংজ্ঞা নয়, এটি কার্যকরী প্রোগ্রামিংয়ের মাধ্যমে আপনাকে এমন কিছু করার বিষয়ে একটি বিবৃতি।
ডেভিড জেড

377

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

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

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

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

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


36
এটি নন-প্রোগ্রামিং ব্যাকগ্রাউন্ড থেকে আগতদের জন্য একটি দুর্দান্ত বিবরণ (যেমন: সঠিক বিজ্ঞান) যা lambda বোঝার জন্য খুব সরল অর্থটি তৈরি করে । ধন্যবাদ!
গ্যাব্রিয়েল

10
রেমন্ড হেটেঞ্জার তার এক আলোচনায় এই নামটির জন্য শোক প্রকাশ করেছিলেন এবং বলেছিলেন যে 'ল্যাম্বদা'র পরিবর্তে' মেক ফাংশন 'নামকরণ করে সমস্ত বিভ্রান্তি এড়ানো যেত। :-)
ankush981

10
প্রতিস্থাপন lambdaদ্বারা functionআপনার মনের মধ্যে যোগ returnগত অভিব্যক্তি আগে
Ciprián Tomoiagă

4
@AaronMcMillin চেষ্টা করুন type(lambda x: 3)lambdaঅভিব্যক্তি এবং defবিবৃতি উভয় functionবস্তু উত্পন্ন ; এটি কেবলমাত্র একটি lambdaঅভিব্যক্তিটির বাক্য গঠন যা এটি উত্পাদন করতে পারে তা সীমাবদ্ধ করে।
চিপনার

6
অ্যারোন এমসি মিলিন আপনি আমার বক্তব্য মিস করছেন শুধু কারণ আপনি সংজ্ঞায়িত করতে পারবে না যে একটি সঙ্গে ফাংশন lambdaঅভিব্যক্তি মানে এই নয় একটি ফল lambdaপ্রকাশের নয় একটি ফাংশন।
চিপনার

107

দ্বি-লাইন সংক্ষিপ্তসার:

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

72

একটি ল্যাম্বডা একটি অত্যন্ত গুরুত্বপূর্ণ বিমূর্ত প্রক্রিয়াটির অংশ যা উচ্চতর ক্রমের সাথে কাজ করে। এর মান সম্পর্কে সঠিক ধারণা পেতে, দয়া করে অ্যাবেলসন এবং সুসমানের কাছ থেকে উচ্চ মানের পাঠ দেখুন এবং এসআইসিপি বইটি পড়ুন

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


1
ল্যাম্বডা এক্সপ্রেশন অন্যান্য ভাষায়ও জনপ্রিয় হয়ে উঠছে (সি # এর মতো)। তারা কোথাও যাচ্ছে না। লম্বডাসকে বোঝার জন্য ক্লোজারগুলিতে পড়া পড়া একটি দরকারী অনুশীলন হবে। বন্ধ jQuery এর মত ফ্রেমওয়ার্কগুলিতে প্রচুর কোডিং যাদু সম্ভব করে তোলে।
ড্যান এস্পার্জা

3
lambdaগুলি এবং প্রথম শ্রেণির ফাংশন গুলিয়ে ফেলবেন না । পাইথনের একটি অত্যন্ত সীমাবদ্ধ lambdaবিবৃতি রয়েছে তবে পুরোপুরি প্রথম শ্রেণির ফাংশন রয়েছে। এটির পার্থক্য কেবলমাত্র এটি হ'ল যে চারপাশে আপনি যে ফাংশনগুলি অতিক্রম করতে চান তার নাম লিখতে হবে।
গ্যারেথ ল্যাটি

59

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

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

(দ্রষ্টব্য: যদিও এই প্রশ্নটি বিশেষত জিজ্ঞাসা করছে lambda, আপনি একই ধরণের ফলাফল পেতে ফান্টচুলস.পার্পিয়াল ব্যবহার করতে পারেন )

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


1
ঠিক এই কারণেই আমি ল্যাম্বডা কী ছিল তা দেখলাম, তবে কেন এই কাজ করে, আমার কাছে এটি ঠিক ঠিক ফাংশনটি কল করার মতো দেখতে লাগে ( স্ট্যাকওভারফ্লো / সেকশনস / 3704568/… )। হতে পারে দেরি হয়ে গেছে, এটি কাজ করে, তবে কেন এটি কাজ করে?
রকোমে

5
@ রিকোমি: পার্থক্যটি এই উদাহরণে valueলুপে সংজ্ঞায়িত করা হয়; অন্য উদাহরণে প্যারামিটারের সর্বদা কেবল একটি মান ছিল। আপনি যখন এর মতো কিছু arg=valueযুক্ত করেন, আপনি কলব্যাকের সাথে বর্তমান মান সংযুক্ত করছেন। এটি ব্যতীত, আপনি কলব্যাকের মধ্যে চলকের একটি রেফারেন্স বাঁধেন। রেফারেন্সটিতে সর্বদা ভেরিয়েবলের চূড়ান্ত মান থাকবে, কারণ লুপটি ইতিমধ্যে চালানো শেষ হওয়ার কিছুক্ষণ পরে কলব্যাক হয় back
ব্রায়ান ওকলে

1
আমি গতকালই এই কাজটি পেয়েছি, আমি সত্যই এটি কতটা কার্যকর তা বিশ্বাস করতে পারি না ... আমি লুপের জন্য একটি থেকে মেনু এবং কনফিগারেশনের জন্য একটি সিএসভি ফাইল তৈরি করতে পারি। সত্যিই দরকারী জিনিস।
রকোমে

1
এর অস্তিত্বটি নোট করুন functools.partial()যা আপনাকে কম ক্রাফ্ট (এবং ছাড়া lambda) দিয়ে এটি করতে দেয় ।
গ্যারেথ লেটি

2
partial(my_callback, value)বনাম lambda arg=value: my_callback(arg)- ল্যাম্বডায় অনেক বেশি ক্রাফ্ট রয়েছে (আর্গমেন্টের জন্য অ্যাসাইনমেন্ট এবং তারপরে ব্যবহার) এবং উদ্দেশ্যটি কী তা কম স্পষ্ট হয় (আপনি ল্যাম্বডায় কিছুটা আলাদাভাবে করতে পারেন)। আমদানি আসলে কোনও সমস্যা নয় (আপনার যাইহোক একটি স্তূপ রয়েছে এবং এটি প্রতি ফাইলের মধ্যে একবার)। কোডটি কতটা ভালভাবে পড়তে পারে তার পক্ষে সর্বোত্তমভাবে বিচার করা হয় এবং partial()ল্যাম্বদার চেয়ে এটি পড়া সহজ।
গ্যারেথ লেটি

58

আমার সন্দেহ ল্যাম্বদা চলে যাবে। শেষ পর্যন্ত এটি সরিয়ে দেওয়ার চেষ্টা করা ছেড়ে দেওয়ার বিষয়ে গিডোর পোস্ট দেখুন । দ্বন্দ্বের একটি রূপরেখাও দেখুন ।

পাইথনের কার্যকরী বৈশিষ্ট্যগুলির পিছনে যে চুক্তি রয়েছে তার ইতিহাস সম্পর্কে আপনি আরও এই পোস্টটি দেখতে পারেন: http://python-history.blogspot.com/2009/04/origins-of-pythons-functional-features.html

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

আমার নিজস্ব দুটি সেন্ট: স্পষ্টতা যতটা কম যায় তত কমই ল্যাম্বদা এর মূল্য। সাধারণত আরও একটি পরিষ্কার সমাধান রয়েছে যা ল্যাম্বডাকে অন্তর্ভুক্ত করে না।


2
নোট করুন যে হ্রাস এখনও পাইথন 3.0 এ আমদানিযোগ্য। আপনি যদি সত্যিই এটি চান তবে আপনার এটি এখনও থাকতে পারে।
পাওয়ে পোলেভিজ

আমি মনে করি গিডোর প্রচেষ্টা সিনট্যাক্স সম্পর্কে আরও ছিল। এই ব্যক্তিটি এটিও মনে করে: cackhanded.com/blog/post/2008/01/24/…
লিউজ

38

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

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

এবং..

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

..are সঠিক একই।

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

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

আমি সত্যই মনে করি lambda কীওয়ার্ডটি অপ্রয়োজনীয় — সেগুলি ব্যবহার করার আমার কখনই প্রয়োজন ছিল না (বা নিয়মিত ফাংশন, একটি তালিকা-উপলব্ধি বা অনেকগুলি বিল্টিন ফাংশনগুলির মধ্যে একটির পরিবর্তে আরও ভাল ব্যবহার করা যেতে পারে one

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

ল্যাম্বদা কীভাবে ভাঙ্গা হয়েছে তা দেখার জন্য, 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]

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

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

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

সম্পাদনা:

কয়েকটি ক্ষেত্রে ল্যাম্বডা দরকারী, উদাহরণস্বরূপ, পাইকিউটি অ্যাপ্লিকেশনগুলিতে সংকেতগুলি সংযুক্ত করার সময় এটি প্রায়শই সুবিধাজনক this

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

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


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

1
ল্যাম্বডা হ'ল পাইথনের একমাত্র উপায় যা ব্যবহারকারীকে একটি "বেনামে" ফাংশন সরবরাহ করে, যেমন অন্যান্য অনেক ভাষায় (যেমন জাভাস্ক্রিপ্ট)।
স্টিফান গ্রুইনওয়াল্ড

1
আপনি যে ল্যাম্বদা এবং ফাংশনটি aনির্ধারণ করেছেন তা ঠিক একই নয়। :) তারা __name__কমপক্ষে মাঠের দ্বারা পৃথক ...
nPress325681

1
এটি কেবল একটি ইনলাইন ফাংশন ছাড়াও আরও বেশি কাজ করে।
kta

"অন্য ভাষায় বোধগম্য হতে পারে" সম্পর্কে আপনার যুক্তিটি অদ্ভুত। হয় ল্যাম্বডাসের অভ্যন্তরীণ গুণাবলী রয়েছে, না হয় তা নয়।
টাইটু

31

আমি একই রকম কাজ করে এমন ফাংশনগুলির তালিকার জন্য লাম্বদা দরকারী মনে করি, তবে বিভিন্ন পরিস্থিতিতে।

মজিলা বহুবচন নিয়মের মতো :

plural_rules = [
    lambda n: 'all',
    lambda n: 'singular' if n == 1 else 'plural',
    lambda n: 'singular' if 0 <= n <= 1 else 'plural',
    ...
]
# Call plural rule #1 with argument 4 to find out which sentence form to use.
plural_rule[1](4) # returns 'plural'

আপনি যদি তাদের সকলের জন্য কোনও ক্রিয়াকলাপটি সংজ্ঞায়িত করতে চান তবে এটির শেষে আপনি পাগল হয়ে যাবেন।
এছাড়া, এটিও মত ফাংশন নাম দিয়ে চমৎকার হবে না plural_rule_1, plural_rule_2ইত্যাদি এবং যদি আপনি প্রয়োজন চাই eval()যখন আপনি একটি পরিবর্তনশীল ফাংশন আইডি উপর নির্ভর করে করছি এটা।


1
এটি প্যাটার্ন মেলানো এবং বিকল্পগুলির সাথে এফ # তে আমার যে সংক্ষিপ্ত মুখোমুখি হয়েছিল তার মতোই দেখাচ্ছে। এই সিনট্যাক্সটি কীভাবে ব্যবহার করবেন সে সম্পর্কে আপনার কাছে আরও তথ্য আছে?
কেন

26

আপনি যা করতে পারেন তা খুব সুন্দর কিছু lambdaনামকরণ করা ফাংশন বা তালিকা এবং জেনারেটর এক্সপ্রেশন দিয়ে আরও ভাল করতে পারে।

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


3
"বেশিরভাগ অংশের জন্য আপনার মূলত যে কোনও পরিস্থিতিতে in দোভাষীর মধ্যে ল্যাম্বডা টাইপ করা এমনকি এটি সহায়ক নয়।
এস্লট

11
আপনি যদি "ল্যাম্বদা" ধারণার কথা বলছেন তবে @ জাভিয়ার আমি আপনার সাথে একমত হই; তবে, যদি আমরা অজগর কীওয়ার্ডটির বিষয়ে "ল্যাম্বডা" কথা বলি তবে: 1) নামযুক্ত ফাংশনগুলি দ্রুত হয় এবং আপনি যে কোনও জায়গায় ল্যাম্বডাস (মানচিত্র + ফিল্টার) ব্যবহার করতে পারবেন এমন আরও কিছু (স্টেটমেন্ট + এক্সপ্রেশন) করতে পারেন আপনি কেবল জেনারেটর এক্সপ্রেশন বা তালিকা বোঝার জন্য তালিকা তৈরি করতে পারেন যা আরও পারফরম্যান্স এবং সংক্ষিপ্ত। আমি বলছি না যে প্রথম শ্রেণির ফাংশনগুলি দুর্দান্ত নয়, কেবলমাত্র পাইথনের "ল্যাম্বদা" কীওয়ার্ডটি কেবলমাত্র একটি নামকৃত ফাংশনটি ব্যবহার করার মতো ভাল নয়।
অ্যারন মেনপা

3
ল্যাম্বডা আমার কাছে ফাংশনগুলির সাথে ব্যবহারের জন্য অনিবার্য যেগুলি কলব্যাক আর্গুমেন্টগুলি গ্রহণ করে কী হিসাবে = বাছাইয়ের জন্য যুক্তি () এবং সাজানো ()
রিক কোপল্যান্ড

19
@ রিক আমি সন্দেহ করি না তবে বাস্তবতা হ'ল আপনি যখন "ল্যাম্বদা" দেখেন এবং আপনি "জোহমিগোড ল্যাম্বদা" দেখেন এবং পাইথনের স্কিম কোডটি লিখতে শুরু করেন আপনি অজগরটির ল্যাম্বডা অভিব্যক্তির সীমাবদ্ধতার দ্বারা হতাশ হবেন। অন্যদিকে, আপনি যদি নিজেকে ভাবতে শুরু করেন "একটি তালিকা বোঝার কাজ হবে? না নামকরণের ফাংশন হওয়ার থেকে আমার কী দরকার হবে? না ঠিক আছে জরিমানা: সাজানো (এক্সএস, কী = ল্যাম্বদা এক্স: এক্স.নাম, x.height) ", আপনি সম্ভবত লম্বদা ব্যবহার করে সঠিক সংখ্যাটি ব্যবহার করবেন।
অ্যারন মেনপা

4
+1: যখন কেউ ল্যাম্বডা নামহীন ফাংশন ব্যবহার করেন তখন আমি যথেষ্ট পরিমাণে চাপ দিতে পারি না । এবং নাম একটি আছে মূল্যবান বৌদ্ধিক যুক্ত মূল্য রয়েছে।
স্টিফেন রোল্যান্ড

19

আমি কয়েক বছর ধরে পাইথন ব্যবহার করে আসছি এবং আমি কখনই ল্যাম্বডা দরকার পড়েনি to সত্যই, টিউটোরিয়াল হিসাবে বলা হয়েছে, এটি কেবল সিনট্যাকটিক চিনির জন্য।


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

1
ফাংশনে একাধিক যুক্তি পাস করার সুবিধা কী? FUNC_NAME (ক, খ): বরং ল্যামডা ব্যবহার না করে একটি + খ আসতে
dter

2
এটির প্রয়োজন নেই তবে এটি সংক্ষিপ্ত কোড এবং অনেক ক্ষেত্রে আরও পাঠযোগ্য, লিখতে সহায়তা করে। জাভা বা সি ++
ফুক্লভের

17

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

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


3
ল্যাম্বডাস ছাড়াই সেই জিনিসগুলি করা যায়। এটি কেবল একটি বড় ঝামেলা।
ব্রায়ান

17

লাম্বদা ফাংশন এটি কোনও ফাংশন তৈরির একটি অ-আমলাতান্ত্রিক উপায়।

এটাই. উদাহরণস্বরূপ, ধরুন আপনার মূল ফাংশন রয়েছে এবং বর্গমূল্যের প্রয়োজন need আসুন দেখে আসুন traditionalতিহ্যবাহী উপায় এবং ল্যাম্বদা উপায়:

প্রচলিত উপায়:

def main():
...
...
y = square(some_number)
...
return something

def square(x):
    return x**2

ল্যাম্বদা উপায়:

def main():
...
square = lambda x: x**2
y = square(some_number)
return something

পার্থক্যটা দেখ?

লাম্বদা ফাংশন তালিকাগুলি বা মানচিত্রের মতো তালিকাগুলি সহ খুব ভাল with আসলে, লাম্বদা ব্যবহার করে নিজেকে প্রকাশ করার জন্য এটি একটি "অজগর" উপায় y উদা:

>>>a = [1,2,3,4]
>>>[x**2 for x in a]
[1,4,9,16]

আসুন দেখুন সিনট্যাক্সের প্রতিটি উপাদানটির অর্থ কী:

[]: "আমাকে একটি তালিকা দিন"

x ** 2: "এই নতুন জন্মের ফাংশনটি ব্যবহার করে"

এক্স এর জন্য একটি: "প্রতিটি উপাদানকে"

এটা সুবিধাজনক? এই জাতীয় ফাংশন তৈরি করা হচ্ছে। ল্যাম্বদা ব্যবহার করে এটি আবার লিখি:

>>> square = lambda x: x**2
>>> [square(s) for x in a]
[1,4,9,16]

এখন আসুন মানচিত্রটি ব্যবহার করুন যা একই জিনিস তবে আরও ভাষা নিরপেক্ষ। মানচিত্রের 2 টি আর্গুমেন্ট লাগে:

(i) একটি ফাংশন

(ii) একটি পুনরাবৃত্তিযোগ্য

এবং আপনাকে এমন একটি তালিকা দেয় যেখানে প্রতিটি উপাদান এটির কার্যক্ষমতার প্রতিটি উপাদানকে প্রয়োগ করে function

সুতরাং, মানচিত্র ব্যবহার করে আমাদের হবে:

>>> a = [1,2,3,4]
>>> squared_list = map(lambda x: x**2, a)

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


13

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

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

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

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

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

ধরে নেওয়া যায় যে log_timestampকলগুলি এই জাতীয়ভাবে পরিচালনা করতে পারে, এটি যখন এটির প্রয়োজন হবে তখন এটি মূল্যায়ন করবে এবং আপনি সেই সময়ের টাইমস্ট্যাম্পটি পাবেন।

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

আপডেট : এখানে আরও কিছুটা কংক্রিটের বাস্তব বিশ্বের উদাহরণ।

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


11

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

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

মূলত এটি কয়েকটি পয়েন্টে ফোটে:

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

এগুলিকে চারপাশে জড়ো করে নামকরণে রূপান্তরিত করার যথেষ্ট কারণ। তবে, আমি বেনামে বন্ধের বিরুদ্ধে অন্য দুটি অভিযোগ রেখেছি।

প্রথম বিদ্বেষটি হ'ল এগুলি হ'ল ভাষাটি বিশৃঙ্খলা করার জন্য কেবল একটি অপ্রয়োজনীয় কীওয়ার্ড।

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

  • একটি অন্তর্নিহিত রিটার্ন রয়েছে, অর্থাত্ তারা তাদের ফাংশন করা উচিত বলে মনে হয়।

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

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


1
"... পাইথনের ফাংশনগুলি ক্লোজার হয়"। এটি ঠিক মতো নয়, যেমনটি আমি এটি বুঝতে পারি। বন্ধগুলি হ'ল ফাংশন, তবে ফাংশনগুলি সর্বদা বন্ধ হয় না। ফাংশন-> ল্যাম্বদা x, y: x + y। বন্ধ-> ল্যাম্বদা এক্স: ল্যাম্বদা y: x + y
0atman

6
"যেহেতু ল্যাম্বডা ক্যালকুলাস টিউরিং-সম্পূর্ণ নয়" এটি স্পষ্টত ভুল, টাইপযুক্ত ল্যাম্বডা ক্যালকুলাস আইএস টিউরিং সম্পূর্ণ, কারণ এটি এত তাৎপর্যপূর্ণ। আপনি ওয়াই-কম্বিনেটর ব্যবহার করে পুনরাবৃত্তি পেতে পারেন,Y = lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))
অ্যান্টি হাপাল

তদ্ব্যতীত, কেউ যদি ট্যুরিং সম্পূর্ণতার উপর উইকিপিডিয়ায় পড়েন, তবে এটি বলে যে "একটি সর্বোত্তম উদাহরণ ল্যাম্বদা ক্যালকুলাস।"
অ্যান্টি হাপাল

গুরুতর - টিউরিং সম্পূর্ণ নয় - এই উত্তরের একটি গুরুতর সম্পাদনা বা প্রত্যাহার প্রয়োজন।
টনি সাফলক 66

@ মার্সিনোও আপ-ভোট দিয়েছেন কারণ এটি কেআইএসএসের সাথে অনুগত। তুলনা হিসাবে, কেএন্ডআর বই উল্লেখ করেছে যে অংশ হিসাবে অ্যাসাইনমেন্ট ব্যবহার করার সময় বা বৃহত্তর এক্সপ্রেশনটি আরও কমপ্যাক্ট, এটি প্রায়শই কম পাঠযোগ্য। ক্রিয়ামূলক প্রোগ্রামিং নিদর্শনগুলি ব্যবহার করার ট্রেন্ড-ওয়াগন হ'ল ট্রাইট এবং ক্লিচ। এগুলি কীভাবে ব্যবহার করা যেতে পারে তা উল্লেখ করার পক্ষে এটি পর্যাপ্ত, তবে তারা উপযুক্ত বিকাশকারী হয়ে উঠতে পেরে সবচেয়ে গুরুত্বপূর্ণ বলে উল্লেখ করা অত্যধিক alousর্ষাজনক; সম্পূর্ণ বিষয়গত। এই যুক্তিটি সি ++ বিকাশকারীদের সাথে সমতুল্য যারা তর্ক করেন যে ভাষা ডাব্লু / ও শ্রেণিগুলি আদিম, নিকৃষ্ট এবং অপর্যাপ্ত। "টুরিং-সম্পূর্ণতা", যুক্তিগুলি পেডেন্টিক।
17'17 এ টাইপডেফ

11

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

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

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])

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

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

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

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

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

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


ধন্যবাদ। আমি আপনার শেষ উদাহরণটি পুরোপুরি বুঝতে পারি নি। এক্স এবং y উভয় সংজ্ঞায়িত হয় mainএবং কিভাবে do_something_cool? ফাংশনটিতে xএবং কী ঘটে y? উত্তীর্ণ মানগুলি অবিলম্বে ওভাররাইট করা হবে বলে মনে হচ্ছে? ফাংশনটি কীভাবে জানতে পারে event? আপনি কিছু মন্তব্য / ব্যাখ্যা যোগ করতে পারেন? ধন্যবাদ
সঞ্জয় মনোহর

@ সঞ্জয়মনোহর আমি যাচ্ছি xএবং yযুক্তিগুলি do-something-coolএবং তার মানগুলি ফাংশনে সেট করা হচ্ছে যেখানে আপনি যে কোনও প্রত্যাশিত নয় এমন যুক্তিগুলি পাস করার জন্য ল্যাম্বডাস কীভাবে ব্যবহার করতে পারবেন তা বোঝানোর জন্য। widget.bindফাংশন প্রত্যাবর্তনের একটিevent প্যারামিটার যা কোনো নির্দিষ্ট উইজেট উপর গুই ইভেন্ট সনাক্ত করে। আমি আরও স্পষ্টতার জন্য টিন্টারের প্রোগ্রামিং মডেলে পড়ার পরামর্শ দিচ্ছি।
ওয়ারাগরওয়াল

হুম আমি মনে করি আমি টিনকিটার মডেলটি বুঝতে পারি। তবে এখনও বেশ বোঝেন না - আপনি পাস করেন x,yতবেই করুন x=event.x। আপনি যে মূল্যটি পেরিয়ে গেছেন সেটি কি ওভাররাইট করে না? এবং ফাংশনটি কীভাবে জানতে পারে event? আপনি কোথায় এটি ফাংশনে পাস করবেন তা আমি দেখতে পাচ্ছি না। নাকি এটা কোন পদ্ধতি? এছাড়াও আপনাকে কোনও ফাংশনের নামে বিয়োগ চিহ্নগুলি অনুমোদিত?
সঞ্জয় মনোহর

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

1
ঠিক আছে এখন আমি কী দেখতে চেয়েছি - আপনি ফাংশনটি পেতে চান event? সেক্ষেত্রে, আপনার ল্যাম্বদা পড়া উচিত নয় lambda event: do_something_cool(event,x,y)?
সঞ্জয় মনোহর

8

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

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


7

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

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


পাইথনের ল্যাম্বদা ভাঙা হয়নি। ল্যাম্বডাসে স্থানীয়দের পরিচালনা করার দুটি উপায় রয়েছে। উভয় সুবিধা এবং অসুবিধা আছে। আমি মনে করি পাইথন (এবং সি #) যে পদ্ধতির গ্রহণ করেছে তা সম্ভবত খাঁটি কার্যকরী ভাষাগুলির সাথে আরও বেশি অভ্যস্ত যারা এই ক্ষেত্রে নিখুঁত কার্যকরী ভাষার সাথে আমার মনে হয় না যে এই পদ্ধতির এমনকি অর্থবোধও ঘটে।
ব্রায়ান

এটা প্রকৃতপক্ষে বিপরীত। আমি পাইথন প্রোগ্রামার নই তবে ছোট্ট টাল্কে চেহারায় এটি একই রকম এবং আমি নিয়মিত এটিকে ঝাপটায়। তবুও আমি এটিকে "ভাঙ্গা" হিসাবে বিবেচনা করব :)
নরবার্ট হার্টেল 20'09

না, পাল্টা মামলাটির সাথে এর কোনও যোগসূত্র নেই। এটি কেবলমাত্র পরিবর্তনশীল নামের লেজিক স্কোপটি কোনও ক্রিয়াকলাপের; একটি লুপ একটি লেজিকাল স্কোপ প্রবর্তন করে না। কাজগুলি জাভাস্ক্রিপ্টেও একইভাবে কাজ করে। আপনার যদি ভেরার সুযোগের প্রয়োজন হয় তবে আপনি সর্বদা করতে পারেন (ল্যাম্বদা স্কোপডেভার: ল্যাম্বদা এক্স: স্কোপডেভার + এক্স) ()
অ্যান্টি হাপাল

6

আমি কেবল পাইথন শুরু করছি এবং প্রথমে ছুটে চলেছি ল্যাম্বডায় which যা বুঝতে আমার কিছুটা সময় লেগেছে।

মনে রাখবেন যে এটি কোনও কিছুর নিন্দা নয়। প্রত্যেকের কাছে আলাদা আলাদা জিনিস রয়েছে যা সহজে আসে না।

ল্যাম্বদা কি সেই 'আকর্ষণীয়' ভাষার আইটেমগুলির মধ্যে একটি যে বাস্তব জীবনে ভুলে যাওয়া উচিত?

না।

আমি নিশ্চিত যে এটির কয়েকটি প্রবণতা রয়েছে যেখানে এটির প্রয়োজন হতে পারে, তবে এটির অস্পষ্টতা দেখে,

এটা অস্পষ্ট নয়। বিগত 2 টি টিমে আমি কাজ করেছি, প্রত্যেকে এই বৈশিষ্ট্যটি সর্বদা ব্যবহার করে।

ভবিষ্যতের রিলিজগুলিতে এর সম্ভাবনাটি নতুনভাবে সংজ্ঞায়িত করা হচ্ছে (এর বিভিন্ন সংজ্ঞা অনুসারে আমার অনুমান)

আমি পাইথনে এটি পুনরায় সংজ্ঞায়নের জন্য গুরুতর কোনও প্রস্তাব দেখিনি, কয়েক বছর আগে বন্ধের শব্দার্থবিজ্ঞান স্থির করেও।

এবং কোডিং স্পষ্টতা হ্রাস - এড়ানো উচিত?

আপনি যদি এটি সঠিকভাবে ব্যবহার করেন তবে এটি কম পরিষ্কার নয়। বিপরীতে, আরও বেশি ভাষা নির্মানের বিষয়টি স্বচ্ছতা বাড়ে

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

লাম্বদা কি বাফার ওভারফ্লো এর মতো? কি দারুন. আমি ভাবতে পারি না আপনি কীভাবে ল্যাম্বদা ব্যবহার করছেন যদি আপনি মনে করেন এটি "রক্ষণাবেক্ষণের দুঃস্বপ্ন"।


5
আমাকে (এবং অন্যদের) তৈরি করার জন্য পুরো প্রশ্নটি আবার পড়ুন। মনে রাখবেন যে অন্যরা এটি না করেই উত্তরটি পরিচালনা করতে সক্ষম হয়েছিল।
পাওয়ে পোলেভিজ

6

কোডের সদৃশতা এড়াতে আমি ল্যাম্বডাস ব্যবহার করি। এটি ফাংশনটি সহজেই বোধগম্য উদাহরণ হিসাবে তৈরি করবে:

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

আমি এটি একটি টেম্প ল্যাম্বদা দিয়ে প্রতিস্থাপন করি

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)

5

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

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


5

ল্যাম্বডাস ব্যবহারের জন্য একটি দরকারী ক্ষেত্রে দীর্ঘ তালিকা বোধগম্যতার পাঠযোগ্যতার উন্নতি করা । এই উদাহরণে loop_dicস্বচ্ছতার জন্য সংক্ষিপ্ত তবে loop_dicখুব দীর্ঘ হওয়ার কথা কল্পনা করুন । যদি আপনি কেবল iসেই মানটির ল্যাম্বডা সংস্করণটির পরিবর্তে একটি সরল মান ব্যবহার করেন তবে আপনি একটি পাবেন 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'}]

5

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

print 'hi there'

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


2
ঠিক আছে, সম্ভবত আপনি করতে পারতেন def foo...এবং তার fooপরিবর্তে পাস করতে পারেন lambda। এটি কেবলমাত্র আরও কোড এবং আপনাকে একটি নাম নিয়ে আসতে হবে।
জন কুমবস

4

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

এখানে উদাহরণ রয়েছে:

নাল বস্তুর প্যাটার্ন প্রয়োগ করতে:

{
    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()

4

আমি ব্যবহার করি lambda কলব্যাকগুলি তৈরি করতে যা পরামিতিগুলিকে অন্তর্ভুক্ত করে। একই কার্যকারিতা সম্পাদন করার জন্য কোনও পদ্ধতি লেখার চেয়ে এক লাইনে ল্যাম্বডা লেখার বিষয়টি পরিষ্কার er

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

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

4

আমি একটি অজগর প্রাথমিক, সুতরাং ল্যাম্বদা সম্পর্কে একটি পরিষ্কার ধারণা পেতে আমি এটিকে 'ফর' লুপের সাথে তুলনা করেছি; দক্ষতার দিক থেকে। কোডটি এখানে রয়েছে (অজগর ২.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)

6
আপনি timeitমডিউলটিতে আগ্রহী হতে পারেন , যা সাধারণত time.time()মানগুলি বিয়োগের চেয়ে আরও সঠিক ফলাফল দেয় ।
কেভিন

2
হুম, আপনার প্রথম () এবং দ্বিতীয় () এর শুরুতে আপনার টাইমারটি পুনরায় চালু করার দরকার নেই?
qneill

2

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

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