خانه دوره‌ها نمونه‌سوالات مقالات مشاوره پکیج‌ها هنر ریاضی داستان‌های ریاضی برنامه‌نویسی کلاس آنلاین کنکور المپیاد ماهنامه انتشارات درباره ما تماس با ما ورود / پنل من
🐍 آموزش جامع و رایگان

پایتون را از صفر تا نوشتن یک برنامه‌ی واقعی یاد بگیر

این صفحه یک دوره‌ی کامل و قدم‌به‌قدم پایتون است — از نصب و اولین خط کد تا متغیرها، شرط و حلقه، ساختارهای داده، توابع، مدیریت خطا، فایل، ماژول، برنامه‌نویسی شیءگرا، ایتریتور و ژنراتور، دکوریتور و در پایان، یک پروژه‌ی کامل و اجراشدنی. هر بخش را می‌توانید مستقیماً از فهرست زیر انتخاب کنید.

28 بخشمسیر کامل
+90 دقیقهزمان مطالعه
بدون پیش‌نیازاز صفر شروع می‌شه
پروژه‌محورمثال واقعی در هر بخش

📑 فهرست مطالب — روی هر مورد بزنید تا مستقیم به همان بخش بروید

  1. پایتون چیست و چرا این‌قدر محبوب شده؟
  2. نصب پایتون و آماده‌سازی محیط کار
  3. اولین برنامه؛ سلام دنیا
  4. کامنت‌ها و قواعد نام‌گذاری
  5. متغیرها و انواع داده‌ی پایه
  6. تبدیل نوع داده (Type Casting)
  7. عملگرها؛ ریاضی، مقایسه‌ای، منطقی و عضویت
  8. ورودی گرفتن از کاربر و چاپ خروجی
  9. رشته‌ها و کار کامل با متن
  10. ساختارهای شرطی: if، elif، else
  11. حلقه‌ها: for و while
  12. لیست (List) به‌طور کامل
  13. تاپل (Tuple)
  14. دیکشنری (Dictionary)
  15. مجموعه (Set)
  16. توابع؛ از تعریف ساده تا args و kwargs
  17. کامپرینشن؛ روش پایتونی نوشتن حلقه
  18. مدیریت خطا با try، except و finally
  19. کار با فایل‌ها (متن، JSON)
  20. ماژول، پکیج و نصب کتابخانه با pip
  21. برنامه‌نویسی شیءگرا (OOP) به‌طور کامل
  22. ایتریتور و ژنراتور
  23. دکوریتور؛ یک مقدمه‌ی کاربردی
  24. کتابخانه‌های معروف پایتون
  25. اشتباهات رایج مبتدی‌ها و راه رفع آن‌ها
  26. پروژه‌ی کامل: برنامه‌ی مدیریت نمرات کلاس
  27. تمرین‌های پیشنهادی برای تثبیت یادگیری
  28. جمع‌بندی و قدم بعدی

1 پایتون چیست و چرا این‌قدر محبوب شده؟

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

پایتون امروز در چند حوزه‌ی کاملاً متفاوت کاربرد گسترده دارد:

همین تنوع کاربرد باعث شده پایتون معمولاً اولین زبانی باشد که به تازه‌واردهای دنیای برنامه‌نویسی پیشنهاد می‌شود؛ و همین زبانی است که در یول آکادمی هم مسیر آموزش برنامه‌نویسی را با آن شروع می‌کنیم.

💡

پایتون به‌صورت رسمی از دو نسخه‌ی اصلی عبور کرده: پایتون 2 و پایتون 3. امروز پایتون 2 دیگر پشتیبانی نمی‌شود و تمام آموزش‌ها، از جمله همین دوره، بر اساس پایتون 3 نوشته شده‌اند.

2 نصب پایتون و آماده‌سازی محیط کار

برای شروع، باید پایتون را از سایت رسمی python.org دانلود و نصب کنید. نکته‌ی مهم در ویندوز این است که در صفحه‌ی اول نصب، گزینه‌ی Add Python to PATH را حتماً تیک بزنید؛ در غیر این صورت، دستور python در ترمینال شناخته نمی‌شود.

روی ویندوز

