যদি আপনি পাইথনে একটু প্রোগ্রামিং করে থাকেন, তবে আপনি পাইথন ফাংশনে "**args" এবং "**kwargs" শব্দগুলো দেখেছেন। কিন্তু সেগুলো আসলে কী?
* এবং ** অপারেটর ভিন্ন অপারেশন করে যা একে অপরের পূরক, সেটি নির্ভর করে আমরা সেগুলো কোথায় ব্যবহার করছি।
তাই যখন আমরা সেগুলো মেথড ডেফিনিশনে ব্যবহার করি, যেমন -
def __init__(self, *args, **kwargs):
pass
উপরের অপারেশনকে 'প্যাকিং' বলা হয় কারণ এটি সেই মেথড কলটি যে সব আর্গুমেন্ট পায় সেগুলোকে একটি টাপল bernama args-এ প্যাক করে দেয়। আমরা args ছাড়া অন্য নামও ব্যবহার করতে পারি, কিন্তু args সবচেয়ে কমন এবং পাইথনিক উপায়। একক ভেরিয়েবলে কেন রাখব, তা বুঝতে নিচের উদাহরণ দেখুন:
ধরি আমাদের একটি ফাংশন আছে যা তিনটি আর্গুমেন্ট নেয় এবং আমাদের কাছে সাইজ ৩-এর একটি লিস্ট আছে যেটিতে সেই ফাংশনের সব আর্গুমেন্ট রয়েছে। এখন যদি আমরা সরাসরি লিস্টটি ফাংশনে পাস করার চেষ্টা করি, তবে কলটি কাজ করবে না এবং এরর দেবে।
উদাহরণ ১
# function which takes three argument
def func(a, b, c):
print("{} {} {}".format(a, b, c))
# list of arguments
lst = ['python', 'java', 'csharp']
# passing the list
func(lst)
ফলাফল
TypeError: func() missing 2 required positional arguments: 'b' and 'c'
একবার আমাদের 'picked' ভেরিয়েবল পাওয়া গেলে, আপনি সেই কাজগুলো করতে পারবেন যা একটি নরমাল টাপল দিয়ে সম্ভব নয়। args[0], args[1] এবং args[2] আমাদের যথাক্রমে প্রথম, দ্বিতীয় এবং তৃতীয় আর্গুমেন্ট দেবে। আপনি args টাপলকে একটি লিস্টে কনভার্ট করলে আমরা মডিফাই, ডিলিট এবং আল্টার আইটেমের অপারেশন করতে পারি।
এই প্যাকড আর্গুমেন্টগুলো অন্য একটি মেথডে পাস করতে, আমাদের আনপ্যাকিং করতে হবে -
def __init__(self, *args, **kwargs):
# some code here
Car(VehicleClass, self).__init__(self, *args, **kwargs)
# some code below
আবার * অপারেটর, কিন্তু এইবার এটি একটি মেথড কলের কন্টেক্সটে। এখন এটি args অ্যারেকে এক্সপ্লোড করে এবং মেথডকে কল করে যেন প্রতিটি ভেরিয়েবল স্বতন্ত্র। নিচে বোঝার জন্য আরেকটি উদাহরণ:
উদাহরণ ২
def func1(x, y, z):
print(x)
print(y)
print(z)
def func2(*args):
# Convert args tuple to a list so we can do modification.
args = list(args)
args[0] = 'HTML'
args[1] = 'CSS'
args[2] = 'JavaScript'
func1(*args)
func2('Python', 'Java', 'CSharp')
ফলাফল
HTML CSS JavaScript
উপরের আউটপুট থেকে দেখা যাচ্ছে, আমরা func1-এ পাস করার আগে সব তিনটি আর্গুমেন্ট পরিবর্তন করতে পেরেছি।
সমানভাবে আমরা উদাহরণ ১-এ পাওয়া TypeError সমাধান করতে পারি।
উদাহরণ: ১_১
# function which takes three argument
def func(a, b, c):
print("{} {} {}".format(a, b, c))
# list of arguments
lst = ['python', 'java', 'csharp']
# passing the list
func(*lst)
ফলাফল
python java csharp
সুতরাং যদি আমরা না জানি একটি পাইথন ফাংশনে কতগুলো আর্গুমেন্ট পাস করতে হবে, তবে আমরা সব আর্গুমেন্টকে একটি টাপলে প্যাক করতে প্যাকিং ব্যবহার করতে পারি।
# Below function uses packing to sum unknown number of arguments
def Sum(*args):
sum = 0
for i in range(0, len(args)):
sum = sum + args[i]
return sum
# Driver code
print("Function with 2 arguments & Sum is: \n", Sum(9, 12))
print("Function with 5 arguments & Sum is: \n", Sum(2, 3, 4, 5, 6))
print("Function with 6 arguments & Sum is: \n", Sum(20, 30, 40, 12, 40, 54))
ফলাফল
Function with 2 arguments & Sum is: 21 Function with 5 arguments & Sum is: 20 Function with 6 arguments & Sum is: 196
নিচে প্যাকিং এবং আনপ্যাকিং দুটির ব্যবহার প্রদর্শনকারী আরেকটি প্রোগ্রাম:
# function with three arguments
def func1(x, y, z):
print("Argument One: ", x)
print("\nArgument Two: ", y)
print("\nArgument Three: ", z)
# Packing - All arguments passed to func2 are packed into tuple *args
def func2(*args):
# To do some modification, we need to convert args tuple to list
args = list(args)
# Modifying args[0] & args[1]
args[0] = 'Hello'
args[1] = 'TutorialsPoint'
# Unpacking args and calling func1()
func1(*args)
# Driver code
func2("I", "Love", "Coding")
ফলাফল
Argument One: Hello Argument Two: TutorialsPoint Argument Three: Coding
ডিকশনারির জন্য ** ব্যবহার
# Program to demonstrate unpacking of dictionary items using **
def func(x, y, z):
print("Dictionary first item: ", x)
print("\nDictionary second item: ", y)
print("\nDictionary third item: ", z)
d = {'x': 27, 'y': 54, 'z': 81}
func(**d)
ফলাফল
Dictionary first item: 27 Dictionary second item: 54 Dictionary third item: 81
অ্যাপ্লিকেশন
- সকেট প্রোগ্রামিং-এ ব্যবহার হয় যেখানে সার্ভারে অজানা (অনন্ত) সংখ্যক রিকোয়েস্ট পাঠাতে হয়।
- ডjango মতো ওয়েব ফ্রেমওয়ার্কে ভিউ ফাংশনে ভেরিয়েবল আর্গুমেন্ট পাঠাতে ব্যবহার হয়।
- র্যাপার ফাংশনে ব্যবহার হয় যেগুলো আমাদের ভেরিয়েবল আর্গুমেন্ট পাস করতে হয়।