ট্র্যাক
/
Python
Python
/
সিলেবাস
/
ফাংশন আর্গুমেন্ট
ফা

ফাংশন আর্গুমেন্ট মধ্যে Python

{one: "১টি অনুশীলনী", other: "%{count}টি অনুশীলনী"}

ফাংশন আর্গুমেন্ট সম্পর্কে

ফাংশন আর্গুমেন্টের মূল বিষয়গুলো জানতে ফাংশন কনসেপ্ট দেখুন।

প্যারামিটার নাম

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

পজিশনাল আর্গুমেন্ট

পজিশনাল আর্গুমেন্ট হলো এমন মান, যা যে প্যারামিটারগুলোর সাথে যুক্ত হয় সেই একই ক্রমে ফাংশনে পাঠানো হয়। চাইলে প্যারামিটার নাম ব্যবহার করেও পজিশনাল আর্গুমেন্ট পাঠানো যায়:

def concat(greeting, name):
    return f"{greeting}{name}"

# Passing data to the function by position.
print(concat("Hello, ", "Lilly"))
#->  Hello, Lilly

# Passing data to the function using the parameter name.
print(concat(name="Glenn", greeting="Hello, "))
#-> Hello, Glenn

প্রথমবার concat কল করার সময় আর্গুমেন্টগুলো পজিশন অনুযায়ী পাঠানো হয়। দ্বিতীয়বার concat কল করার সময় আর্গুমেন্টগুলো নাম ধরে পাঠানো হয়, যার ফলে এদের ক্রম বদলানো যায়।

মনে রাখবেন, নাম ধরে পাঠানো আর্গুমেন্টের পরে পজিশনাল আর্গুমেন্ট বসানো যায় না (যাদের কিওয়ার্ড আর্গুমেন্ট-ও বলা হয়। ভ্যার-পজিশনাল প্যারামিটার বা **kwargs-এর সাথে এদের গুলিয়ে ফেলা যাবে না)।

এই আর্গুমেন্টগুলো:

print(concat(greeting="Hello, ", "Gregor"))

এই এররটি দেয়:

SyntaxError: positional argument follows keyword argument

প্যারামিটার তালিকায় / অপারেটর ব্যবহার করে ফাংশন কলে শুধু-পজিশনাল আর্গুমেন্ট বাধ্যতামূলক করা যায়:

# Parameters showing a position-only operator. 
def concat(greeting, name, /):
    return f"{greeting}{name}"

print(concat("Hello, ", "Ginnie"))
#-> Hello, Ginnie

# Call to the function using keyword arguments.
print(concat(name="Franklin", greeting="Hello, "))
Traceback (most recent call last):
    print(concat(name="Franklin", greeting="Hello, "))
TypeError: concat() got some positional-only arguments passed as keyword arguments: 'greeting, name'

কিওয়ার্ড আর্গুমেন্ট

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

def concat(greeting, name):
    return f"{greeting}{name}"

# Function call using parameter names as argument keywords.
print(concat(name="Eliza", greeting="Hello, "))
#-> Hello, Eliza

# Function call with positional data as arguments.
print(concat("Hello, ", "Tim"))
#-> Hello, Tim

প্যারামিটার তালিকায় * অপারেটর ব্যবহার করে ফাংশন কলে শুধু-কিওয়ার্ড আর্গুমেন্ট বাধ্যতামূলক করা যায়:

# Function definition requiring keyword-only arguments.
def concat(*, greeting, name):
    return f"{greeting}{name}"

# Keyword arguments can be in an arbitrary order.
print(concat(name="Kimmie", greeting="Hello, "))
#-> Hello, Kimmie

# Calling the function with positional data raises an error.
print(concat("Hello, ", "Coleen"))
Traceback (most recent call last):
    print(concat("Hello, ", "Coleen"))
TypeError: concat() takes 0 positional arguments but 2 were given

ডিফল্ট আর্গুমেন্ট মান

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

# Function with default argument values.
def concat(greeting, name="you", punctuation="!"):
    return f"{greeting}, {name}{punctuation}"

print(concat("Hello"))
#-> Hello, you!

# Overriding the default values
print(concat("Hello", name="Polly", punctuation="."))
#-> Hello, Polly.

পজিশনাল বা কিওয়ার্ড আর্গুমেন্ট

প্যারামিটার ডেফিনিশনে / বা * কোনোটিই ব্যবহার না করা হলে আর্গুমেন্ট পজিশনাল বা কিওয়ার্ড দুটোই হতে পারে। অথবা, পজিশনাল-বা-কিওয়ার্ড আর্গুমেন্টগুলো বাঁ দিকে শুধু-পজিশনাল প্যারামিটার আর ডান দিকে শুধু-কিওয়ার্ড প্যারামিটারের মাঝে রাখা যায়:

# Position-only argument followed by position-or-keyword, followed by keyword-only.
def concat(greeting, /, name, *, ending):
    return f"{greeting}{name}{ending}"

print(concat("Hello, ", "Mark", ending="!"))
#-> Hello, Mark!

print(concat("Hello, ", name="Rachel", ending="!"))
#-> Hello, Rachel!

print(concat(greeting="Hello, ", name="JoJo", ending="!"))
Traceback (most recent call last):
    print(concat(greeting="Hello, ", name="JoJo", ending="!"))
TypeError: concat() got some positional-only arguments passed as keyword arguments: 'greeting'

*args

কোডের উদাহরণে প্রায়ই নিচের মতো ফাংশন ডেফিনিশন দেখা যায়:

