0%
در حال بارگذاری...

جستجو در سایت

درس ۱ سطح متوسط: الگوریتم‌ها و ساختارهای داده مقدماتی در پایتون

پایتون | Python متوسط

تبریک! 🎉 تو با موفقیت سطح مبتدی پایتون رو پشت سر گذاشتی و حالا آماده‌ای که وارد دنیای هیجان‌انگیز **سطح متوسط** بشی! 🚀 تو درس‌های ۱ تا ۱۰ مبتدی (متغیرها، حلقه‌ها، شیءگرایی، پایگاه داده و تست کد) حسابی قوی شدی، اما اگه هنوز اون درس‌ها رو کامل ندیدی، یه نگاهی بهشون بنداز تا پایه‌ت محکم‌تر بشه! 😎 تو این درس، من بهت یاد می‌دم چطور با **الگوریتم پایتون** و **ساختارهای داده** کار کنی تا برنامه‌هات سریع‌تر و بهینه‌تر بشن. برای مثال، تو می‌تونی یه لیست رو مرتب کنی یا سریع یه آیتم رو پیدا کنی. با مثال‌های عملی، جداول مقایسه، ۱۲ تمرین و یه پروژه جذاب، این درس  بهت کمک می‌کنه مثل یه حرفه‌ای کد بزنی. بریم شروع کنیم! 🎉

الگوریتم پایتون و ساختار داده چیه؟ 🧠

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

  • سرعت: تو برنامه‌های سریع‌تر می‌نویسی.
  • نظم: داده‌ها رو بهتر مدیریت می‌کنی.
  • حل مسئله: مشکلات پیچیده رو راحت‌تر حل می‌کنی.

به همین دلیل، الگوریتم‌ها و ساختارهای داده برای برنامه‌نویسی حرفه‌ای ضروریه. بیا یه الگوریتم ساده ببینیم:

def find_max(numbers):
    max_num = numbers[0]
    for num in numbers:
        if num > max_num:
            max_num = num
    return max_num
print(find_max([3, 1, 4, 2]))  # خروجی: ۴

بنابراین، تو با این الگوریتم بزرگ‌ترین عدد رو پیدا کردی.

مرتب‌سازی: نظم دادن به داده‌ها 📊

مرتب‌سازی (Sorting) داده‌ها رو به ترتیب (مثل صعودی) قرار می‌ده. برای مثال، تو می‌تونی از الگوریتم **Bubble Sort** استفاده کنی:

def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr
numbers = [64, 34, 25, 12]
print(bubble_sort(numbers))  # خروجی: [۱۲, ۲۵, ۳۴, ۶۴]

به علاوه، پایتون تابع داخلی sorted() داره:

numbers = [64, 34, 25, 12]
print(sorted(numbers))  # خروجی: [۱۲, ۲۵, ۳۴, ۶۴]

💡 نکته: تو باید Bubble Sort رو برای یادگیری الگوریتم‌ها بفهمی، ولی sorted() برای پروژه‌های واقعی سریع‌تره.

جست‌وجو: پیدا کردن داده‌ها 🔍

جست‌وجو (Searching) به تو کمک می‌کنه داده‌ها رو سریع پیدا کنی. برای مثال، الگوریتم **Linear Search** ساده‌ست:

def linear_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i
    return -1
numbers = [10, 20, 30, 40]
print(linear_search(numbers, 30))  # خروجی: ۲

علاوه بر این، اگه لیست مرتب باشه، تو می‌تونی از **Binary Search** استفاده کنی که سریع‌تره:

def binary_search(arr, target):
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1
numbers = [10, 20, 30, 40]
print(binary_search(numbers, 30))  # خروجی: ۲

💡 نکته: تو باید لیست رو قبل از Binary Search مرتب کنی.

ساختارهای داده: پشته و صف 🗃️

پشته (Stack) و صف (Queue) دو ساختار داده مهم هستن. برای مثال، پشته مثل یه بشقاب روی‌هم‌چیده‌ست (آخرین ورودی اول خارج می‌شه):

stack = []
stack.append(1)  # اضافه کردن
stack.append(2)
print(stack.pop())  # خروجی: ۲

به علاوه، صف مثل یه صف نونواییه (اولین ورودی اول خارج می‌شه):

from collections import deque
queue = deque()
queue.append(1)  # اضافه کردن
queue.append(2)
print(queue.popleft())  # خروجی: ۱

بنابراین، تو با این ساختارها داده‌ها رو بهتر مدیریت می‌کنی.

ترکیب با درس‌های قبلی: الگوریتم‌ها و شیءگرایی 🔄

برای مثال، تو می‌تونی الگوریتم‌ها رو با کلاس‌ها (درس ۷) ترکیب کنی:

class Sorter:
    def __init__(self, data):
        self.data = data

    def bubble_sort(self):
        arr = self.data.copy()
        n = len(arr)
        for i in range(n):
            for j in range(0, n - i - 1):
                if arr[j] > arr[j + 1]:
                    arr[j], arr[j + 1] = arr[j + 1], arr[j]
        return arr

sorter = Sorter([64, 34, 25, 12])
print(sorter.bubble_sort())  # خروجی: [۱۲, ۲۵, ۳۴, ۶۴]

به همین دلیل، ترکیب الگوریتم‌ها با درس‌های قبلی (مثل شیءگرایی) کدت رو حرفه‌ای‌تر می‌کنه.

مثال‌های عملی: دنیای واقعی 💡

برای مثال، بیا چند برنامه کاربردی بسازیم:

۱. مرتب‌سازی نمرات:

def sort_grades(grades):
    return sorted(grades)
