পাইথন ল্যাম্বডা ফাংশন (Python Lambda Function)

ল্যাম্বডা ফাংশন কি?
পাইথনে নামহীন ফাংশন সংজ্ঞায়িত করা যায়। শুনে একটু খটকা লাগছে, তাই না? খটকা লাগলেও, পাইথন এই সুবিধা দেয়। ছোটখাটো ফাংশনালিটি পরিচালনার জন্য আলাদা করে জায়গা নিয়ে ফাংশন লিখার প্রয়োজন হয় না, একটি মাত্র লাইন বব্যবহার করে ল্যাম্বডা ফাংশন এর মাধ্যমে তা করে ফেলা যায়।
পাইথনে **def** কীওয়ার্ড ব্যবহার করে সাধারণ ফাংশন সংজ্ঞায়িত করা হলেও, ল্যাম্বডা ফাংশন **lambda** কীওয়ার্ড ব্যবহার করে সংজ্ঞায়িত করা হয়।
 
ল্যাম্বডা ফাংশন এর সিনট্যাক্স দেখে নেয়া যাকঃ
lambda arguments: expression

 

ল্যাম্বডা ফাংশনের যেকোনো সংখ্যক আর্গুমেন্ট থাকতে পারে কিন্তু শুধুমাত্র একটি এক্সপ্রেশন থাকে। এক্সপ্রেশন এর ভিত্তি করে অবজেক্ট রিটার্ন করে থাকে। যেখানেই ফাংশন অবজেক্টের প্রয়োজন হয় সেখানে ল্যাম্বডা ফাংশন ব্যবহার করা যেতে পারে।
ল্যাম্বডা ফাংশন এর একটি উদাহারন দেখে ফেলি-
do_sum = lambda a, b: a+b
print(do_sum(100, 50))

#Output:
#150
এইখানে দেখতে পাচ্ছি a, b আর্গুমেন্টস দুটি নিয়ে তার যোগফল আমরা পেয়ে যাচ্ছি একটি লাইনের মাধ্যমে।
 
ল্যাম্বডা ফাংশন এর কিছু ব্যবহারঃ
 
যখন অল্প সময়ের জন্য একটি নামহীন ফাংশন প্রয়োজন হয় তখন আমরা ল্যাম্বডা ফাংশন ব্যবহার করি।
ল্যাম্বডা ফাংশন দিয়ে আমরা একটি মাত্র এক্সপ্রেশন লিখতে পারি। যদি একাধিক এক্সপ্রেশন ব্যবহার এর প্রয়োজন পড়ে তাহলে, আমরা একটি ট্রিক ব্যবহার করতে পারি, তা হল রিকারসিভ ল্যাম্বডা ফাংশন ব্যবহার করা। মানে একটি ল্যাম্বডা ফাংশন এর রেজাল্ট কে অন্য একটি ল্যাম্বডা ফাংশন এর মধ্যে পাস করা।
একটি এক্সপ্রেশন যুক্ত ল্যাম্বডা ফাংশনঃ
maximum_between_two = lambda a, b : a if(a > b) else b
print(maximum_between_two(50, 70))

#Output:
#70

 

 
রিকারসিভ ল্যাম্বডা ফাংশনঃ
maximum_between_two = lambda a, b : a if(a > b) else b
even_or_odd = lambda x : "even" if x%2==0 else "odd"

maximum_number = maximum_between_two(55, 70)
even_or_odd = even_or_odd(maximum_number)
print(even_or_odd)

#Output:
#even

 

ল্যাম্বডা ফাংশনকে লিস্ট কম্প্রিহ্যানশন এর সাথে ব্যবহার করা যায়। একটি উদাহারন দেখা যাক-
 
lst = [1, 4, 7]
square_lst = [lambda x=x: x**2 for x in lst]
for r in square_lst:
    print(r())


#Output:
#1
#16
#49
পাইথনে, আমরা সাধারণত ল্যাম্বডা ফাংশনকে একটি হায়ার অর্ডার ফাংশনের আর্গুমেন্ট হিসাবে ব্যবহার করি (একটি ফাংশন যা অন্যান্য ফাংশনকে আর্গুমেন্ট হিসাবে নেয়)। “`filter()“`, “`map()“`, “`reduce()“` ইত্যাদির মতো বিল্ট-ইন ফাংশনের সাথে ল্যাম্বডা ফাংশন ব্যবহার করা হয়।
 
filter() ফাংশন এ ল্যাম্বডা ফাংশনঃ
Python-এর filter() ফাংশনটি, একটি ফাংশন এবং একটি তালিকাকে আর্গুমেন্ট হিসেবে নেয় এবং আর্গুমেন্ট হিসেবে পাস করা ফাংশন টি লিস্ট কে কোন শর্ত দিয়ে ফিল্টার করে নতুন লিস্ট ফেরত দেয়।
 
initial_list = [1,2,3,4,5]
new_list = list(filter(lambda x: (x%2 == 0) , initial_list))
print(new_list)


#Output:
#[2, 4]

 

 map() ফাংশন এ ল্যাম্বডা ফাংশনঃ
 
