این صفحه یک دورهی کامل و قدمبهقدم پایتون است — از نصب و اولین خط کد تا متغیرها، شرط و حلقه، ساختارهای داده، توابع، مدیریت خطا، فایل، ماژول، برنامهنویسی شیءگرا، ایتریتور و ژنراتور، دکوریتور و در پایان، یک پروژهی کامل و اجراشدنی. هر بخش را میتوانید مستقیماً از فهرست زیر انتخاب کنید.
پایتون یک زبان برنامهنویسی سطحبالا، همهمنظوره و متنباز است که در سال 1991 توسط خیدو ون روسوم منتشر شد. هدف اصلی طراحی این زبان، خوانا و ساده بودن کد بود؛ به همین دلیل پایتون بهجای علامتهای پیچیده مثل آکولاد و سمیکالن در زبانهایی مثل C یا جاوا، از تورفتگی (فاصلهگذاری منظم در ابتدای خط) برای مشخصکردن بلوکهای کد استفاده میکند. نتیجه این است که یک برنامهی پایتونی، حتی برای کسی که تازه شروع کرده، شبیه به متن انگلیسی ساده خوانده میشود.
پایتون امروز در چند حوزهی کاملاً متفاوت کاربرد گسترده دارد:
همین تنوع کاربرد باعث شده پایتون معمولاً اولین زبانی باشد که به تازهواردهای دنیای برنامهنویسی پیشنهاد میشود؛ و همین زبانی است که در یول آکادمی هم مسیر آموزش برنامهنویسی را با آن شروع میکنیم.
پایتون بهصورت رسمی از دو نسخهی اصلی عبور کرده: پایتون 2 و پایتون 3. امروز پایتون 2 دیگر پشتیبانی نمیشود و تمام آموزشها، از جمله همین دوره، بر اساس پایتون 3 نوشته شدهاند.
برای شروع، باید پایتون را از سایت رسمی python.org دانلود و نصب کنید. نکتهی مهم در ویندوز این است که در صفحهی اول نصب، گزینهی Add Python to PATH را حتماً تیک بزنید؛ در غیر این صورت، دستور python در ترمینال شناخته نمیشود.
فایل نصبی را از سایت رسمی دانلود کنید، اجرا کنید، تیک Add Python to PATH را بزنید و روی Install بزنید. برای تست، Command Prompt را باز کرده و دستور زیر را بزنید:
python --version
معمولاً پایتون از قبل روی مک نصب است، اما بهتر است آخرین نسخه را از سایت رسمی یا با Homebrew نصب کنید:
brew install python3
در بیشتر توزیعهای لینوکس، پایتون از قبل نصب است. برای نصب یا بهروزرسانی در سیستمهای مبتنی بر Debian/Ubuntu:
sudo apt update sudo apt install python3 python3-pip
برای نوشتن کد به یک ویرایشگر متن ساده نیاز دارید. Visual Studio Code (VS Code) رایگان، سبک و با پشتیبانی عالی از پایتون (با نصب افزونهی Python از مایکروسافت) یکی از بهترین انتخابهاست. برای شروع سریع و بدون نصب هم میتوانید از محیطهای آنلاین مثل replit.com استفاده کنید.
python در ترمینال باز میشود و هر خط کد را بلافاصله اجرا میکند؛ عالی برای تست سریع..py ذخیره میکنید و با دستور python file.py اجرا میکنید؛ روش اصلی برای نوشتن برنامههای واقعی.اولین برنامهی هر برنامهنویسی معمولاً همین یک خط است:
print("سلام دنیا")تابع print هر چیزی که داخل پرانتز به آن بدهید را روی صفحه نمایش میدهد. اگر این خط را در فایلی مثل hello.py ذخیره کنید و در ترمینال، در همان پوشه، دستور python hello.py را اجرا کنید، عبارت «سلام دنیا» چاپ میشود. همین یک خط، اولین قدم واقعی در مسیر یادگیری برنامهنویسی است.
در پایتون هر خط دستور معمولاً نیازی به سمیکالن (;) در انتها ندارد — برخلاف بسیاری از زبانهای دیگر. این یکی از دلایلی است که کد پایتون تمیزتر به نظر میرسد.
کامنت (توضیح) بخشی از کد است که پایتون آن را اجرا نمیکند و فقط برای خواناتر شدن کد نوشته میشود. کامنت تکخطی با علامت # شروع میشود:
# این یک کامنت است و اجرا نمیشود
print("این خط اجرا میشود") # توضیح کنار کد هم مجاز استبرای کامنت چندخطی معمولاً از سه گیومه استفاده میشود:
""" این یک توضیح چندخطی است که میتواند چند سطر ادامه پیدا کند """
_) شروع شود، نه با عدد.- یا @ مجاز نیستند.age و Age دو متغیر متفاوتاند.student_score نه StudentScore (این سبک نامگذاری snake_case نام دارد و استاندارد رسمی پایتون است).متغیر در پایتون مثل یک برچسب است که روی یک مقدار میچسبانید. برخلاف بسیاری از زبانها، در پایتون لازم نیست از قبل نوع متغیر را اعلام کنید؛ کافی است مقداری به آن نسبت دهید و پایتون خودش نوع را تشخیص میدهد:
name = "سارا" # رشته (str) age = 16 # عدد صحیح (int) height = 1.65 # عدد اعشاری (float) is_student = True # بولی (bool) favorite = None # عدم وجود مقدار
در همین چند خط، پنج نوع دادهی پایهی پایتون را میبینیم:
| نوع | نام در پایتون | مثال |
|---|---|---|
| str | رشته / متن | "سارا" |
| int | عدد صحیح | 16 |
| float | عدد اعشاری | 1.65 |
| bool | بولی (درست/غلط) | True / False |
| NoneType | هیچ مقداری | None |
با تابع type() میتوانید نوع هر متغیر را ببینید، مثلاً type(age) مقدار int را برمیگرداند. یک متغیر در پایتون میتواند در طول برنامه، مقداری از نوع دیگر هم بگیرد — چون پایتون نوعبندی «پویا» دارد.
میتوانید چند متغیر را همزمان مقداردهی کنید: x, y, z = 1, 2, 3
گاهی لازم است نوع یک مقدار را عوض کنید؛ مثلاً عددی که از کاربر بهصورت متن گرفته شده را به عدد واقعی تبدیل کنید تا بتوانید روی آن محاسبه انجام دهید. برای این کار از توابع int()، float()، str() و bool() استفاده میشود:
age_text = "16" age_number = int(age_text) # تبدیل رشته به عدد صحیح print(age_number + 4) # 20 price = 25000 price_text = str(price) # تبدیل عدد به رشته pi_text = "3.14" pi_number = float(pi_text) # تبدیل رشته به عدد اعشاری
اگر بخواهید رشتهای مثل "سلام" را به int() بدهید، پایتون خطای ValueError میدهد؛ چون این متن قابل تبدیل به عدد نیست. در بخش مدیریت خطا یاد میگیریم چطور جلوی توقف برنامه بهخاطر چنین خطایی را بگیریم.
| عملگر | معنی | مثال |
|---|---|---|
| + | جمع | 5 + 2 → 7 |
| - | تفریق | 5 - 2 → 3 |
| * | ضرب | 5 * 2 → 10 |
| / | تقسیم (همیشه اعشاری) | 7 / 2 → 3.5 |
| // | تقسیم صحیح | 7 // 2 → 3 |
| % | باقیماندهی تقسیم | 7 % 2 → 1 |
| ** | توان | 2 ** 3 → 8 |
هرکدام همیشه یک مقدار بولی (True یا False) برمیگردانند: == (برابر)، != (نابرابر)، >، <، >=، <=.
یکی از رایجترین اشتباههای مبتدیها، اشتباهگرفتن = (انتساب مقدار) با == (مقایسه) است. x = 5 یعنی «مقدار 5 را در x بریز»، اما x == 5 یعنی «آیا x برابر 5 است؟»
and، or و not برای ترکیب چند شرط به کار میروند. مثلاً برای بررسی اینکه سن بین 10 تا 18 سال است:
age = 15 print(age >= 10 and age <= 18) # True
in و not in بررسی میکنند آیا مقداری داخل یک مجموعه (لیست، رشته و...) وجود دارد یا نه؛ is بررسی میکند آیا دو متغیر دقیقاً به یک شیء در حافظه اشاره دارند.
fruits = ["سیب", "موز", "پرتقال"]
print("موز" in fruits) # True
print("انگور" not in fruits) # Trueبرای گرفتن ورودی از کاربر در محیط ترمینال، از تابع input() استفاده میشود. نکتهی مهم این است که خروجی input() همیشه از نوع رشته است، حتی اگر کاربر عدد وارد کند:
name = input("اسمت چیه؟ ")
age = int(input("چند سالته؟ ")) # تبدیل به عدد چون input رشته میدهد
print(f"سلام {name}, سال بعد {age + 1} ساله میشی!")تابع print هم چند پارامتر مفید دارد:
print("سارا", "علی", "رضا", sep=" - ") # جداکنندهی سفارشی: سارا - علی - رضا
print("در حال بارگذاری", end="...") # بهجای خط جدید، این متن در انتها بیاید
print("تمام شد")رشته یا string در پایتون هر متنی است که داخل گیومهی تک یا جفت قرار میگیرد. رشتهها را میتوان به هم چسباند (با +)، تکرار کرد (با *) و برش زد (indexing و slicing):
name = "برنامهنویسی"
print(name[0]) # اولین حرف
print(name[-1]) # آخرین حرف
print(name[0:5]) # پنج حرف اول (برش/slice)
print(name[::-1]) # کل رشته برعکسشده
print("سلام" + " " + "دنیا") # چسباندن
print("ها" * 3) # هاهاهابرای ترکیب متن با مقدار متغیرها، بهترین و خواناترین روش استفاده از f-string است؛ کافی است حرف f را قبل از گیومه بگذارید و متغیر را داخل آکولاد بنویسید:
name = "سارا"
age = 16
print(f"سلام {name}, سن تو {age} ساله")
print(f"سال بعد {age + 1} ساله میشی") # حتی محاسبه هم داخل f-string جواب میدهد| متد | کاربرد |
|---|---|
| .upper() | تبدیل به حروف بزرگ |
| .lower() | تبدیل به حروف کوچک |
| .strip() | حذف فاصلههای اضافی از ابتدا و انتها |
| .replace(a, b) | جایگزینی بخشی از متن |
| .split(sep) | تقسیم رشته به لیستی از قطعات |
| .join(list) | چسباندن یک لیست بههم با یک جداکننده |
| .find(x) | پیدا کردن محل یک زیررشته |
| len(str) | طول رشته (تابع سراسری، نه متد) |
هر برنامهای در جایی نیاز دارد بر اساس یک شرط، مسیر متفاوتی را طی کند. در پایتون این کار با if، elif (مخفف else if) و else انجام میشود:
score = 17
if score >= 18:
print("عالی")
elif score >= 12:
print("قبول")
else:
print("نیاز به تلاش بیشتر")در پایتون بلوک هر شرط با تورفتگی (معمولاً چهار فاصله) مشخص میشود، نه با آکولاد. اگر تورفتگی رعایت نشود، پایتون خطای IndentationError میدهد. همین قانون ساده، خواندن کد پایتون را بسیار راحتتر از بسیاری زبانهای دیگر میکند.
میتوان شرطها را داخل هم هم نوشت، و برای شرطهای خیلی ساده، از یک نوشتار کوتاهتر به نام «عملگر سهتایی» استفاده کرد:
age = 20 status = "بزرگسال" if age >= 18 else "نوجوان" print(status) # بزرگسال
حلقهها برای تکرار یک بخش از کد استفاده میشوند. حلقهی for معمولاً برای پیمایش روی یک دنباله (مثل یک لیست یا یک بازهی عددی) به کار میرود:
for i in range(1, 6):
print(i) # اعداد 1 تا 5تابع range(1, 6) بازهای از 1 تا 5 میسازد (عدد 6 در آن نیست). حلقهی while تا زمانی که یک شرط برقرار باشد ادامه پیدا میکند:
count = 0
while count < 5:
print(count)
count = count + 1break باعث خروج فوری از حلقه میشود و continue از باقی بدنهی همان تکرار رد میشود و به تکرار بعدی میرود:
for num in range(1, 10):
if num == 5:
break # به محض رسیدن به 5، حلقه کاملاً متوقف میشود
if num % 2 == 0:
continue # اعداد زوج را چاپ نکن و برو سراغ عدد بعدی
print(num)وقتی هم به مقدار و هم به اندیس آن در یک لیست نیاز دارید، از enumerate استفاده کنید؛ برای پیمایش همزمان دو لیست، از zip:
names = ["سارا", "علی", "رضا"]
for index, name in enumerate(names):
print(index, name)
scores = [18, 15, 19]
for name, score in zip(names, scores):
print(f"{name}: {score}")لیست یک مجموعهی مرتب و قابلتغییر از مقادیر است — میتواند شامل انواع دادهی متفاوت هم باشد:
fruits = ["سیب", "موز", "پرتقال"]
print(fruits[0]) # سیب
print(len(fruits)) # 3
fruits.append("انگور") # اضافهکردن به انتها
fruits.remove("موز") # حذف بر اساس مقدار
fruits[0] = "گلابی" # تغییر عضو با اندیس| متد | کاربرد |
|---|---|
| .append(x) | اضافهکردن یک عضو به انتهای لیست |
| .insert(i, x) | اضافهکردن در یک اندیس مشخص |
| .remove(x) | حذف اولین عضو با مقدار x |
| .pop(i) | حذف و برگرداندن عضو در اندیس i (پیشفرض: آخرین عضو) |
| .sort() | مرتبسازی لیست (بهصورت جایگزین) |
| .reverse() | برعکسکردن ترتیب اعضا |
| .copy() | ساخت یک کپی مستقل از لیست |
| .index(x) | پیدا کردن اندیس اولین وقوع x |
| .count(x) | تعداد تکرار x در لیست |
برش (slicing) روی لیست هم دقیقاً مثل رشته کار میکند: fruits[0:2] دو عضو اول را برمیگرداند.
تاپل شبیه لیست است، با این تفاوت مهم که بعد از ساختهشدن قابل تغییر نیست (immutable):
point = (3, 5) print(point[0]) # 3 # point[0] = 10 # این خط خطا میدهد؛ تاپل تغییرناپذیر است
تاپل برای دادههایی که نباید عوض شوند (مثل مختصات یک نقطه یا روزهای هفته) مناسب است، و چون تغییرناپذیر است، سریعتر از لیست پردازش میشود و میتواند بهعنوان کلید دیکشنری هم استفاده شود.
دیکشنری داده را بهصورت جفتهای کلید-مقدار نگه میدارد؛ برای نگهداری اطلاعاتی با برچسب مشخص (مثل مشخصات یک دانشآموز) بسیار کاربردی است:
student = {"name": "سارا", "grade": 10, "score": 18.5}
print(student["name"]) # سارا
student["score"] = 19 # تغییر مقدار یک کلید
student["city"] = "تبریز" # اضافهکردن کلید جدید
for key, value in student.items():
print(key, ":", value)| متد | کاربرد |
|---|---|
| .get(key, default) | گرفتن مقدار بدون خطا اگر کلید نبود |
| .keys() | لیست تمام کلیدها |
| .values() | لیست تمام مقدارها |
| .items() | لیست جفتهای (کلید، مقدار) |
| .update(d) | ادغام یک دیکشنری دیگر |
| .pop(key) | حذف یک کلید و برگرداندن مقدارش |
اگر با student["city"] کلیدی را بخواهید که وجود ندارد، پایتون خطای KeyError میدهد. برای دسترسی امن از student.get("city", "نامشخص") استفاده کنید.
مجموعه گروهی از مقادیر یکتا و بدون ترتیب است — برای حذف مقادیر تکراری و انجام عملیات ریاضی مثل اجتماع و اشتراک کاربرد دارد:
numbers = {1, 2, 3, 2, 1}
print(numbers) # {1, 2, 3} — تکراریها خودکار حذف میشوند
a = {1, 2, 3}
b = {2, 3, 4}
print(a | b) # اجتماع: {1, 2, 3, 4}
print(a & b) # اشتراک: {2, 3}
print(a - b) # تفاضل: {1}تابع بخشی از کد است که یک بار تعریف میشود و هر جا لازم باشد، فقط با صدا زدن نامش اجرا میشود؛ به این ترتیب از تکرار کد جلوگیری میکند. تابع با کلمهی کلیدی def تعریف میشود:
def greet(name):
return f"سلام {name}"
message = greet("سارا")
print(message)def greet(name="دوست"):
return f"سلام {name}"
print(greet()) # سلام دوست (چون ورودی داده نشد)
print(greet("علی")) # سلام علیگاهی نمیدانید تابع چند ورودی میگیرد. با *args میتوانید تعداد نامشخصی ورودی موقعیتی، و با **kwargs تعداد نامشخصی ورودی نامدار بگیرید:
def total(*numbers):
return sum(numbers)
print(total(1, 2, 3, 4)) # 10
def show_info(**info):
for key, value in info.items():
print(f"{key}: {value}")
show_info(name="سارا", age=16, city="تبریز")متغیری که داخل یک تابع تعریف میشود محلی است و بیرون از تابع در دسترس نیست. اگر بخواهید یک متغیر سراسری را داخل تابع تغییر دهید، باید از کلیدواژهی global استفاده کنید. تابعی که خودش را صدا میزند، تابع بازگشتی (recursive) نام دارد:
def factorial(n):
if n <= 1:
return 1
return n * factorial(n - 1) # تابع خودش را صدا میزند
print(factorial(5)) # 120برای توابع خیلی کوتاه که فقط یک بار لازمشان دارید، میتوانید از lambda استفاده کنید:
square = lambda x: x ** 2 print(square(5)) # 25 numbers = [5, 2, 8, 1] numbers.sort(key=lambda x: -x) # مرتبسازی نزولی با یک lambda
خروجی کد زیر چیست؟
def add(a, b=10):
return a + b
print(add(5))خروجی 15 است؛ چون فقط مقدار a داده شده و b مقدار پیشفرض 10 خودش را میگیرد.
یکی از ویژگیهای خاص پایتون، کامپرینشن (comprehension) است؛ روشی کوتاه برای ساختن یک لیست، دیکشنری یا مجموعهی جدید، بدون نوشتن حلقهی چند خطی:
# List comprehension
squares = [x**2 for x in range(1, 6)]
print(squares) # [1, 4, 9, 16, 25]
# با شرط
evens = [x for x in range(1, 11) if x % 2 == 0]
# Dict comprehension
square_map = {x: x**2 for x in range(1, 5)}
# Set comprehension
unique_lengths = {len(word) for word in ["سلام", "چطوری", "خوبم"]}این نوشتار در ابتدا کمی غریب به نظر میرسد، اما بعد از کمی تمرین، یکی از دوستداشتنیترین و پرکاربردترین بخشهای پایتون میشود.
هر برنامهای ممکن است با خطا مواجه شود؛ مثلاً کاربر بهجای عدد، متن وارد کند. برای اینکه برنامه بهجای متوقفشدن، خطا را بهشکل کنترلشده مدیریت کند، از try و except استفاده میشود:
try:
number = int(input("یک عدد وارد کن: "))
print(10 / number)
except ValueError:
print("این یک عدد معتبر نبود")
except ZeroDivisionError:
print("نمیتوان بر صفر تقسیم کرد")
else:
print("محاسبه بدون خطا انجام شد") # فقط اگر خطایی رخ نداد
finally:
print("این خط همیشه اجرا میشود") # چه خطا بیفتد چه نیفتدکد داخل try اجرا میشود و اگر خطایی رخ دهد، پایتون به بلوک except مربوط به همان نوع خطا میرود، بدون اینکه کل برنامه متوقف شود. این الگو در برنامههای واقعی، مخصوصاً وقتی با ورودی کاربر، فایل یا شبکه سروکار دارید، ضروری است.
با دستور raise میتوانید خودتان یک خطا تولید کنید، مثلاً برای رد یک ورودی نامعتبر در منطق برنامه:
def set_age(age):
if age < 0:
raise ValueError("سن نمیتواند منفی باشد")
return ageبرای خواندن یا نوشتن در یک فایل متنی، رایجترین و امنترین روش استفاده از with open(...) است:
with open("notes.txt", "w", encoding="utf-8") as f:
f.write("این یک یادداشت است")
with open("notes.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)حرف "w" یعنی نوشتن (write — فایل قبلی را پاک و از نو مینویسد)، "a" یعنی افزودن به انتهای فایل (append) و "r" یعنی خواندن (read). استفاده از with باعث میشود فایل بعد از پایان کار بهطور خودکار بسته شود، حتی اگر در میانهی کار خطایی رخ دهد.
فرمت JSON برای ذخیرهی دادههای ساختیافته (مثل یک دیکشنری) بسیار رایج است. ماژول داخلی json این کار را ساده میکند:
import json
student = {"name": "سارا", "grade": 10}
with open("student.json", "w", encoding="utf-8") as f:
json.dump(student, f, ensure_ascii=False)
with open("student.json", "r", encoding="utf-8") as f:
data = json.load(f)
print(data["name"])بخش بزرگی از قدرت پایتون از کتابخانههای آمادهی آن میآید. برخی از این کتابخانهها همراه خود پایتون نصب میشوند (مثل math برای محاسبات ریاضی یا random برای تولید اعداد تصادفی) و کافی است با import آنها را وارد کد کنید:
import math print(math.sqrt(16)) # 4.0 import random print(random.randint(1, 10)) # عدد تصادفی بین 1 تا 10 from math import pi # وارد کردن فقط یک بخش خاص از ماژول print(pi)
برای کتابخانههایی که همراه پایتون نیستند (مثل pandas برای تحلیل داده یا numpy برای محاسبات عددی)، باید آنها را با ابزار pip نصب کنید، معمولاً با دستوری مثل:
pip install pandas
همین سیستم سادهی نصب و وارد کردن کتابخانه، دلیل اصلی محبوبیت پایتون در حوزهی داده و هوش مصنوعی است؛ تقریباً هر کاری که فکرش را بکنید، یک کتابخانهی آماده برایش وجود دارد.
برای پروژههای واقعی، معمولاً یک «محیط مجازی» (virtual environment) با دستور python -m venv venv ساخته میشود تا کتابخانههای هر پروژه از پروژههای دیگر جدا بمانند.
وقتی برنامهها بزرگتر میشوند، گروهبندی داده و رفتار مرتبط با هم در قالب یک کلاس (class) کمک زیادی میکند. کلاس یک الگو برای ساختن شیء (object) است:
class Student:
def __init__(self, name, grade):
self.name = name
self.grade = grade
def introduce(self):
return f"من {self.name} هستم و پایهی {self.grade} میخوانم"
s1 = Student("سارا", 10)
print(s1.introduce())تابع __init__ «سازنده»ی کلاس است و هر بار که یک شیء جدید ساخته میشود، اجرا میشود. self اشاره به همان شیء مشخص دارد و همیشه اولین پارامتر متدهای کلاس است.
یک کلاس میتواند ویژگیها و رفتارهای کلاس دیگری را به ارث ببرد، تا مجبور نباشید کد را دوباره بنویسید:
class Person:
def __init__(self, name):
self.name = name
def introduce(self):
return f"اسم من {self.name} است"
class Student(Person): # Student از Person ارث میبرد
def __init__(self, name, grade):
super().__init__(name) # اجرای سازندهی کلاس والد
self.grade = grade
def introduce(self): # بازنویسی (override) متد والد
return f"{super().introduce()} و دانشآموز پایهی {self.grade} هستم"
s = Student("رضا", 11)
print(s.introduce())با گذاشتن یک یا دو زیرخط قبل از نام یک ویژگی، میتوان به دیگران اعلام کرد که این ویژگی «داخلی» است و نباید مستقیم از بیرون کلاس تغییر داده شود:
class BankAccount:
def __init__(self, balance):
self.__balance = balance # با __ شروع شده: خصوصی
def deposit(self, amount):
self.__balance += amount
def get_balance(self):
return self.__balanceمتدهایی مثل __str__ رفتار پیشفرض شیء را در موقعیتهای خاص تعیین میکنند؛ مثلاً وقتی شیء را با print چاپ کنید:
class Student:
def __init__(self, name):
self.name = name
def __str__(self):
return f"دانشآموز: {self.name}"
print(Student("سارا")) # دانشآموز: ساراهر شیء که بتوانید روی آن با for پیمایش کنید (مثل لیست یا رشته) یک iterable است. ژنراتور راهی ساده برای ساخت یک دنباله است که مقادیرش را یکییکی، فقط وقتی لازم است، تولید میکند — نه همه را یکجا در حافظه نگه میدارد. برای ساخت ژنراتور بهجای return از yield استفاده میشود:
def count_up_to(n):
number = 1
while number <= n:
yield number
number += 1
for num in count_up_to(5):
print(num) # 1 2 3 4 5، اما یکییکی و بدون ساختن کل لیست در حافظهژنراتورها برای کار با دادههای حجیم (مثلاً خواندن فایل بسیار بزرگ خطبهخط) بسیار کارآمدتر از ساختن یک لیست کامل در حافظه هستند.
دکوریتور تابعی است که یک تابع دیگر را میگیرد و بدون تغییر کد اصلی آن، رفتار جدیدی به آن اضافه میکند — مثلاً اندازهگیری زمان اجرا یا لاگگرفتن:
def log_call(func):
def wrapper(*args, **kwargs):
print(f"در حال اجرای {func.__name__}...")
result = func(*args, **kwargs)
print("اجرا تمام شد")
return result
return wrapper
@log_call
def add(a, b):
return a + b
print(add(3, 4))خط @log_call دقیقاً معادل نوشتن add = log_call(add) است؛ فقط خواناتر. دکوریتورها در پروژههای واقعی (مثل فریمورکهای وب) بسیار زیاد استفاده میشوند.
| کتابخانه | کاربرد |
|---|---|
| math | محاسبات ریاضی (جذر، لگاریتم، مثلثات و...) — همراه پایتون |
| random | تولید اعداد و انتخابهای تصادفی — همراه پایتون |
| datetime | کار با تاریخ و زمان — همراه پایتون |
| os | کار با فایلها، پوشهها و سیستمعامل — همراه پایتون |
| NumPy | محاسبات عددی سریع روی آرایه و ماتریس — نیاز به نصب |
| pandas | تحلیل و پردازش دادههای جدولی — نیاز به نصب |
| Matplotlib | رسم نمودار و تصویرسازی داده — نیاز به نصب |
| Django / Flask | ساخت وبسایت و وبسرویس — نیاز به نصب |
| scikit-learn | یادگیری ماشین کلاسیک — نیاز به نصب |
لازم نیست همهی این کتابخانهها را همزمان یاد بگیرید؛ وقتی مبانی زبان را محکم بلد باشید، یادگیری هرکدام از این ابزارها بر اساس نیاز پروژه، بسیار سریعتر پیش میرود.
= و == — اولی انتساب مقدار است، دومی مقایسه.input() همیشه رشته برمیگرداند، حتی برای عدد.در این پروژه، چیزهایی که در طول این آموزش یاد گرفتیم — دیکشنری، توابع، حلقه، شرط و مدیریت خطا — را کنار هم میگذاریم تا یک برنامهی کوچک اما کامل و واقعی بسازیم:
students = {} # دیکشنری برای نگهداری نمرات: {نام: نمره}
def add_student(name, score):
students[name] = score
def average_score():
if not students:
return 0
return sum(students.values()) / len(students)
def top_student():
return max(students, key=students.get)
def show_report():
print("\n--- گزارش کلاس ---")
for name, score in students.items():
status = "قبول" if score >= 10 else "مردود"
print(f"{name}: {score} ({status})")
print(f"میانگین کلاس: {average_score():.2f}")
print(f"بهترین نمره: {top_student()} با {students[top_student()]}")
# حلقهی اصلی برنامه
while True:
print("\n1) افزودن دانشآموز 2) نمایش گزارش 3) خروج")
choice = input("انتخاب شما: ")
if choice == "1":
name = input("نام دانشآموز: ")
try:
score = float(input("نمره (از 20): "))
add_student(name, score)
except ValueError:
print("نمره باید عدد باشد!")
elif choice == "2":
show_report()
elif choice == "3":
print("خدانگهدار!")
break
else:
print("گزینهی نامعتبر است، دوباره امتحان کن.")این کد را در فایلی مثل grades.py ذخیره کنید و با python grades.py اجرا کنید. سعی کنید خودتان قابلیت جدیدی به آن اضافه کنید — مثلاً ذخیرهی نمرات در یک فایل JSON با استفاده از چیزی که در بخش 19 یاد گرفتید، یا تبدیل آن به یک کلاس Classroom با استفاده از مفاهیم بخش 21.
Rectangle (مستطیل) بسازید با متدهایی برای محاسبهی مساحت و محیط.بهترین راه یادگیری پایتون، تایپکردن دستی مثالها و اجرای آنهاست، نه فقط خواندن. سعی کنید هر مثال این صفحه را خودتان اجرا کنید و کمی تغییرش دهید تا ببینید چه اتفاقی میافتد.
در این آموزش، مسیر کاملی را طی کردیم: از نصب پایتون و اولین خط کد، تا متغیرها، شرطها، حلقهها، چهار ساختار دادهی اصلی، توابع پیشرفته، مدیریت خطا، کار با فایل، ماژولها، برنامهنویسی شیءگرا، ایتریتور و ژنراتور، دکوریتور و در نهایت یک پروژهی کامل و اجراشدنی.
قدم بعدی این است که این مبانی را با تمرین مداوم تثبیت کنید و کمکم به سراغ حوزهی مورد علاقهتان بروید — چه تحلیل داده باشد، چه توسعهی وب و چه هوش مصنوعی. در یول آکادمی، مسیر برنامهنویسی درست از همین نقطه ادامه پیدا میکند: با تمرین پروژهمحور و رفع اشکال چهرهبهچهره.
همین حالا ثبتنام کن، یا اول با یکی از مشاوران ما دربارهی مسیر مناسب خودت صحبت کن.