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

  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

CPP তে map কে তার ভেলু অনুসারে কি ভাবে সর্ট করা যায় ।

আমরা জানি ম্যাপ ডিফল্ট ভাবে তার key অনুসারে অ্যাসেন্ডিং অর্ডারে সর্ট হয় । কিন্তু আমরা যদি key অনুসারে  সর্ট না করে value অনুসারে সর্ট করতে চাই তখন এই কাজটা কি ভাবে করা যায় আজকে আমরা সেটা দেখব ।    সাধারণ ভাবে ম্যাপ কে তার ভেলু অনুসারে সর্ট করা যায় না । ম্যাপ কে তার value অনুসারে সর্ট করার জন্য প্রথমে ম্যাপ  এর সবগুলো element [ key, value ] কে একটা vector এ কপি করে রাখতে হবে । এবং আমাদের কে সেই vector কে সর্ট করতে হবে । মনে করি আমাদের এই রকম একটা ম্যাপ আছে এবং তার মধ্যে এই ভেলুগুলো আছে । 1 2 3 4 5 map < string, int > mp; mp[ "ABC" ] = 10 ; mp[ "DEF" ] = 9 ; mp[ "GHI" ] = 5 ; ম্যাপের এই ডাটা গুলো কে আমরা একটা vector এ কপি করে রাখব । 1 2 3 4 5 6 vector < pair < string, int >> v; for ( auto it = mp.begin(); it != mp.end(); ++ it) { v.push_back( * it); // or we can use // v.push_back(make_pair(it->first, it->second));   } আমাদের ম্যাপের যেহেতু key, value দুইটা ভালু থাকে তাই এই দু...

সেগমেন্টেশন ফল্ট কোর ডাম্প [ Segmentation fault ] এরর !!

C/C++ তে কোড করার সময় মাঝে মাঝে একটা এরর দেখা যায় Segmentation fault core dump  । এই এরর আর অর্থ হল আপনার প্রোগ্রাম এমন একটা মেমরি লোকেশন অ্যাক্সেস করতে চাচ্ছে যে মেমরি লোকেশন অ্যাক্সেস করার পারমিশন  আপনার প্রোগ্রামকে দেয়া হয় নি ।  এই এরর টা কয়েকটা বিশেষ কারণে হতে পারে । আজকে আমরা তার মধ্যে একটা কারণ দেখব।   যদি কোনো রিকার্সিভ ফাংসনে Stack Overflows হয়  তখন এই এরর দেখাবে । আর কোন একটা রিকারসিভ ফাংসনে  তখনই Stack Overflows হয় যখন ফাংশনটি কোন Base case খুজে না পায় । Base case খুজে না পেলে ফাংশনটি ইনফিনিটি ভাবে চলতেই থাকবে এবং শেষে যখন Function Call Stack ফুল হয়ে যাবে তখনই Stack Overflow হবে ।  উদাহরণ হিসাবে আমারা নিচের ফাংশনটা দেখতে পারি ।  int factorial( int n) { if (n == 0 ) return 1 ; return n * factorial(n - 1 ); } এই প্রোগ্রামে যদি আমর n এর মান  >=  0 দেই তাহলে কোন সমস্যা হবে না । সব ঠিকঠাক ভাবে কাজ করবে । কিন্তু ঝামেলা হবে তখনই  যখন আমরা n এর মান  <  0 দিব । যেমন : আমরা ...