خارجی (import)
چرا import؟
- توابعی که بهصورت داخلی (built-in) نیستند، باید از پکیج/ماژول دیگه وارد بشن
- کلیدواژه:
import
ماژول math
- وارد کردن:
import math - دسترسی به توابع با نقطه (dot notation):
math.func_name
decibels = 10 * math.log10(ratio)
height = math.sin(radians)ماژول random
- تولید اعداد شبهتصادفی (Pseudo-random) — واقعاً تصادفی نیستن ولی تشخیصشون سخته
| تابع | کار | مثال |
|---|---|---|
random.random() |
عدد اعشاری تصادفی بین 0 و 1 (بدون خود ۱) |
|
random.randint(5, 10) |
عدد صحیح تصادفی در بازه | 7 |
random.choice(t) |
یک عنصر تصادفی از لیست | t=[1,2,3] → 3 |
import random
for i in range(10):
x = random.random()
print(x)نصب پکیج خارجی (pip)
- اگه پکیج نصب نباشه:
pip install numpyسه روش import
| روش | سینتکس | استفاده |
|---|---|---|
| کامل | import numpy |
numpy.sin(numpy.pi) |
| با نامک (alias) | import numpy as np |
np.sin(np.pi) |
| فقط توابع خاص | from numpy import sin, pi |
sin(pi) (بدون پیشوند) |
ساخت ماژول شخصی
- هر فایل
.pyخودش یک ماژوله — میشه از توابع یک فایل، توی فایل دیگه استفاده کرد، دقیقاً مثلmathیاrandom
فرض کنیم فایلی به اسم calc.py داریم:
# calc.py
def add(a, b):
return a + b
def square(x):
return x ** 2حالا توی یک فایل دیگه (مثلاً main.py) که کنار همون فایل قرار داره:
# main.py
import calc
print(calc.add(2, 3)) # 5
print(calc.square(4)) # 16- توجه: اسم فایل بدون پسوند
.pyمیشه اسم ماژول — یعنیimport calc، نهimport calc.py - میشه از همون روشهای alias یا
from ... import ...هم استفاده کرد:
from calc import add
import calc as cفایل پکیج
- وقتی چند ماژول مرتبط رو توی یک پوشه کنار هم میذاریم، اون پوشه یه پکیج میشه
- برای اینکه پایتون اون پوشه رو بهعنوان پکیج بشناسه، باید داخلش یک فایل به اسم
__init__.pyوجود داشته باشه (حتی اگه خالی باشه)
ساختار پوشهای:
mypackage/
__init__.py
calc.py
strings.py
استفاده:
from mypackage import calc
print(calc.add(2, 3))
# یا:
import mypackage.calc as calc__init__.pyمیتونه خالی باشه (فقط برای معرفی پوشه بهعنوان پکیج)، یا میتونه کدی داشته باشه که وقتی پکیج import میشه، اجرا بشه — مثلاً import کردن خودکار زیرماژولها:
# __init__.py
from .calc import add, squareبا این کار میشه مستقیم نوشت:
from mypackage import addبدون اینکه لازم باشه اسم فایل calc رو هم بدونیم
نکته: از پایتون ۳.۳ به بعد، پکیج بدون
__init__.pyهم کار میکنه (namespace package)، ولی برای وضوح بیشتر و سازگاری، همچنان رایجه که این فایل رو (حتی خالی) بذارین.
if __name__ == "__main__" چیه و چرا استفاده میشه؟
- هر فایل پایتون یه متغیر داخلی به اسم
__name__داره - وقتی فایل مستقیم اجرا بشه (مثلاً
python calc.py)، مقدار__name__برابر"__main__"میشه - وقتی همون فایل بهعنوان ماژول import بشه، مقدار
__name__برابر اسم خود فایل میشه (مثلاً"calc")
# calc.py
def add(a, b):
return a + b
print("این خط همیشه اجرا میشه، چه import بشه چه مستقیم اجرا بشه")
if __name__ == "__main__":
print("این خط فقط وقتی اجرا میشه که calc.py مستقیم اجرا بشه")
print(add(2, 3))- اگه
main.pyاین فایل رو import کنه (import calc)، خط اولprintاجرا میشه ولی بخش داخلifاجرا نمیشه - اگه خود
calc.pyمستقیم اجرا بشه، هر دو اجرا میشن
چرا این کار مفیده؟
- به ما اجازه میده یک فایل هم بهعنوان ماژول قابلاستفاده توسط فایلهای دیگه باشه، هم بهعنوان برنامهی مستقل قابل اجرا
- معمولاً برای تست سریع توابع یک فایل، بدون اینکه اون تستها وقتی فایل import میشه هم اجرا بشن:
def process(data):
return [x * 2 for x in data]
if __name__ == "__main__":
# این بخش فقط برای تست دستیه، وقتی فایل import بشه اجرا نمیشه
sample = [1, 2, 3]
print(process(sample))