فایل نصبی را از سایت رسمی دانلود کنید، اجرا کنید، تیک Add Python to PATH را بزنید و روی Install بزنید. برای تست، Command Prompt را باز کرده و دستور زیر را بزنید:

python --version

روی مک (macOS)

معمولاً پایتون از قبل روی مک نصب است، اما بهتر است آخرین نسخه را از سایت رسمی یا با Homebrew نصب کنید:

brew install python3

روی لینوکس

در بیشتر توزیع‌های لینوکس، پایتون از قبل نصب است. برای نصب یا به‌روزرسانی در سیستم‌های مبتنی بر Debian/Ubuntu:

sudo apt update
sudo apt install python3 python3-pip

یک ویرایشگر کد مناسب

برای نوشتن کد به یک ویرایشگر متن ساده نیاز دارید. Visual Studio Code (VS Code) رایگان، سبک و با پشتیبانی عالی از پایتون (با نصب افزونه‌ی Python از مایکروسافت) یکی از بهترین انتخاب‌هاست. برای شروع سریع و بدون نصب هم می‌توانید از محیط‌های آنلاین مثل replit.com استفاده کنید.

دو راه برای اجرای کد پایتون

  1. محیط تعاملی (REPL) — با تایپ python در ترمینال باز می‌شود و هر خط کد را بلافاصله اجرا می‌کند؛ عالی برای تست سریع.
  2. نوشتن در فایل — کد را در فایلی با پسوند .py ذخیره می‌کنید و با دستور python file.py اجرا می‌کنید؛ روش اصلی برای نوشتن برنامه‌های واقعی.

3 اولین برنامه؛ سلام دنیا

اولین برنامه‌ی هر برنامه‌نویسی معمولاً همین یک خط است:

print("سلام دنیا")

تابع print هر چیزی که داخل پرانتز به آن بدهید را روی صفحه نمایش می‌دهد. اگر این خط را در فایلی مثل hello.py ذخیره کنید و در ترمینال، در همان پوشه، دستور python hello.py را اجرا کنید، عبارت «سلام دنیا» چاپ می‌شود. همین یک خط، اولین قدم واقعی در مسیر یادگیری برنامه‌نویسی است.

📌

در پایتون هر خط دستور معمولاً نیازی به سمی‌کالن (;) در انتها ندارد — برخلاف بسیاری از زبان‌های دیگر. این یکی از دلایلی است که کد پایتون تمیزتر به نظر می‌رسد.

4 کامنت‌ها و قواعد نام‌گذاری

کامنت (توضیح) بخشی از کد است که پایتون آن را اجرا نمی‌کند و فقط برای خواناتر شدن کد نوشته می‌شود. کامنت تک‌خطی با علامت # شروع می‌شود:

# این یک کامنت است و اجرا نمی‌شود
print("این خط اجرا می‌شود")  # توضیح کنار کد هم مجاز است

برای کامنت چندخطی معمولاً از سه گیومه استفاده می‌شود:

"""
این یک توضیح چندخطی است
که می‌تواند چند سطر ادامه پیدا کند
"""

قواعد نام‌گذاری متغیر و تابع

5 متغیرها و انواع داده‌ی پایه

متغیر در پایتون مثل یک برچسب است که روی یک مقدار می‌چسبانید. برخلاف بسیاری از زبان‌ها، در پایتون لازم نیست از قبل نوع متغیر را اعلام کنید؛ کافی است مقداری به آن نسبت دهید و پایتون خودش نوع را تشخیص می‌دهد:

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

6 تبدیل نوع داده (Type Casting)

گاهی لازم است نوع یک مقدار را عوض کنید؛ مثلاً عددی که از کاربر به‌صورت متن گرفته شده را به عدد واقعی تبدیل کنید تا بتوانید روی آن محاسبه انجام دهید. برای این کار از توابع 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 می‌دهد؛ چون این متن قابل تبدیل به عدد نیست. در بخش مدیریت خطا یاد می‌گیریم چطور جلوی توقف برنامه به‌خاطر چنین خطایی را بگیریم.

7 عملگرها؛ ریاضی، مقایسه‌ای، منطقی و عضویت

عملگرهای ریاضی

عملگرمعنیمثال
+جمع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