def my_function(*args, **kwargs):
    # code snipped

*args হলো দুই অংশের একটি নাম, যা অনির্দিষ্ট সংখ্যক আলাদা পজিশনাল আর্গুমেন্টের একটি tuple বোঝায়; একে variadic argument-ও বলা হয়। args হলো আর্গুমেন্টের tuple-টির নাম, তবে এটি my_args, arguments ইত্যাদি যেকোনো বৈধ Python নাম হতে পারে। * হলো সেই অপারেটর, যা আলাদা আর্গুমেন্টের দলটিকে একটি tuple বানায়।

Note

আপনি যদি কখনো কোনো টাপল আনপ্যাক করে থাকেন, তাহলে *args-এর * বিভ্রান্তিকর লাগতে পারে। প্যারামিটার ডেফিনিশনে * টাপল আনপ্যাক করার বদলে এক বা একাধিক পজিশনাল আর্গুমেন্টকে একটি টাপলে রূপান্তর করে।

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

যেহেতু একটি tuple-এর উপর ইটারেশন করা যায়, তাই args-কে এমন যেকোনো ফাংশনে পাঠানো যায় যা একটি ইটারেবল নেয়। *args সাধারণত **kwargs-এর পাশে দেখা গেলেও এমন হওয়া বাধ্যতামূলক নয়:

def add(*args):
    # args is passed to the sum function, which iterates over it.
    return sum(args)

print(add(1, 2, 3))
#-> 6

*args যদি এক বা একাধিক পজিশনাল আর্গুমেন্টের পরে আসে, তাহলে পজিশনাল আর্গুমেন্টগুলোর পরে যা বাকি থাকে সেটিই *args-এ থাকে:

def add(first, *args):
    # first will be 1, leaving the values 2 and 3 in *args
    return first + sum(args)

print(add(1, 2, 3))
#-> 6

*args-এর পরে যদি এক বা একাধিক ডিফল্ট আর্গুমেন্ট ডিফাইন করা হয়, তাহলে সেগুলো *args-এর মান থেকে আলাদা:


def add(first, *args, last=0):
    return first + sum(args) + last
 
print(add(1, 2, 3))
#-> 6

print(add(1, 2, 3, last=4))
#-> 10

# This uses the unpacking operator * to separate the list elements into positional arguments.
# It does not have the same behavior as the * (packing) in *args.
print(add(*[1, 2, 3]))
#-> 6

মনে রাখবেন, কোনো আর্গুমেন্ট যখন আগে থেকেই একটি iterable-এর ভেতরে থাকে (যেমন একটি tuple বা list), তখন অনির্দিষ্ট সংখ্যক আলাদা আর্গুমেন্ট নেয় এমন ফাংশনে পাঠানোর আগে সেটিকে আনপ্যাক করতে হয়। এটি করা হয় * ব্যবহার করে, যেটি আনপ্যাকিং অপারেটর।

এই প্রেক্ষাপটে * কন্টেইনারটিকে তার আলাদা এলিমেন্টে আনপ্যাক করে, যেগুলোকে পরে *args একটি tuple-এ রূপান্তর করে। যেখানে কেবল পজিশনাল আর্গুমেন্ট আছে, সেখানে আনপ্যাকিংয়ের ফলে যতগুলো ফর্মাল প্যারামিটার ডিফাইন করা আছে ঠিক ততগুলোই আর্গুমেন্ট হতে হবে।

add-এ পাঠানো লিস্টটি আনপ্যাক না করলে প্রোগ্রামটি এরর দেবে:

def add(first, *args, last=0):
    return first + sum(args) + last

print(add([1, 2, 3]))
Traceback (most recent call last):
    print(add([1, 2, 3]))
    return first + sum(args) + last
TypeError: can only concatenate list (not "int") to list

**kwargs

**kwargs হলো দুই অংশের একটি নাম, যা অনির্দিষ্ট সংখ্যক আলাদা কী (key)-ভ্যালু জোড়া আর্গুমেন্ট বোঝায়। kwargs হলো আর্গুমেন্টের দলটির নাম, এবং এটি my_args, arguments ইত্যাদি যেকোনো অন্য নাম হতে পারে। ** নামযুক্ত আর্গুমেন্টের দলটিকে {argument name: argument value} জোড়ার একটি dictionary-তে রূপান্তর করে।

যেহেতু একটি ডিকশনারির উপর ইটারেশন করা যায়, তাই kwargs-কে এমন যেকোনো ফাংশনে পাঠানো যায় যা একটি ইটারেবল নেয়। **kwargs সাধারণত *args-এর পাশে দেখা গেলেও এমন হওয়া বাধ্যতামূলক নয়:

def add(**kwargs):
    return sum(kwargs.values())

print(add(one=1, two=2, three=3))
#-> 6

মনে রাখবেন, kwargs ডিকশনারির values-এর উপর ইটারেশন করতে dict.values() মেথডটি কল করা হয়। কোনো ডিকশনারির উপর ইটারেশন করার সময় ডিফল্ট হিসেবে keys-এর উপরই ইটারেশন হয়, তাই dict.values() স্পষ্টভাবে উল্লেখ করতে হয়:

def concat(**kwargs):
    # Join concatenates the tuples from `kwargs.items()`
    return " ".join((str(item) for item in kwargs.items()))

print(concat(one=1, two=2, three=3))
#-> ('one', 1) ('two', 2) ('three', 3)
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে