کلمه کليدی «args*» در پايتون نشان میدهد هیچ محدودیتی در تعداد آرگومانهای ارسال شده به تابع وجود ندارد. البته اين آرگومانها نبايد به شکل کلید-مقدار باشند. در حالی که «kwargs**» به معنای آن است که تابع میتواند آرگومانهایی با ساختار کلید-مقدار بگیرد. از اين نوع آرگومان فقط در توابعی استفاده میشود که با ساختمان داده ديکشنری کار میکنند. در برنامه نویسی اگر بخواهیم از کدهای خود بارها و به صورت تکراری استفاده کنیم، باید آنها را به شکل تابع بنویسیم. توابع همیشه وظیفه ثابتی را تکرار میکنند. در زمان تعریف تابع، میتوانیم آرگومانهای مختلفی به عنوان ورودی مشخص کنیم. اما اگر بخواهیم، تابعی تعداد نامحدودی آرگومان دریافت کند، باید از ساختارهای args* و kwargs** در پایتون استفاده کنیم.

در این مطلب از مجله فرادرس، ساختارهای args* و kwargs** را بررسی کردیم. از این آرگومانهای پایتون، در زمان تعریف توابع استفاده میشود. به عنوان توسعهدهنده پایتون لازم است که با این ساختارهای ساده ولی بسیار کاربردی آشنا شده و توانایی استفاده از آنها را داشته باشیم.
args* در پايتون
فرض کنيم مسئلهای داده شده است. این مسئله از ما میخواهد ماشینحساب بسازیم. در مسئله، گفته شده که ماشينحساب مورد نظر، فقط عمليات ضرب انجام میدهد. در ادامه مطلب، تابع ضرب ماشینحساب را پیادهسازی کردهایم. اما به منظور کسب مهارت مورد نیاز برای نوشتن چنین برنامهای لازم است دانش مقدماتی درباره زبان پایتون داشته باشیم. در صورت نیاز پیشنهاد میکنیم که فیلم آموزش برنامه نویسی پایتون، دوره مقدماتی همراه با اعطای گواهینامه را از فرادرس مشاهده کنید. به منظور کمک به مخاطبان مجله، لینک این فیلم را در پایین نیز قرار دادهایم.
برای پیادهسازی عملیات ضرب، میتوانيم از از تابع سادهای استفاده کنیم. در کادر زير، کدهای مربوط به تابع ضرب دو عدد را مشاهده میکنید.
بعد از اجرای کد بالا خروجی به شکل product:6 نمايش داده میشود.
الان باید ماشين حساب خود را طوری تغيير دهيم که ۳ عدد در ورودی دريافت کند. سپس حاصل ضرب آنها را به بيرون برگرداند. بنابراين تابع جديدی – مانند کد زير – مینويسيم.
بعد از اجرای کد بالا خروجی به شکل زير نمايش داده میشود.
product:6
همين الان هم میتوانیم مشکل را تشخیص دهیم. اگر بخواهیم برنامه تعداد بیشتری عدد را در یکدیگر ضرب کند، در نهایت مجبور میشویم توابع زیادی بنویسیم. در چنين مواقعی با استفاده از args* مشکل را حل میکنیم.