8 ورودی گرفتن از کاربر و چاپ خروجی

برای گرفتن ورودی از کاربر در محیط ترمینال، از تابع input() استفاده می‌شود. نکته‌ی مهم این است که خروجی input() همیشه از نوع رشته است، حتی اگر کاربر عدد وارد کند:

name = input("اسمت چیه؟ ")
age = int(input("چند سالته؟ "))   # تبدیل به عدد چون input رشته می‌دهد
print(f"سلام {name}, سال بعد {age + 1} ساله می‌شی!")

تابع print هم چند پارامتر مفید دارد:

print("سارا", "علی", "رضا", sep=" - ")   # جداکننده‌ی سفارشی: سارا - علی - رضا
print("در حال بارگذاری", end="...")     # به‌جای خط جدید، این متن در انتها بیاید
print("تمام شد")

9 رشته‌ها و کار کامل با متن

رشته یا string در پایتون هر متنی است که داخل گیومه‌ی تک یا جفت قرار می‌گیرد. رشته‌ها را می‌توان به هم چسباند (با +)، تکرار کرد (با *) و برش زد (indexing و slicing):

name = "برنامه‌نویسی"
print(name[0])       # اولین حرف
print(name[-1])      # آخرین حرف
print(name[0:5])     # پنج حرف اول (برش/slice)
print(name[::-1])    # کل رشته برعکس‌شده
print("سلام" + " " + "دنیا")  # چسباندن
print("ها" * 3)               # هاهاها

راحت‌ترین روش: f-string

برای ترکیب متن با مقدار متغیرها، بهترین و خواناترین روش استفاده از 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)طول رشته (تابع سراسری، نه متد)

10 ساختارهای شرطی: if، elif، else

هر برنامه‌ای در جایی نیاز دارد بر اساس یک شرط، مسیر متفاوتی را طی کند. در پایتون این کار با 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)   # بزرگسال

11 حلقه‌ها: for و while

حلقه‌ها برای تکرار یک بخش از کد استفاده می‌شوند. حلقه‌ی 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 + 1

دستورهای کنترل حلقه

break باعث خروج فوری از حلقه می‌شود و continue از باقی بدنه‌ی همان تکرار رد می‌شود و به تکرار بعدی می‌رود:

for num in range(1, 10):
    if num == 5:
        break          # به محض رسیدن به 5، حلقه کاملاً متوقف می‌شود
    if num % 2 == 0:
        continue       # اعداد زوج را چاپ نکن و برو سراغ عدد بعدی
    print(num)

enumerate و zip

وقتی هم به مقدار و هم به اندیس آن در یک لیست نیاز دارید، از 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}")

12 لیست (List) به‌طور کامل

لیست یک مجموعه‌ی مرتب و قابل‌تغییر از مقادیر است — می‌تواند شامل انواع داده‌ی متفاوت هم باشد:

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] دو عضو اول را برمی‌گرداند.

13 تاپل (Tuple)

تاپل شبیه لیست است، با این تفاوت مهم که بعد از ساخته‌شدن قابل تغییر نیست (immutable):

point = (3, 5)
print(point[0])      # 3
# point[0] = 10      # این خط خطا می‌دهد؛ تاپل تغییرناپذیر است

تاپل برای داده‌هایی که نباید عوض شوند (مثل مختصات یک نقطه یا روزهای هفته) مناسب است، و چون تغییرناپذیر است، سریع‌تر از لیست پردازش می‌شود و می‌تواند به‌عنوان کلید دیکشنری هم استفاده شود.

14 دیکشنری (Dictionary)

دیکشنری داده را به‌صورت جفت‌های کلید-مقدار نگه می‌دارد؛ برای نگه‌داری اطلاعاتی با برچسب مشخص (مثل مشخصات یک دانش‌آموز) بسیار کاربردی است:

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", "نامشخص") استفاده کنید.

15 مجموعه (Set)

مجموعه گروهی از مقادیر یکتا و بدون ترتیب است — برای حذف مقادیر تکراری و انجام عملیات ریاضی مثل اجتماع و اشتراک کاربرد دارد:

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}

16 توابع؛ از تعریف ساده تا args و kwargs

