آشنایی با ماژول‌ها در زبان برنامه‌نویسی پایتون


به طور کلی، می‌توان گفت که منظور از ماژول بخشی از یک چیز است و در صورتی یک شیئ را ماژولار می‌نامند که از بخش‌های مختلف تشکیل شده باشد یا بتوان آن را به بخش‌های مختلف تقسیم‌بندی کرد. برای مثال، سازه‌هایی که با Lego ساخته می‌شوند یک نمونۀ آشکار از شیئی ماژولار هستند به طوری که می‌توان قطعات مختلفی از لِگوها با رنگ و شکل متفاوت را انتخاب کرده و با آن‌ها اشیاء مد نظر خود را ساخت.

در زبان برنامه‌نویسی پایتون نیز ماژول‌ها بخش‌های کوچکی از یک برنامۀ بزرگ‌تر هستند به طوری که هر Module (بخش) یک فایل جداگانه روی هارد کامپیوتر می‌باشد. در حقیقت، زبان ماژولارِ پایتون این قابلیت را در اختیار دولوپرها قرار می‌دهد تا با به‌کارگیری آن بتوانند یک برنامۀ بزرگ را به چندین ماژول یا فایل جداگانه تقسیم کنند یا یک ماژول کوچک را انتخاب کرده و با توسعۀ کدهای ماژول مربوطه، آن را به یک برنامۀ جامع برای هَندل کردن تَسک‌های مد نظر خود مبدل سازند.

به خاطر داشته باشید
Lego نام تجاری نوعی اسباب‌بازی است که توسط گروه لِگو در شهر Billund دانمارک تولید می‌شود. محصولات لگو شامل قطعات کوچک رنگارنگی هستند که عموماً پلاستیکی‌اند و می‌توان آن‌ها را به یکدیگر متصل کرده و اجسام گوناگونی ساخت.

حال سؤالی که پیش می‌آید این است که «توسعۀ یک اپلیکیشن به صورت ماژولار چه مزیتی دارد و چرا تمام کدهای آن را در یک فایل نمی‌نویسیم؟» که در پاسخ به این سؤال دلایل مختلفی را می‌توان نام برد که مهم‌ترین آن‌ها عبارتند از:

- ماژول‌بندی کدهای اپلیکیشن منجر بدین می‌شود تا فایل‌ها کوچک‌تر شوند به طوری که در صورت نیاز می‌توان به راحتی قطعه‌ کد مد نظر خود را داخل هر یک از فایل‌های مربوطه پیدا کرد (برای مثال، تعریف یک فانکشن در یک فایل کوچک کاری به مراتب آسان‌تر است تا جستجوی آن در یک فایل حاوی هزاران خط کد!)
- در صورت ایجاد یک ماژول به راحتی می‌توان آن را در برنامه‌های مختلف استفاده کرد (برای مثال، زمانی که به یک فانکشن پرکاربرد احتیاج داریم، با قرار دادن فانکشن مد نظر در یک ماژول جداگانه، امکان استفاده از آن در اپلیکیشن‌های دیگر را داشته و بدین ترتیب دیگر نیازی به بازنویسی فانکشن مذکور نخواهیم داشت.)
- همچنین ماژولار بودن یک اپلیکیشن قابلیتی را در اختیار دولوپرها قرار می‌دهد تا بتوانند برای انجام تسک مد نظر خود ترکیب‌های متفاوتی از ماژول‌ها را مورد استفاده قرار دهند و بدین ترتیب نیازی به گنجاندن تمامی ماژول‌های مربوطه در اپلیکیشن خود ندارند و بالتبع حجم سورس‌کد اپلیکیشن کاهش خواهد یافت.

با توجه به دلایل فوق‌الذکر، پیاده‌سازی اپلیکیشن‌ها به صورت ماژولار کاری منطقی به نظر می‌رسد به طوری می‌توان فانکشن‌های مشابه هم را در یک ماژول جداگانه پیاده‌سازی کرد یا تمامی فانکشن‌های مورد نیاز در برنامۀ مربوطه را درون یک ماژول قرار داد.

