ماژول های پایتون (Python Modules) — به زبان ساده
در مطالب پیشین آموزش «زبان برنامهنویسی پایتون» (Python Programming Language)، به مباحث مقدماتی پایتون شامل «کلیدواژهها و شناساگرها» (Keywords and Identifiers)، «دستورات پایتون و دندانه گذاری» (Statements and Indentation)، «توضیحات» (Comments)، «انواع متغیرها» (Variables)، «انواع داده» (Data Types)، «تبدیل نوع» (Type Conversion)، «ورودی و خروجی» (I/O)، «عملگرها» (Operators)، «فضای نام» (Namespace)، «دستورات شرطی» (Conditional Statements) و «حلقهها» (Loops) پرداخته شد. همچنین، در بحث توابع، مباحث گوناگون از جمله مفهوم تابع و چگونگی تعریف آن، «آرگومانها» (Arguments)، «تابع بازگشتی» (Recursive Function)، تابع بینام (لاندا | Lambda) و «دامنه متغیرها» (Scope of Variables) مورد بررسی قرار گرفت. در این مطلب، ماژول های پایتون (Python Modules) بررسی خواهند شد. در ادامه، روش ساختن و وارد کردن (ایمپورت | Import) ماژولهای سفارشی در پایتون آموزش داده میشود. همچنین، روشهای گوناگون موجود برای وارد کردن و استفاده از «ماژولهای توکار» (Built-in Modules) بیان میشوند.
ماژول های پایتون
«ماژول» (Module) به فایلی گفته میشود که حاوی دستورات و تعاریف پایتون است. یک فایل حاوی کدهای پایتون، برای مثال example.py، یک ماژول نامیده میشود؛ برای مثال بیان شده، نام ماژول «example» است.
از ماژولها برای شکستن برنامهها به فایلهای کوچک و قابل مدیریت استفاده میشود. علاوه بر آن، ماژولها قابلیت استفاده مجدد از کد را فراهم میکنند. کاربران میتوانند به جای کپی کردن تعاریف در برنامههای گوناگون، توابع پر استفاده خود را تعریف و وارد کنند (ایمپورت). در ادامه، روش ساخت یک ماژول در پایتون آموزش داده خواهد شد. در این راستا، باید قطعه کد زیر را نوشت و آن را با عنوان example.py ذخیره کرد.
1# Python Module example
2
3def add(a, b):
4 """This program adds two
5 numbers and return the result"""
6
7 result = a + b
8 return result
در اینجا، تابع ()add درون یک ماژول به اسم example تعریف شده است. تابع، دو عدد را دریافت و مجموعه آنها را محاسبه میکند.
روش وارد کردن ماژول های پایتون
در پایتون، میتوان تعریف تابع درون یک ماژول را در ماژولی دیگر و یا مفسر تعاملی پایتون (Interactive Interpreter) فراخوانی کرد. از کلیدواژه import برای انجام این کار استفاده میشود.
برای وارد کردن ماژول از پیش تعریف شده example، دستور زیر را باید در خط فرمان پایتون وارد کرد.
1import example
این دستور، نام توابع موجود در ماژول example را به طور مستقیم در «جدول نماد» (Symbol Table) جاری وارد نمیکند. بلکه، صرفا نام ماژول example را در آنجا وارد میکند. با استفاده از نام ماژولها، میتوان به توابع با استفاده از عملگر نقطه یعنی «.» دسترسی داشت. دستور زیر، مثالی از این مورد است.
example
حجم بسیار بالا و قابل توجهی از ماژولهای استاندارد برای پایتون موجود هستند. فایل این ماژولها در Lib directory، درون محلی که پایتون نصب شده، قرار دارند. ماژول های استاندارد را میتوان به شیوهای مشابه با روشی که ماژولهای تعریف شده توسط کاربر در مثالهای بالا وارد شدهاند، به برنامه وارد (ایمپورت) کرد. راههای متعددی برای وارد کردن ماژولها وجود دارد. این راهکارها در ادامه بیان شدهاند.
دستور Import در پایتون
میتوان یک ماژول را با استفاده از دستور import وارد کرد و به تعاریف درون آن با استفاده از عملگر «.»، به شیوه بیان شده در بالا، دسترسی داشت.
در ادامه، مثالی برای این موضوع بیان شده است.
1# import statement example
2# to import standard module math
3
4import math
5print("The value of pi is", math.pi)
خروجی حاصل از اجرای برنامه بالا، به صورت زیر است.
The value of pi is 3.141592653589793
وارد کردن ماژولها با تغییر نام
یک ماژول را میتوان با تغییر نام آن، به صورت زیر وارد کرد.
1# import module by renaming it
2
3import math as m
4print("The value of pi is", m.pi)
در قطعه کد بالا، ماژول math به m تغییر نام داده شد. انجام این کار، در برخی از شرایط منجر به صرفهجویی در زمان مورد استفاده برای تایپ میشود. توجه به این نکته لازم است که math در دامنه برنامه شناخته شده نیست. بنابراین، math.pi غیر معتبر و m.pi پیادهسازی صحیح است.
استفاده از from ... import در پایتون
میتوان نامهای خاصی را از یک ماژول بدون وارد کردن کل ماژول، وارد کرد. در ادامه، مثالی از آنچه بیان شد آورده شده است.
1# import only pi from math module
2
3from math import pi
4print("The value of pi is", pi)
با استفاده از قطعه کد بالا، فقط مشخصه pi از ماژول فراخوانی شد. در چنین مثالهایی، از عملگر dot استفاده نمیشود. میتوان چندین مشخصه را به صورت زیر وارد کرد.
1>>> from math import pi, e
2>>> pi
33.141592653589793
4>>> e
52.718281828459045
وارد کردن همه اسامی
میتوان همه اسامی (تعاریف) را از یک ماژول و با استفاده از ساختار زیر، وارد کرد.
1# import all names from the standard module math
2
3from math import *
4print("The value of pi is", pi)
همه تعاریف از ماژول math وارد شدند. این امر موجب میشود همه اسامی به جز مواردی که با «خط تیره» (Underline) آغاز میشوند، در دامنه قابل مشاهده باشند. وارد کردن همه چیزی با استفاده از «*»، یک حرکت برنامهنویسی خوب نیست. این امر میتواند منجر به تکرار تعاریف برای یک شناساگر شود. همچنین، خوانایی کد را تحت تاثیر قرار داده و کاهش میدهد.
مسیر جستجوی ماژول های پایتون
هنگام وارد کردن یک ماژول، پایتون چندین محل را بررسی میکند. مفسر، ابتدا به دنبال یک ماژول توکار میگردد؛ اگر آن را پیدا نکرد، لیست دایرکتوریهای تعریف شده در sys.path را جست و جو میکند.
ترتیب جست و جو به صورتی است که در ادامه آورده شده است.
- دایرکتوری جاری
- PYTHONPATH (یک متغیر محیطی با لیستی از دایرکتوریها)
- دایرکتوری پیشفرض وابسته به نصب
>>> import sys >>> sys.path ['', 'C:\\Python33\\Lib\\idlelib', 'C:\\Windows\\system32\\python33.zip', 'C:\\Python33\\DLLs', 'C:\\Python33\\lib', 'C:\\Python33', 'C:\\Python33\\lib\\site-packages']
کاربر میتواند این فایل را ویرایش و مسیرهای مد نظر خودش را به آن اضافه کند.
بارگذاری مجدد یک ماژول
مفسر پایتون، یک ماژول را تنها یکبار در طول یک جلسه کاری وارد میکند. این امر، موجب افزایش کارایی میشود.
در ادامه، مثالی برای نمایش چگونگی وقوع این امر ارائه خواهد شد.
1# This module shows the effect of
2# multiple imports and reload
3
4print("This code got executed")
میتوان مشاهده کرد که کد، فقط یک بار اجرا شده است. این امر نشانگر آن است که ماژول، فقط یکبار وارد شده است. اکنون، اگر ماژول در طول برنامه تغییر کند، باید مجددا بارگذاری شود. یک راه برای انجام این کار، بازنشانی مفسر است. اما این کار کمک زیادی نخواهد کرد. پایتون، یک راهکار مناسب برای این کار فراهم میکند. میتوان از تابع ()reload درون ماژول imp برای بازنشانی یک ماژول استفاده کرد. روش انجام این کار، در مثال زیر آمده است.
1>>> import imp
2>>> import my_module
3This code got executed
4>>> import my_module
5>>> imp.reload(my_module)
6This code got executed
7<module 'my_module' from '.\\my_module.py'>
تابع توکار ()dir
میتوان از تابع ()dir برای پیدا کردن نامهایی که درون ماژول تعریف شدهاند، استفاده کرد.
برای مثال، یک تابع ()add در ماژول example تعریف شده است که در ابتدای این مطلب به آن پرداخته شد.
1>>> dir(example)
2['__builtins__',
3'__cached__',
4'__doc__',
5'__file__',
6'__initializing__',
7'__loader__',
8'__name__',
9'__package__',
10'add']
در اینجا میتوان یک لیست مرتب شده از اسامی (همراه با add) را مشاهده کرد. سایر اسامی که با خط تیره شروع شدهاند، خصیصههای پیشفرض مرتبط با ماژول در پایتون هستند (این موارد توسط کاربر تعریف نشدهاند). برای مثال، خصیصه __name__ حاوی نام ماژول است.
1>>> import example
2>>> example.__name__
3'example'
همه اسامی تعریف شده در «فضای نام» (Namespace) جاری را میتوان با استفاده از تابع ()dir و بدون هیچ آرگومانی پیدا کرد.
1>>> a = 1
2>>> b = "hello"
3>>> import math
4>>> dir()
5['__builtins__', '__doc__', '__name__', 'a', 'b', 'math', 'pyscripter']
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی پایتون
- آموزش تکمیلی برنامهنویسی پایتون
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- زبان برنامهنویسی پایتون (Python) — از صفر تا صد
- یادگیری علم داده (Data Science) با پایتون — از صفر تا صد
- آموزش پایتون (Python) — مجموعه مقالات جامع وبلاگ فرادرس
- کاربرد پایتون چیست و با آن چه میتوان کرد؟ | راهنمای کاربردی
^^
تفاوت ماژول و کتابخانه چیست؟
با سلام و احترام؛
ماژول، فایلی شامل توابع و کلاس و غیره است. به بیان دیگر، ماژولها شامل کدهای قابل اجرا هستند و بهصورت جداگانه میتوان از آنها استفاده کرد.
از طرف دیگر کتابخانهها را داریم که مجموعهای از ماژولها هستند و برای انجام وظیفه مشخصی بهکار میروند.
بهعنوان مثال در پایتون، ماژولهای math و random و کتابخانهای مانند Numpy را داریم که از این ماژول ها استفاده میکند و برای کارهای مهندسی و محاسبات عددی بهکار میرود.
با تشکر از همراهی شما با مجله فرادرس