تابع بخشی از کد است که یک بار تعریف می‌شود و هر جا لازم باشد، فقط با صدا زدن نامش اجرا می‌شود؛ به این ترتیب از تکرار کد جلوگیری می‌کند. تابع با کلمه‌ی کلیدی def تعریف می‌شود:

def greet(name):
    return f"سلام {name}"

message = greet("سارا")
print(message)

پارامتر پیش‌فرض

def greet(name="دوست"):
    return f"سلام {name}"

print(greet())          # سلام دوست (چون ورودی داده نشد)
print(greet("علی"))     # سلام علی

ورودی نامشخص: args و kwargs

گاهی نمی‌دانید تابع چند ورودی می‌گیرد. با *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="تبریز")

محدوده‌ی متغیر (Scope) و بازگشت (Recursion)

متغیری که داخل یک تابع تعریف می‌شود محلی است و بیرون از تابع در دسترس نیست. اگر بخواهید یک متغیر سراسری را داخل تابع تغییر دهید، باید از کلیدواژه‌ی global استفاده کنید. تابعی که خودش را صدا می‌زند، تابع بازگشتی (recursive) نام دارد:

def factorial(n):
    if n <= 1:
        return 1
    return n * factorial(n - 1)   # تابع خودش را صدا می‌زند

print(factorial(5))   # 120

lambda؛ تابع یک‌خطی بی‌نام

برای توابع خیلی کوتاه که فقط یک بار لازم‌شان دارید، می‌توانید از 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 خودش را می‌گیرد.

17 کامپرینشن؛ روش پایتونی نوشتن حلقه

یکی از ویژگی‌های خاص پایتون، کامپرینشن (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 ["سلام", "چطوری", "خوبم"]}

این نوشتار در ابتدا کمی غریب به نظر می‌رسد، اما بعد از کمی تمرین، یکی از دوست‌داشتنی‌ترین و پرکاربردترین بخش‌های پایتون می‌شود.

18 مدیریت خطا با try، except و finally

هر برنامه‌ای ممکن است با خطا مواجه شود؛ مثلاً کاربر به‌جای عدد، متن وارد کند. برای اینکه برنامه به‌جای متوقف‌شدن، خطا را به‌شکل کنترل‌شده مدیریت کند، از 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

19 کار با فایل‌ها (متن، JSON)

برای خواندن یا نوشتن در یک فایل متنی، رایج‌ترین و امن‌ترین روش استفاده از 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 برای ذخیره‌ی داده‌های ساخت‌یافته (مثل یک دیکشنری) بسیار رایج است. ماژول داخلی 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"])

20 ماژول، پکیج و نصب کتابخانه با pip