حال در ادامه قصد داریم ببینیم که چگونه می‌توان در زبان پایتون یک ماژول پیاده‌سازی کرد. در واقع، ماژول در زبان پایتون فایلی است که کدهای مد نظر خود را در آن پیاده‌سازی می‌کنیم که به عنوان مثال کدهای زیر را درون فایلی به نام MyModule.py ذخیره می‌کنیم:

# this is the file "MyModule.py"
# we're going to use it in another program
def celsiusToFahrenheit(celsius):
    fahrenheit = ((celsius * 9.0) / 5 ) + 32
    return fahrenheit

با ذخیرۀ کد فوق، ماژولی تحت عنوان MyModule ساختیم و درون آن تنها یک فانکشن به نام ()celsiusToFahrenheit پیاده‌سازی کرده‌ایم که وظیفۀ تبدیل دما از درجۀ سانتی‌گراد به فارنهایت را دارا است. در واقع، فانکشن مذکور را با یک پارامتر ورودی تحت عنوان celsius پیاده‌سازی کرده‌ایم که در آن گفته‌ایم مقدار منتسب به متغیر celsius را در عدد 9 ضرب کرده سپس حاصل‌ضرب را بر عدد 5 تقسیم کند و در ادامه حاصل را با عدد 32 جمع کرده و مقدار به دست آمده از عملیات را به متغیر fahrenheit منتسب کرده و آن را در خروجی ریترن کند.

اکنون اگر بخواهیم فانکشن تعریف‌شده در ماژول فوق را در یک برنامۀ دیگر فراخوانی کنیم، ابتدا نیاز است تا به مفسر پایتون اعلام کنیم که فانکشن مربوطه را از چه ماژولی فراخوانی می‌کنیم که برای این منظور از کیورد import استفاده کرده و ماژول مذکور را در برنامۀ خود اصطلاحاً ایمپورت (وارد) می‌کنیم (در واقع، دستور import این امکان را برای دولوپرها فراهم می‌آورد تا بدین طریق بتوانند از امکانات ماژول مد نظر در برنامه‌های دیگر استفاده کنند.) در ادامه فانکشن ()celsiusToFahrenheit را بر اساس آنچه که در آموزش آشنایی با نحوۀ تعریف و فراخوانی فانکشن‌هایی با پارامتر ورودی در پایتون آموختیم فراخوانی می‌کنیم که برای این منظور کد زیر را در نظر می‌گیریم:

import MyModule
celsius = float(input ("Enter a temperature in Celsius: "))
fahrenheit = MyModule.celsiusToFahrenheit(celsius)
print("That's ", fahrenheit, " degrees Fahrenheit")

همان‌طور که در کد فوق می‌بینید، ابتدا کیورد import و به دنبال آن نام ماژول مرتبط با فانکشن مد نظر خود را آورده‌ایم و اکنون می‌توانیم فانکشن تعریف‌شده در این ماژول را در تمامی نقاط برنامه فراخوانی کنیم. در ادامه، متغیری تحت عنوان celsius تعریف کرده‌ایم که قرار است تا درجۀ ورودی توسط کاربر را نگهداری کند بدین صورت که فانکشن از پیش تعریف‌شدۀ ()input را فراخوانی کرده و استرینگ «:Enter a temperature in Celsius» را به عنوان آرگومان ورودی به آن داده‌ایم و از کاربر خواسته‌ایم تا عددی را به عنوان دمایی در واحد سانتی‌گراد وارد کند و این عدد ورودی را به متغیر celsius منتسب کرده‌ایم. حال برای فراخوانی فانکشن ()celsiusToFahrenheit ابتدا نام ماژول مربوطه را آورده و در ادامه یک . قرار داده و فانکشن مذکور را فراخوانی کرده و عدد ورودی از سَمت کاربر را به آن پاس داده‌ایم و گفته‌ایم خروجی حاصل از فراخوانی فانکشن مورد نظر در متغیر fahrenheit ذخیره شود. در نهایت، فانکشن ()print عدد ذخیره‌شده در متغیر fahrenheit را با استرینگ تعریف‌شده کانکت کرده و در خروجی چاپ می‌کند.