পাইথনে map() ফাংশন একটি ফাংশন এবং একটি লিস্টকে একটি আর্গুমেন্ট হিসাবে গ্রহণ করে এবং আর্গুমেন্ট হিসেবে পাস করা ফাংশন টি লিস্ট কে ম্যানিপুলেট করে নতুন লিস্ট রিটার্ন করে।
 
initial_list = [1,2,3,4,5] 
new_list = list(map(lambda x: x**2 , initial_list)) 
print(new_list) 

#Output: 
#[1, 4, 9, 16, 25]
 
 
reduce() ফাংশন এ ল্যাম্বডা ফাংশনঃ
 
Python এ  reduce()  ফাংশন একটি ফাংশন এবং একটি লিস্টকে আর্গুমেন্ট হিসাবে গ্রহণ করে। ফাংশনটি একটি ল্যাম্বডা ফাংশন এবং একটি ইটারেবল দিয়ে কল করা হয় এবং একটি নতুন হ্রাসকৃত ফলাফল রিটার্ন করে। এটি ইটারেবল জোড়াগুলির উপর একটি পুনরাবৃত্তিমূলক অপারেশন করে।
 
from functools import reduce
initial_list = [1, 2, 3, 4, 5]
sum = reduce((lambda x, y: x + y), initial_list)
print (sum)


#Output:
#15

 

 

উদাহরন
find = lambda a_list , item : True if item in a_list else False

my_list = [1,2,3,4,5]

if find(my_list,5):
    print("Found")
else:
    print("Not Found")

 

def myfunc(n):
  return lambda a : a * n

mydoubler = myfunc(2)
mytripler = myfunc(3)

print(mydoubler(11))
print(mytripler(11))

 

>>> import dis
>>> add = lambda x, y: x + y
>>> type(add)
<class 'function'>
>>> dis.dis(add)
  1           0 LOAD_FAST                0 (x)
              2 LOAD_FAST                1 (y)
              4 BINARY_ADD
              6 RETURN_VALUE
>>> add
<function <lambda> at 0x7f30c6ce9ea0>

 

>>> import dis
>>> def add(x, y): return x + y
>>> type(add)
<class 'function'>
>>> dis.dis(add)
  1           0 LOAD_FAST                0 (x)
              2 LOAD_FAST                1 (y)
              4 BINARY_ADD
              6 RETURN_VALUE
>>> add
<function add at 0x7f30c6ce9f28>

 

>>> (lambda x, y, z: x + y + z)(1, 2, 3)
6
>>> (lambda x, y, z=3: x + y + z)(1, 2)
6
>>> (lambda x, y, z=3: x + y + z)(1, y=2)
6
>>> (lambda *args: sum(args))(1,2,3)
6
>>> (lambda **kwargs: sum(kwargs.values()))(one=1, two=2, three=3)
6
>>> (lambda x, *, y=0, z=0: x + y + z)(1, y=2, z=3)
6

 

এসো নিজে করি
১। একটি ল্যাম্বডা ফাংশন লিখুন যাতে price এবং vat(in percentage) দুটি আর্গুমেন্ট পাস করানো যাবে
    এবং তা price এবং vat থেকে total_price ক্যালকুলেট করে দিবে ।
২। ল্যাম্বডা ব্যবহার করে সংখ্যাগতভাবে স্ট্রিং (সংখ্যা) এর একটি তালিকা সাজানোর জন্য একটি পাইথন প্রোগ্রাম লিখুন
৩। ল্যাম্বডা ব্যবহার করে একটি লিস্টের ভ্যালু গুলো রিভারর্স করার পাইথন প্রোগ্রাম লিখুন।
    [1,2,4,5,2,5,-2]
৪। ল্যাম্বডা ব্যবহার করে একটি মিশ্র তালিকায় ফ্লোট নম্বর গণনা করার জন্য একটি পাইথন প্রোগ্রাম লিখুন।
    [1,2.5,4.3,5.1,2,5,-2,0.01]
৫। একটি পাইথন প্রোগ্রাম লিখুন যা ল্যাম্বডা ফাংশন ব্যবহার করে প্রদত্ত তালিকার প্রতিটি সংখ্যাকে
    একটি প্রদত্ত সংখ্যার সাথে গুণ করে। ফলাফল প্রিন্ট করবে।
    [1,2,4], multiply_by = ৫
ইন্টারভিউ প্রশ্নোত্তর
# গুরুত্বপূর্ন প্রশ্নসমুহ
১। ল্যাম্বডা ফাংশন কি ? কখন এবং কেন ল্যাম্বডা ফাংশন ব্যবহার করা হয়? এটি ব্যবহার এর কোন সুবিধা/অসুবিধা রয়েছে কি?
২। ল্যাম্বডা ফাংশন ব্যবহার করে ১০০ অবধি ফিবুন্যাচ্চি সিরিজ জেনারেট করুন?
৩। মাল্টিপল লাইন এর রেগুলার ফাংশন কে ল্যাম্বডা ফাংশন এ প্রকাশ করা যাবে?
৪। ল্যাম্বডা ব্যবহার করে Tupple এর একটি List, sort  করার  একটি পাইথন প্রোগ্রাম লিখুন।
৫। ল্যাম্বডা ফাংশন ব্যবহার করে একটি লিস্ট থেকে None মান মুছে ফেলার জন্য একটি পাইথন প্রোগ্রাম লিখুন।