بخش بزرگی از قدرت پایتون از کتابخانه‌های آماده‌ی آن می‌آید. برخی از این کتابخانه‌ها همراه خود پایتون نصب می‌شوند (مثل 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 ساخته می‌شود تا کتابخانه‌های هر پروژه از پروژه‌های دیگر جدا بمانند.

21 برنامه‌نویسی شیءگرا (OOP) به‌طور کامل

وقتی برنامه‌ها بزرگ‌تر می‌شوند، گروه‌بندی داده و رفتار مرتبط با هم در قالب یک کلاس (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 اشاره به همان شیء مشخص دارد و همیشه اولین پارامتر متدهای کلاس است.

وراثت (Inheritance)

یک کلاس می‌تواند ویژگی‌ها و رفتارهای کلاس دیگری را به ارث ببرد، تا مجبور نباشید کد را دوباره بنویسید:

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

متدهای ویژه (Magic Methods)

متدهایی مثل __str__ رفتار پیش‌فرض شیء را در موقعیت‌های خاص تعیین می‌کنند؛ مثلاً وقتی شیء را با print چاپ کنید:

class Student:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f"دانش‌آموز: {self.name}"

print(Student("سارا"))   # دانش‌آموز: سارا

22 ایتریتور و ژنراتور

هر شیء که بتوانید روی آن با 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، اما یکی‌یکی و بدون ساختن کل لیست در حافظه

ژنراتورها برای کار با داده‌های حجیم (مثلاً خواندن فایل بسیار بزرگ خط‌به‌خط) بسیار کارآمدتر از ساختن یک لیست کامل در حافظه هستند.

23 دکوریتور؛ یک مقدمه‌ی کاربردی

دکوریتور تابعی است که یک تابع دیگر را می‌گیرد و بدون تغییر کد اصلی آن، رفتار جدیدی به آن اضافه می‌کند — مثلاً اندازه‌گیری زمان اجرا یا لاگ‌گرفتن:

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) است؛ فقط خواناتر. دکوریتورها در پروژه‌های واقعی (مثل فریم‌ورک‌های وب) بسیار زیاد استفاده می‌شوند.

24 کتابخانه‌های معروف پایتون

کتابخانهکاربرد
mathمحاسبات ریاضی (جذر، لگاریتم، مثلثات و...) — همراه پایتون
randomتولید اعداد و انتخاب‌های تصادفی — همراه پایتون
datetimeکار با تاریخ و زمان — همراه پایتون
osکار با فایل‌ها، پوشه‌ها و سیستم‌عامل — همراه پایتون
NumPyمحاسبات عددی سریع روی آرایه و ماتریس — نیاز به نصب
pandasتحلیل و پردازش داده‌های جدولی — نیاز به نصب
Matplotlibرسم نمودار و تصویرسازی داده — نیاز به نصب
Django / Flaskساخت وب‌سایت و وب‌سرویس — نیاز به نصب
scikit-learnیادگیری ماشین کلاسیک — نیاز به نصب

لازم نیست همه‌ی این کتابخانه‌ها را هم‌زمان یاد بگیرید؛ وقتی مبانی زبان را محکم بلد باشید، یادگیری هرکدام از این ابزارها بر اساس نیاز پروژه، بسیار سریع‌تر پیش می‌رود.

25 اشتباهات رایج مبتدی‌ها و راه رفع آن‌ها

26 پروژه‌ی کامل: برنامه‌ی مدیریت نمرات کلاس

در این پروژه، چیزهایی که در طول این آموزش یاد گرفتیم — دیکشنری، توابع، حلقه، شرط و مدیریت خطا — را کنار هم می‌گذاریم تا یک برنامه‌ی کوچک اما کامل و واقعی بسازیم:

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.

27 تمرین‌های پیشنهادی برای تثبیت یادگیری

  1. برنامه‌ای بنویسید که بررسی کند یک عدد اول است یا نه.
  2. یک ماشین‌حساب ساده با چهار عمل اصلی و مدیریت خطای تقسیم بر صفر بسازید.
  3. لیستی از نمرات بگیرید و میانگین، بیشترین و کمترین را چاپ کنید.
  4. یک بازی حدس عدد بسازید که کاربر عددی بین 1 تا 100 حدس بزند و برنامه بگوید «بزرگ‌تر» یا «کوچک‌تر».
  5. برنامه‌ی مدیریت نمرات بخش قبل را طوری تغییر دهید که اطلاعات را در یک فایل JSON ذخیره و بازیابی کند.
  6. یک کلاس Rectangle (مستطیل) بسازید با متدهایی برای محاسبه‌ی مساحت و محیط.
💡

بهترین راه یادگیری پایتون، تایپ‌کردن دستی مثال‌ها و اجرای آن‌هاست، نه فقط خواندن. سعی کنید هر مثال این صفحه را خودتان اجرا کنید و کمی تغییرش دهید تا ببینید چه اتفاقی می‌افتد.

28 جمع‌بندی و قدم بعدی

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

قدم بعدی این است که این مبانی را با تمرین مداوم تثبیت کنید و کم‌کم به سراغ حوزه‌ی مورد علاقه‌تان بروید — چه تحلیل داده باشد، چه توسعه‌ی وب و چه هوش مصنوعی. در یول آکادمی، مسیر برنامه‌نویسی درست از همین نقطه ادامه پیدا می‌کند: با تمرین پروژه‌محور و رفع اشکال چهره‌به‌چهره.

آماده‌ای این مسیر را با یک همراه واقعی ادامه بدی؟

همین حالا ثبت‌نام کن، یا اول با یکی از مشاوران ما درباره‌ی مسیر مناسب خودت صحبت کن.