رفتن به محتوای اصلی
برنامه‌سازی پیشرفته با پایتون درس‌نامهٔ آزاد
درس مقدماتی ۲۰ دقیقه

پل ورود به دوره

مرور فشردهٔ پیش‌نیازهای پایتون: توابع، جهش‌پذیری، ارجاع‌ها و ساختار پروژه. نقطهٔ شروع دوره.

هدف این درس

بتوانی مسئله را به تابع‌های کوچک بشکنی و رفتار ارجاع و جهش‌پذیری را در کد پیش‌بینی کنی.

در این مطلب ۴

این دوره فرض می‌کند که با پایتون پایه آشنا هستی: متغیر، حلقه، شرط، تابع و کمی کار با لیست و دیکشنری. این درس یک پل است، نه یک دورهٔ مقدماتی کامل. سه ایده‌ای را که در تمام دوره به آن‌ها برمی‌گردیم، همین‌جا محکم می‌کنیم.

۱. مسئله را بشکن، بعد بنویس

تفکر از بالا به پایین (Top-down) یعنی اول مسئله را به قدم‌های بزرگ توصیف کنی، بعد هر قدم را به یک تابع تبدیل کنی. یک تابع خوب فقط یک کار انجام می‌دهد و نامش همان کار را می‌گوید.

def read_scores(path):
    """نمره‌ها را از فایل می‌خواند و برمی‌گرداند."""
    with open(path, encoding="utf-8") as f:
        return [float(line.strip()) for line in f if line.strip()]

def average(scores):
    return sum(scores) / len(scores)

def report(path):
    scores = read_scores(path)
    print(f"میانگین {len(scores)} نمره: {average(scores):.1f}")

۲. جهش‌پذیر در برابر جهش‌ناپذیر

در پایتون بعضی شیءها بعد از ساخته‌شدن عوض می‌شوند (جهش‌پذیر مثل list و dict) و بعضی نه (جهش‌ناپذیر مثل int، str و tuple). این تفاوت، منشأ نیمی از باگ‌های عجیب تازه‌کارهاست.

a = [1, 2, 3]
b = a            # b همان شیء a است، نه یک کپی
b.append(4)
print(a)         # [1, 2, 3, 4] — a هم عوض شد!

x = (1, 2, 3)
y = x            # تاپل جهش‌ناپذیر است؛ «تغییر» یعنی شیء تازه
تعریف ارجاع

متغیر در پایتون جعبه‌ای که مقدار را نگه می‌دارد نیست؛ برچسبی است که به یک شیء در حافظه اشاره می‌کند. انتساب، ارجاع تازه می‌سازد نه کپی.

برداشت نادرست رایج

اشتباه رایج

با b = a یک کپی مستقل از لیست ساخته می‌شود.

تصحیح

با b = a هر دو نام به یک شیء اشاره می‌کنند. برای کپی واقعی از list(a)، a.copy()‎ یا copy.deepcopy برای ساختارهای تودرتو استفاده کن.

۳. پروژهٔ کوچک، ساختار تمیز

حتی یک تمرین سه‌فایلی باید ساختار داشته باشد: هر فایل یک مسئولیت، و نقطهٔ ورود مشخص با نگهبان __main__.

# shop/cart.py
def total(items):
    """جمع قیمت اقلام سبد را برمی‌گرداند."""
    return sum(item["price"] * item["qty"] for item in items)
# shop/main.py
from cart import total

def main():
    items = [{"price": 12000, "qty": 2}, {"price": 8000, "qty": 1}]
    print(total(items))

if __name__ == "__main__":
    main()

از کجا بفهمی آماده‌ای؟

اگر بتوانی بدون اجرای کد بگویی خروجی تکهٔ زیر چیست، آمادهٔ ورود به دنیای شیءگرا هستی:

def add_tag(tags, tag="new"):
    tags.append(tag)
    return tags

a = []
print(add_tag(a))
print(add_tag(a))

سنجش فهم — پل ورود

۰ از ۳ پاسخ داده شده

  1. خروجی دومین print در مثال add_tag چیست؟
  2. کدام گزینه نشانهٔ این است که یک تابع بیش از یک مسئولیت دارد؟
  3. در پایتون، انتساب b = a برای لیست‌ها یک کپی مستقل می‌سازد.(درست / نادرست)

اول به همهٔ پرسش‌ها پاسخ دهید، بعد بررسی کنید.

مطالب مرتبط

از همین بخش و با برچسب‌های مشترک

این مطلب را خواندید؟ آن را علامت بزنید تا پیشرفت شما روی همین دستگاه ذخیره شود.

وضعیت پیشرفت برای پل ورود به دوره