نکته
برای فراخوانی فانکشن مورد نظر از ماژول مربوطه ابتدا نام ماژول را آورده و پس از آن یک علامت Dot (نقطه) قرار داده سپس نام فانکشن با آرگومان یا آرگومان‌های ورودی‌اش را می‌نویسیم.

اسکریپت بالا را در فایلی تحت عنوان Modular.py ذخیره کرده و آن را اجرا می‌کنیم که خروجی حاصل از اجرای آن به صورت زیر می‌باشد:

Enter a temperature in Celsius: 65
That's  149.0  degrees Fahrenheit

توجه داشته باشیم که برای درست کار کردن برنامۀ فوق در زمان اجرا باید آن را در دایرکتوری مربوط به فایل ایمپورت‌شده قرار دهیم چرا که در غیر این صورت مفسر پایتون نمی‌تواند فایل ایمپورت‌شده را پیدا کند و این امر منجر به بروز ارور می‌گردد که یک نمونه خروجی حاصل از اجرای برنامه خارج از دایرکتوری مربوط به ماژول MyModule به شکل زیر می‌باشد:

Enter a temperature in Celsius: 54
Traceback (most recent call last):
  File "C:/Users/Admin/Desktop/Modular.py", line 3, in 
    fahrenheit = MyModule.celsiusToFahrenheit(celsius)
NameError: name 'MyModule' is not defined

همان‌طور که در سطر آخر می‌بینیم، با اروری در قالب پیغام «MyModule is not defined» مواجه می‌شویم بدین معنی که مفسر پایتون قادر بر پیدا کردن ماژول مد نظر نبوده و آن را تعریف‌نشده می‌داند.

دانلود فایل‌های تمرین
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
peymanbagheri8
peymanbagheri8
۱۳۹۷/۱۲/۱۴
خواستم یک تشکر ویژه کنم از سایت عالی سکان آکادمی بابت این دوره عالی که واقعا بی عیب و نقص بود و واسه من مبتدی چیزی کم نذاشت.
و یک سوال کلیشه ای:
الان دیگه ادامه آموزش ارایه نمیشه؟؟؟؟
کاربر میهمان
parhamمن یک کاربر مهمان هستم
۱۳۹۷/۱۲/۱۲
سلام متشکرم بابت آمورش های خوبتون
آیا آموزشی در سایت سکان آکادمی وجود دارد مبنی بر اینکه
حالا که برنامه نویسی پایتون را یاد گرفتیم چگونه آنرا تبدیل به یک اپلیکیشن بکنیم.
اگر آموزشی وجود ندارد سورسی هست که پیشنهاد بکنید؟
مرسی
s.javaniazar
s.javaniazar
۱۳۹۷/۱۰/۱۳
سلام
مطالبتون بسیار مفید و آموزنده است. به طور ساده و قابل فهم آموزش داده شده. بسیار ممنون بابت زحمات بی دریغتان
کاربر میهمان
saeedmzmمن یک کاربر مهمان هستم
۱۳۹۶/۰۴/۰۱
من اینجا کامنت های واقعا تاثیر گذاری رو دیدم ....
دوستان یک کورس خیلی خوب دیگه هست از جادی که در واقع در سایت آموزشی gotoclass قرار گرفته . یک مسئله هست . اونم اینکه این آموزش در اصل رایگان نیست و برای گرفتن ویدئو های آموزش اون باید اون رو بخرید اما.... توی سایت مدرس این آموزش( جادی ) خودش توضیح داده که کسایی که توانایی پرداخت هزینه رو نداره خیلی راحت به من ایمیل بزنن تا رایگان براشون آموزش ها رو بفرستم. در واقع توی این پست توضیح داده : https://jadi.net/2017/01/gotoclass-python