grades = [18, 12, 15, 20]
print(sort_grades(grades))  # خروجی: [۱۲, ۱۵, ۱۸, ۲۰]

۲. جست‌وجوی دانشجو:

def find_student(students, name):
    for i, student in enumerate(students):
        if student == name:
            return i
    return -1
students = ["علی", "مریم", "رضا"]
print(find_student(students, "مریم"))  # خروجی: ۱

۳. مدیریت وظایف با پشته:

tasks = []
tasks.append("ایمیل")
tasks.append("تمرین")
print(tasks.pop())  # خروجی: تمرین

به همین دلیل، این مثال‌ها درس‌های قبلی (مثل لیست‌ها و حلقه‌ها) رو با الگوریتم‌ها ترکیب می‌کنن. کدها رو توی intermediate_lesson1_examples.py ذخیره کن.

خطاهای رایج و راه‌حل‌ها ⚠️

به طور کلی، این خطاها تو کار با الگوریتم‌ها شایعن:

خطا علت راه‌حل
IndexError دسترسی به ایندکس ناموجود تو باید محدوده لیست رو با len() چک کنی
ValueError ورودی نامناسب تو باید نوع داده رو با isinstance() بررسی کنی
Infinite Loop شرط حلقه اشتباه تو باید شرط خروج حلقه رو چک کنی

برای مثال:

def bad_search(arr, target):
    for i in range(100):  # خطر حلقه بی‌نهایت
        if arr[i] == target:
            return i
    return -1
# حل:
def good_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i
    return -1

تمرین‌ها: مهارتت رو تست کن! 📝

برای تسلط، این ۱۲ تمرین رو حل کن:

  1. یه تابع بنویس که کوچک‌ترین عدد رو توی لیست پیدا کنه.
  2. یه الگوریتم Bubble Sort برای مرتب‌سازی نزولی بنویس.
  3. یه تابع Linear Search بنویس که تعداد تکرار یه عدد رو بشماره.
  4. یه کلاس بساز که Binary Search رو پیاده کنه.
  5. یه برنامه بنویس که لیست رو با sorted() مرتب کنه.
  6. یه تابع بنویس که پشته رو با لیست پیاده کنه.
  7. یه برنامه بنویس که صف رو با deque مدیریت کنه.
  8. یه تابع بنویس که میانگین اعداد لیست رو بعد از مرتب‌سازی بگه.
  9. یه کلاس بساز که لیست وظایف رو با پشته مدیریت کنه.
  10. یه برنامه بنویس که یه لیست رو جست‌وجو کنه و همه ایندکس‌های تطبیق رو برگردونه.
  11. یه تابع بنویس که لیست رو معکوس کنه بدون reverse().
  12. یه برنامه بنویس که داده‌های پایگاه داده (درس ۸) رو مرتب کنه.

💡 نکته: هر تمرین رو توی فایل جدا (ex1.py، ex2.py) ذخیره کن.

پروژه کوچک: سیستم مدیریت وظایف 📋

برای مثال، بیا یه سیستم برای مدیریت وظایف با پشته بسازیم:

  1. اضافه و حذف وظایف.
  2. مرتب‌سازی وظایف.
  3. ذخیره در فایل.
class TaskManager:
    def __init__(self):
        self.tasks = []

    def add_task(self, task):
        self.tasks.append(task)
        with open("tasks.txt", "a") as f:
            f.write(f"{task}\n")
        print(f"وظیفه {task} اضافه شد!")

    def remove_task(self):
        if self.tasks:
            task = self.tasks.pop()
            print(f"وظیفه {task} حذف شد!")
        else:
            print("هیچ وظیفه‌ای نیست!")

    def sort_tasks(self):
        self.tasks = sorted(self.tasks)
        print("وظایف مرتب شدن!")

manager = TaskManager()
while True:
    print("\n=== مدیر وظایف ===")
    action = input("اضافه (a)، حذف (r)، مرتب (s)، خروج (q): ")
    if action == "q":
        break
    elif action == "a":
        task = input("وظیفه: ")
        manager.add_task(task)
    elif action == "r":
        manager.remove_task()
    elif action == "s":
        manager.sort_tasks()
print("خداحافظ!")

💡 تست کن: وظایف رو اضافه کن، مرتب کن و فایل tasks.txt رو چک کن.

سؤالات متداول (FAQ) ❓

به طور کلی، این سؤالات برای سطح متوسط رایجه:

  • چرا الگوریتم‌ها مهمن؟ چون تو رو کمک می‌کنن کد بهینه بنویسی.
  • Binary Search چطور کار می‌کنه؟ تو لیست مرتب رو نصف می‌کنی تا داده رو پیدا کنی.
  • چطور خطای الگوریتم رو رفع کنم؟ تو باید ورودی‌ها و حلقه‌ها رو با print چک کنی.
  • پشته و صف چه فرقی دارن؟ پشته LIFO (آخرین ورودی اول خارج) و صف FIFO (اولین ورودی اول خارج) هستن.

جمع‌بندی و قدم بعدی ⏭️

تبریک! 🚀 تو اولین درس سطح متوسط رو با موفقیت تموم کردی و حالا با الگوریتم‌ها و ساختارهای داده حسابی قوی شدی. بنابراین، تو آماده‌ای که برنامه‌های بهینه‌تر بنویسی. علاوه بر این، درس بعدی (رابط کاربری گرافیکی با tkinter) بهت یاد می‌ده چطور برنامه‌های بصری بسازی. در نهایت، تمرین‌ها رو توی PythonIntermediate ذخیره کن و اگه دوست داشتی، توی GitHub آپلود کن تا پیشرفتت رو نشون بدی! 😎

ارسال نظر جدید

گزارش دیدگاه