برای حل کردن این مسئله میتوانيم با کمک آرگومان args* تکهکد ساده و انعطافپذيری بنويسيم.
بعد از اجرای کد بالا خروجی زير نمايش داده میشود.
product:4096
مشکل مسئله بالا حل شد. اما لازم است اتفاقی که افتاده را به خوبی متوجه شويم. args* يکی از مفاهیم تخصصی در پايتون است. اين مفهوم به برنامه نويسان کمک میکند، تعداد نامحدودی آرگومان به تابع ارسال کنند. البته اين آرگومانها نبايد کلمه کليدی باشند. با کلمه args* فقط میتوانيم متغيرهای معمولی ارسال کنيم.
در این بخش باید به دو نکته مهم اشاره کنیم.
- نکته اول: منظور از کلمه کليدی آن است که آرگومانها نمیتوانند ديکشنری باشند. زيرا ساختار ديکشنریهای پایتون به شکل «جفت کليد-مقدار» (Key-Value Pair) است. آرگومانهای args* فقط میتوانند عدد يا رشته باشند.
- نکته دوم: کلمه «args» فقط نقش شناسه را بازی میکند. میتوان آن را با هرچيز مربوطی جايگزين کرد. مسئله مهم، وجود داشتن نماد ستاره قبل از نام آرگومان است.
وقتی در تعریف تابع از نماد ستاره «*» قبل از نام متغيری استفاده کنيم، پايتون متوجه میشود که اينجا تعداد آرگومانها مشخص و محدود نيست. بنابراین خود پايتون، تاپلی از اين آرگومانها ايجاد میکند. نام تاپل را هم دقيقا همان کلمهای میگذارد که بعد از نماد ستاره نوشتهايم. سپس در داخل تابع، دسترسی کاملی از اين تاپل به برنامهنويس میدهد. به نماد ستاره، «عملگر بازکردن بستهبندی» (Unpacking Operator) گفته میشود. در بخشهای بعدی همين مطلب، درباره آن بيشتر، صحبت کردهايم.
در نهایت تاپل ساخته شده از دادههای ورودی، در دسترس برنامه نویسان قرار میگیرد. البته فقط در داخل بلوک تابعی که args* را به عنوان پارامتر دریافت کرده است. از اين متغير میتوانیم در اجرای هر نوع عملياتی استفاده کنیم. در مسئله بالا، بر روی تاپل پيمايش کرده و نتيجه ضرب همه اعضای درون آن را محاسبه میکنيم.
یادگیری پایتون با فرادرس
زبان پایتون به دلیل انعطافپذیری بالا، قدرت و کتابخانههای متنوع، تقریبا یکی از پر تقاضاترین زبانهای برنامه نویسی است. افراد زیادی برای رسیدن به موقعیتهای شغلی مورد علاقهشان، زمان و انرژی خود را برای آموزش پایتون صرف میکنند. اما باید توجه کنید آموزش پایتون بهراحتی و با سرعت زیادی شروع میشود. ولی در مراحل پیشرفته به انرژی بیشتری نیاز دارد. به همین دلیل داشتن استاد یا دسترسی به منابع با کیفیت، برای آموزش نکات سطح بالا در برنامه نویسی پایتون ضروری است. مخصوصا اینکه پایتون، کاربری متنوعی دارد و هر حوزهای هم مهارتهای خاص خود را میطلبد.