این هم آدرس ایمیل جادی :
jadijadi@gmail.com

در نهایت دوستانی که توانایی خرید این اموزش رو دارند بهتره که این آموزش ها رو از سایت gotoclass بخرن و در پایان هم گویا آزمونی گرفته میشه و اگر قبول بشن مدرک مورد تایید وزارت علوم رو میگیرن :
http://gotoclass.ir/courses/پایتون-مقدماتی/
کاربر میهمان
annoمن یک کاربر مهمان هستم
۱۳۹۶/۰۳/۱۲
سلام سکان آکادمی عزیز
شخصی هستم که به دلیل مشکلات جسمی و روحی و گوشه گیری هایی که دارم قادر نیستم برای یادگیری این زبان از منزل خارج بشم. خیلی بابت شروع آموزش شما خوشحال بودم و داشتم کم کم به آینده امیدوار می شدم اما حالا که می بینم اموزش ها کنار گذاشته شده دیگه از زندگی تماما نا امیدم. دیگه فکرم به جایی نمی رسه و نمیدونم تو این زندگی بی معنایی که برای خودم ساختم چه کنم. هر روز به این صفحه سر میزنم و امید دارم که شما آموزش رو شروع کرده باشید ولی باز هم ...
دیگه نمیدونم تو زندگی چه کار کنم....
کاربر میهمان
aliمن یک کاربر مهمان هستم
۱۳۹۵/۱۱/۲۵
با تشکر فراوان از زحمات و ساده گویی شما در ارایه این مطلب. امید است که ادامه این دوره آموزشی هر چه سریعتر با همت والای شما از سر گرفته شود.
کاربر میهمان
حسن ذوالفقاریمن یک کاربر مهمان هستم
۱۳۹۵/۱۱/۱۹
سلام.
چرا وقتی دیکشنری به پایتون میدم، آیتمهاش به طور راندوم نشون داده میشه؟
مثلا: a:1, b:2, c:3, d:4.
b a d c.
آیا مشکلی توی سیستم منه یا کلا این مشکل برای همه هست؟
البته من فایلها رو با خط فرمان اجرا میکنم. مثل کاری که آقای علی انجام دادند و سوالشون رو من جواب دادم.
موفق باشید!
sara
sara
۱۳۹۵/۱۱/۱۸
آموزشتون بسیار عالی بود ممنون از مطالب خوبتون
کاربر میهمان
حسن ذوالفقاریمن یک کاربر مهمان هستم
۱۳۹۵/۱۱/۱۷
سلام میکنم خدمت مدیریت محترم و اعضای تیم سکان آکادمی.
از آموزشها و زحمات خانم نرگس اسدی هم تشکر ویژه میکنم.
من روشندلم و مدتیه که اصرار دارم زبان پایتون رو یاد بگیرم و برای برنامه‌های خاصی استفاده کنم.
میخواستم جواب سوال یکی‌از اعضا رو بدم.
اگه دوست دارید خروجی رو بدون استفاده از آیدل ببینید، آخر هر برنامه این کد رو بنویسید:
end=input()
با این کد، سیستم منتظر ورودیهای کاربر میمونه. بدین‌ترتیب، سیستم تا چیزی از کاربر نگیره و تا کاربر اینتر نزنه، برنامه رو باز نگه‌میداره.
موفق باشید.
limoresa
limoresa
۱۳۹۵/۰۸/۱۹
تقدیم صمیمانه ترین احترامات و سپاس فراوان خدمت مدرس محترم و سایر اعضای تیم سکان آکادمی
برایتان آرزوی سربلندی و پیروزی دارم
مطالب این آموزش واقعا مفید هستند و حساب شده و منظم بیان شده اند .... خداقوت ، دست مریزاد