Skip to main content

[Python] *args vs **Kwargs

পাইথনে ফাংশন আর্গুমেন্ট *args ও **kwargs

আমরা মাঝে মাঝেই পাইথনের ফাংশনের প্যারামিটার হিসাবে *args, ** kwargs কে দেখতে পাই । তো এগুলো আসলে কি ? এবং এগুলো কিভাবে কাজ করে ? এই দুইটা বুঝতে হলে প্রথমে আমাদের আর্গুমেন্ট কি সেটা বুঝতে হবে ।

আর্গুমেন্ট

কোন ফাংশন কল করার সময় আমার ফাংশনে যে ভেলু pass করি করি সেটা কে বলা হয় আর্গুমেন্ট । পাইথনে দুই ধরনের আর্গুমেন্ট আছে,
  1. Keyword Argument.
  2. Positional Argument.

Keyword Argument

যে সকল আর্গুমেন্টের সাথে তার আইডেন্টিফায়ার থাকে সেসব আর্গুমেন্ট কে keyword argument বলে । উদাহরণ দিলে পরিষ্কার হয়ে যাবে। মনে করেন আমাদের এইরকম একটা ফাংশন আছে,

উপরে আমরা ৪ নং লাইনে ফাংশন কল করার সময় যে দুইটা আর্গুমেন্ট pass করলাম সেটাকে বলা হয় keyword argument. এখানে name = 'Arif' এ name এবং age = 24 এর age আর্গুমেন্ট দুইটির আইডেন্টিফায়ার । কারণ name, age দিয়ে আমরা আলাদা ভাবে দুইটা আর্গুমেন্টকে আইডেন্টিফাই করতে পারছি ।

Positional Argument

যে আর্গুমেন্ট গুলো keyword argument না সেগুলো কে positional argument বলে । এই ধরনের আর্গুমেন্টের কোন আইডেন্টিফায়ার থাকে না । উদাহরণ,

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

এখন আমরা *arags, **kwargs ব্যাখ্যা করব । প্রথমেই বলে রাখি আমার args, kwargs এর পরিবর্তে যেকোনো নাম ব্যবহার করতে পারি । এখানে শুধু * (astric char) টা গুরুত্বপূর্ণ । আপনি ইচ্ছা করলে *variable, **variables ব্যবহার করতে পারেন । *arags, **kwargs এটা হল নামকরনের রীতিনীতি । প্রোগ্রামিং এর ভাষায় যাকে বলে naming convension. *arags এবং **kwargs ফাংশনের ডেফিনেসনে ব্যবহার করা হয় ।

মনে করেন আপনার এমন একটা ফাংশন দরকার সেটা তে আপনি যেকোনো সংখ্যক আর্গুমেন্ট pass করতে পারেন অর্থাৎ A function that acceptes variable lenght argument । এই ধরনের ফাংশন লিখতে গেলে আপনাকে *arags, **kwargs ব্যবহার করতে হবে ।

*args এর ব্যবহার

আপনার ফাংশনের আর্গুমেন্ট গুলো যদি non keyword আর্গুমেন্ট অর্থাৎ positional argument হয় সেক্ষেত্রে আপনি *args ব্যবহার করবেন । নিচে একটা উদাহরণ দেখেন তাহলে বিষয়টা পরিষ্কার হয়ে যাবে ।

উপরে আমরা নর্মাল আরগুমেত বাদে ৩ টা আর্গুমেন্ট পাঠিয়েছি । আমরা *args দিয়ে N সংখ্যক আর্গুমেন্ট পাঠাতে পারব ।

**kwargs এর ব্যবহার

আমাদের আর্গুমেন্ট গুলো positional argument না হয়ে যদি keyword argument হয় তাহলে আমাদের কে **kwargs ব্যবহার করতে হবে । নিচে একটা উদারহরন দেখি,

অর্থাৎ আমারা বলতে পারি **kwargs দিয়ে আমরা আর্গুমেন্টের ডিকশনারি কে কোন ফাংশনে পাস করতে পারি । *args ও **kwargs আরও বিভিন্ন ভাবে ব্যবহার করা যায় নিচে তার কিছু উদাহরণ দেয়া হল,

এখন আমরা যদি একই ফাংশনে *args, **kwargs ব্যবহার করতে চাই তবে আমাদের কে একটা অর্ডার ফলো করতে হবে । যদি কোন নর্মাল আর্গুমেন্ট থাকে তবে সেটাকে প্রথমে রাখতে হবে, তারপর থাকবে *args এর পরে থাকবে **kwargs
def my_function(normal_arg, *args, **kwargs)

এই সম্পর্কে আপনি আরও জানতে চাইলে পাইথনে অফিশিয়াল ওয়েবসাইট দেখতে পারেন ।

More on define function 

Comments

Popular posts from this blog

Operator Overloading Vs priority_queue in C++

priority_queue ডিফল্ট ভাবে বড় ডাটা কে টপে নিয়ে আশে । আমরা যদি < অপারেটর ওভারলোড করি তবে আমাদের মাথায় রাখতে হবে যে STL priority_queue হল ম্যাক্স priority_queue যার অর্থ ম্যাক্স উপদান কে সবার প্রথমে নিয়ে আসবে । এটা কে min priority_queue এ নিয়ে আসতে হলে return a.age < b.age;  এই লাইন কে , return a.age > b.age; এই লাইন দিয়ে পরিবর্তন করতে হবে । কোড : Output : 10 9 8 7 6 5 4 3 2 1 এখন আমরা যদি আউটপুট কে 1 2 3 4 5 6 7 8 9 10 দেখাতে চাই তবে ১২ নং লাইন পরিবর্তন করে লিখতে হবে return a.age > b.age; ধন্যবাদ :)
  Good becomes great, bad becomes worse. A strong man who has known power all his life can lose respect for that power, but a weak man knows the value of strength and knows compression

পাইথনে Yield কিভাবে কাজ করে ?

Yield কি সেটা বোঝার জন্য Generator বোঝা লাগবে । আবার Generator কি সেটা বোঝার জন্য Iterables বুঝতে হবে । কি প্রথমেই মাথা ঘুরে গেল ? আচ্ছা মাথা ঘুরলে ঘুরতে দেন :D  আমরা শুরু করে দেই  । Iterables কি ? আমরা যখন কোন লিস্ট ক্রিয়েট করি । আমরা লিস্টের আইটেম গুলি একটা একটা করে রিড করতে পারি । এটাকেই বলা হচ্ছে iteration code: এখানে my_list হল iterable . যখন আমরা list comprehension ব্যবহার করে কোন লিস্ট ক্রিয়েট করি সেটাও একটা iterable । code : Python এ যেসব জিনিস iterable যেমন: টাপল, লিস্ট, ফাইল, স্ট্রিং, .... ইত্যাদি কে আমরা for .... in ...: দিয়ে রিড করতে পারবো । ডাটা খুব সহজেই রিড করার জন্য এইটা খুব কাজে দেয় । কিন্তু এর একটা সমস্যা আছে । সেটা হল । এইটা সব সময় লিস্টের আইটেম গুলিকে মেমরি তে ষ্টোর করে রাখে । এখন আমাদের সবসময় মেমরি তে লিস্ট আইটেম গুলি সেভ করে নাও রাখা লাগতে পারে । তো এইটা আমরা কি ভাবে সমাধান করবো ? Generators কি ? Generators গুলো হল  একধরনের iterators । কিন্তু আমরা কেবল একবারই generator এ iterate করতে পারি । এর কারণ হল generator সব ভেলু কে মেমরি তে ষ্টোর...