فرادرس به عنوان مرجع تولید محتوای آموزشی آنلاین، تمرکز خاصی بر روی تولید محتواهای مربوط به آموزش پایتون داشته است. به همین دلیل مطالب و فیلمهای آموزشی با کیفیتی تولید کرده است. فرادرس تلاش کرده است تا مطالب پیشرفته پایتون را با زبانی رسا و قابل درک به مخاطبانش آموزش دهد. تهیه فیلمهای آموزشی فرادرس یکی از مقرونبهصرفهترین روشهای آموزش زبان پایتون است. در پایین، چند مورد از فیلمهای آموزشی مربوط به پایتون را معرفی کردهایم.
kwargs** در پايتون
همينطور که اشاره شد از args* برای ارسال تعداد نامحدودی پارامتر به توابع، استفاده میکنيم. اين پارامترها نبايد کلمه کليدی باشند. منظور از کلمه کليدی ساختارهایی هستند که دادهها را به شکل جفتهای کليد-مقدار نگهداری میکنند. برای نمونه میتوانيم به ديکشنریهای پايتون اشاره کنيم.
«kwargs**» به برنامه نويسان کمک میکند تعداد نامحدودی آرگومان از جنس کلمه کليدی به تابع ارسال کنند. در زبان برنامه نويسی پايتون، اين کلمههای کليدی به شکل ديکشنری مرتب شده و استفاده میشوند.
پايتون، تمام کلماتی را که قبل از آنها نماد دو ستاره «**» قرار گرفته است، به عنوان آرگومان کلمه کليدی میشناسد.
بعد از اجرای کد بالا خروجی زير نمايش داده میشود.
Sentence: Kwargs are awesome!
در تابع makeSentence درحال پيمايش بر روی ديکشنری هستيم. بنابراين برای استفاده از مقادير ذخيره شده در اين ساختار بايد از تابع values() استفاده کنیم. در غير اين صورت فقط کليدها به بيرون برگشت داده میشود و نه مقادير.
در کادر زير، مثال ديگری درباره روش استفاده از **kwargs را بررسی کردهايم.
بعد از اجرای کد بالا خروجی زير نمايش داده میشود.
[‘Google uses Angular’, ‘Facebook uses react’, ‘Microsoft uses .NET’]
در کدهای بالا از متد .items() استفاده کرديم. زيرا میخواهيم هم کليدها و هم مقادير را بدست بياوريم.
استفاده ازargs* و kwargs** در پايتون برای فراخوانی تابع
تا اينجای کار، متوجه معنی و کارکرد کلمات «args*» و «kwargs**» شدهايم. در اين بخش از مطلب، تابعی طراحی کردهايم که از هر دوی اين کلمات استفاده کند. در زمان طراحی اين تابع، ترتيب قرار گرفتن اين آرگومانها مهم است. در تعريف تابع، هميشه args* بايد قبل از kwargs** قرار بگيرد.
بنابراين اگر در حال استفاده از آرگومانهای استاندارد در کنار args* و kwargs**هستيم بايد ترتيب زير را رعايت کنيم.
- آرگومانهای استاندارد
- args*
- kwargs**

در کادر زير مثال سادهای درباره تابعی نوشتهايم که از آرگومانهای استاندارد، args* و kwargs** استفاده میکند.
بعد از اجرای کد بالا خروجی زير نمايش داده میشود.
I am 007 I am arg: agent I am kwarg: (‘firstName’, ‘James’) I am kwarg: (‘lastname’ , ‘Bond’)
استفاده از args* و kwargs** در پايتون برای مقداردهی به اشياء
پايتون در حوزه برنامه نويسی شيءگرايانه رويکرد بسيار منعطفی برای مقداردهی اوليه به اشياء دارد. عامل اصلی وجود چنین انعطافپذیری، استفاده از args* و kwargs** در تعریف کلاسهاست. اين دو ساختار به توسعهدهندگان برای ساخت توابع و کلاسهایی کمک میکنند که میتوانند تعداد نامحدودی آرگومان معمولی و کليد-مقداری بپذيرند.

کلاس سادهای را در نظر بگيريد که یک شکل هندسی، مانند مستطیل را نشان میدهد.
- در اين کلاس با استفاده از args* میتوانيم در تعداد آگورمانهای مربوط به ساخت شیء انعطافپذيری داشته باشيم.
- برای مديريت ساير صفات مستطيل هم مانند رنگ و برچسب میتوانيم از kwargs** استفاده کنيم.
بعد از اجرای کد بالا خروجی زير نمايش داده میشود.
blue None
فیلم های پروژه محور آموزش پایتون در فرادرس
فرادرس یکی از بزرگترین و حرفهایترین تولیدکنندگان فیلمهای آموزشی به زبان فارسی است. زبان برنامه نویسی پایتون هم یکی از پرطرفدارترین تکنولوژیهای حوزه تولید و توسعه نرمافزار است. البته این زبان، کاربردهای دیگری نیز در زمینههایی مثل هوش مصنوعی، امنیت سایبری و غیره دارد. به همین دلیل، افراد زیادی خواهان استفاده از دورههای آموزش زبان پایتون در فرادرس هستند. یکی از روشهای مؤثر برای یادگیری برنامهنویسی، آموزش همراه با اجرای پروژههای واقعی است. فرادرس فیلمهای پروژهمحور زیادی در زمینه پایتون طراحی و منتشر کرده است.
در پایین، چند مورد از فیلمهای آموزشی پروژهمحور زبان پایتون را معرفی کردهایم.
در صورت تمایل با کلیک بر روی تصویر زیر به صفحه اصلی این مجموعه آموزشی، هدایت شده و از فیلمهای پروژهمحور بیشتری دیدن کنید.

Packing و Unpacking با استفاده از args* و kwargs** در پايتون
نمادهای ستاره يگانه و دوگانهای که استفاده میکنيم به نام عملگرهای «Unpacking» شناخته میشوند. از عملگرهای Unpacking به منظور دسترسی به مقادير درون ساختارهای پيمايشپذير، استفاده میشود. به عنوان مثالهایی از اين ساختارها میتوان به ليست، تاپل و ديکشنری اشاره کرد.
- نماد تکستاره «*»: این نماد در پایتون برای دسترسی به مقادیر درون نوع دادههای پیمایشپذیر – بهجز دیکشنری – به کار برده میشود.
- نماد دو ستاره «**»: این نماد فقط برای پيمايش بر روی ديکشنریها به کار برده میشود.
در پايين با کمک دو مثال ساده اين موضوع را بررسی کردهايم.
مثال اول استفاده از args*
در کدهای زير، يک ستاره قبل از carCompany قرار داده شده است. اين ستاره تمام مقادير درون ساختمان داده مورد نظر را – در این جا لیست است – در دسترس تابع قرار داده است. به عبارت ديگر تمام مقادير به عنوان رشتههای مجزا از هم در خروجی چاپ میشوند. نه به عنوان اعضای يک ليست يا به شکل يک ليست کامل.
در کدهای بالا نام carCompany را هم با ستاره و هم بدون ستاره – به عنوان پیشوند – به تابع print() ارسال کردهایم. بعد از اجرای کد بالا خروجی به شکل زیر نمايش داده میشود.
Audi BMW Lamborghini ['Audi', 'BMW', 'Lamborghini']
مثال دوم استفاده از kwargs**
در کدهای زير از علامت دو ستاره، برای دسترسی به مقادير درون متغير mergedStack استفاده کردهايم. بنابراين میتوانيم با تمام کليد-مقدارهای درون ديکشنری در تابع کار کنيم.
بعد از اجرای کد بالا خروجی زير نمايش داده میشود.
{'React': 'Facebook', 'Angular': 'Google', 'dotNET': 'Microsoft'}
args* و kwargs** در پايتون عمل يکسانی را انجام میدهند. هر دو برای دستيابی به مقاديری استفاده میشوند که به عنوان آرگومان به تابع ارسال شدهاند. اما نوع مقادير ورودی و خروجی در اين دو ساختار متفاوت است.
جمعبندی
در اين مطلب از مجله فرادرس با کلمات کليدی args* و kwargs** در پايتون آشنا شدهايم. در فهرست زیر، نکات مهمی را درباره این کلمات نوشتهایم.
- کلمات کليدی args* و kwargs** در پايتون برای ارسال نامحدود متغير به تابع به کار برده میشوند.
- هر وقت که از اين کلمات در کنار هم استفاده میکنيم، هميشه args* بايد قبل از kwargs** قرار بگيرد.
- کلمات args و kwargs فقط به صورت قراردادی تعيين شدهاند. میتوانيم از هر نام ديگری به انتخاب خود استفاده کنيم.
args* و kwargs** دو ساختار مهم و ساده در پايتون هستند. اين ساختارها قدرت توابع را در زمان دريافت آرگومان ورودی افزايش میدهند. در نتيجه میتوان گفت، با استفاده از args* و kwargs** توانايی و انعطافپذيری کدها بيشتر میشوند. به عنوان توسعهدهنده پايتون برای نوشتن کدهای حرفهایتر و توابع قدرتمندتر بايد بتوانيم بر روی تعداد آرگومانهای مورد نياز خود کنترل کامل داشته باشيم. اين ساختارها هم دقيقا همانچيزی هستند که برنامهنويسان حرفهای پايتون استفاده میکنند.
source