زیربرنامه چیست؟

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

چرا از زیربرنامه استفاده کنیم؟

  1. اگر تعداد کدهای برنامه زیاد باشد
  2. اگر بخواهیم چندین کار رو با کدنویسی انجام بدیم یه شلوغی و شلختگی در کدهای ما بوجود میاد
  3. اگر مشکلی در برنامه پیش بیاد، امکان خطایابی سخت می شه، کنترل سخت تر میشه
  4. اگر بخواهیم یه کدی رو دوبار اجرا کنیم ، باید دوباره نویسی کنیم

راه حل: برای حل چنین مشکلاتی ما از زیربرنامه استفاده می کنیم.

تعریف زیربرنامه:

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

مزایای زیربرنامه:

  • کدها تکه تکه می شود و هر تکه مستقل و مجزا می شود
  • خوانایی برنامه بالا میره
  • خطایابی آسونتر می شه
  • کارتیمی راحتتر میشه؛ یعنی هر کسی بخشی از کد رو می نویسه و به برنامه اصلی اضافه می کنه

فرق زیربرنامه با تابع:

زیر برنامه دو نوع می باشد، ولی در اکثر موارد زیر برنامه را همان تابع می گویند چون اصول کد نویسی هر دو مدل یکسان می باشد ولی تفاوتهایی هم دارند:

روال، رویه یا Procedure

خروجی ندارد

تابع یا Function

می تواند خروجی داشته باشد

ساختار نوشتن زیربرنامه (هر دو نوع: تابع، روال):


def function_name(parameters):
    # دستورات
    return value

می تونه پارامتر داشته باشه یا نداشته باشه؛ (پارامتر چیست؟ در داخل زیربرنامه، اون متغیرهایی که وجود داره، مقادیری است که از بیرون به داخل زیربرنامه ارسال میشه = ورودی ها)
آرگومان چیست؟ اون متغیرهایی که در فراخوانی اجرا می شوند.
و اگر تابع خروجی داشته باشه توسط دستور return مقدار خروجی رو برگشت می دیم.

نکته: حتما برای استفاده از زیربرنامه باید آنرا فراخوانی کنیم

مثال اول: نمایش اعداد ۱ تا ۱۰

الف) تعریف و فراخوانی تابع


def p1():
    for i in range(1, 11, 1):
        print(i)

p1()

ب) فراخوانی چندباره تابع


def p1():
    for i in range(1, 11, 1):
        print(i)

p1()
p1()
p1()

ج) استفاده از pass برای تابع بدون کد


def p1():
    for i in range(1, 11, 1):
        print(i)

def p2():
    pass

p1()

در بلوکهای آن تابع می نویسیم pass یعنی ورودی و خروجی ندارد، بعدا میخوام این تابع رو کد نویسی کنم. حتما تورفتگی رو رعایت کنید.

پروژه ۲: محاسبه فاکتوریل

برنامه ای بنویسید که توسط زیر برنامه عددی را دریافت کرده، فاکتوریل آنرا محاسبه و نمایش دهد.


def p1():
    n = int(input("adadi ra vared konid:"))
    f = 1
    for i in range(1, n+1, 1):
        f = f * i
    print(f)

p1()

توضیح: این محاسبه مقدار فاکتوریل ۳ است. به این ترتیب می‌نویسیم:

۳! = ۳ × ۲ × ۱ = ۶

این محاسبه نشان می‌دهد که تعداد حالت‌هایی که ارقام ۱, ۲, ۳ می توانند جابجا شوند (جایگشت داشته باشند) تا یک عدد سه رقمی ایجاد کنند برابر است با ۶.

نکته: اگر در مسئله بالا تکرار مجاز باشد، تعداد حالاتی که می‌توان یک عدد سه رقمی با ارقام ۱ و ۲ و ۳ ساخت، طبق اصل ضرب برابر است با:

۳ × ۳ × ۳ = ۲۷

افزودن ورودی (پارامتر) به زیربرنامه

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

انواع ارسال داده ها به زیربرنامه:

  1. اجباری: یعنی باید ارسال شوند وگرنه خطا میدهد و اجرا نمی شود.
  2. اختیاری: یعنی یه مقدار پیش فرض در نظر می گیریم. درهنگام تعریف زیر برنامه یه مقدار اولیه به پارامتر بدهیم اگر اون پارامتر ارسال نشود اون مقدار پیش فرض جایگزین می شود.
  3. تاپل
  4. دیکشنری

۱- حالت اجباری پارامتر

در این حالت باید هنگام فراخوانی تابع، مقدار پارامتر را ارسال کنیم وگرنه خطا دریافت می‌کنیم.

مثال اشتباه (خطا):


def p1(n):
    print(n)

p1() # خطا! آرگومان n ارسال نشده

در این حالت به ما خطا می دهد و می گوید شما آرگومان n رو ارسال نکردید چون اینجا حالت اجباری است.

مثال صحیح:


def p1(n):
    print(n)

p1(5)

خروجی:
۵

مثال اشتباه دیگر:


def p1(n):
    print(n)

p1(5, 7) # خطا! دو آرگومان ارسال شده درحالیکه تابع یک پارامتر دارد

خطا، چون من دو آرگومان p1(5,7) ارسال کردم در حالیکه زیربرنامه من فقط یک پارامتر دارد def p1(n):

نکته مهم: تعداد پارامتر و آرگومان باید یکی باشد.

مثال با رشته:


def p1(n):
    print(n)

p1("password")

خروجی:
password

مثال با دو پارامتر اجباری:


def p1(n, m):
    print(n, m)

p1(5, 7)

خروجی:
۵ ۷

۲- حالت اختیاری پارامتر

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

مثال ۱: ارسال مقدار جدید (اولویت با مقدار ارسالی)


def p1(n, m=10):
    print(n, m)

p1(5, 7)

خروجی:
۵ ۷

مقدار پیش‌فرض ۱۰ است، اما چون در فراخوانی مقدار ۷ ارسال شده، اولویت با مقدار ارسالی است.

مثال ۲: استفاده از مقدار پیش‌فرض


def p1(n, m=10):
    print(n, m)

p1(5)

خروجی:
۵ ۱۰

چون مقدار m ارسال نشده، از مقدار پیش‌فرض ۱۰ استفاده می‌شود.

۳- حالت تاپل پارامتر (*args)

با استفاده از یک ستاره (*) قبل از نام پارامتر، می‌توانیم تعداد دلخواهی آرگومان دریافت کنیم. این آرگومان‌ها به صورت تاپل ذخیره می‌شوند.

مثال ۱: بدون ارسال آرگومان اضافی


def p1(n, *m):
    print(n)
    print(m)

p1(5)

خروجی:
۵
() # تاپل خالی

مثال ۲: ارسال چندین آرگومان


def p1(n, *m):
    print(n)
    print(m)

p1(5, 7, 8, 9, 10)

خروجی:
۵
(۷, ۸, ۹, ۱۰) # تاپل شامل مقادیر اضافی

۴- حالت دیکشنری پارامتر (**kwargs)

با استفاده از دو ستاره (**) قبل از نام پارامتر، می‌توانیم آرگومان‌های کلید-مقدار دلخواهی دریافت کنیم. این آرگومان‌ها به صورت دیکشنری ذخیره می‌شوند.


def p1(n, *m, **k):
    print(n)
    print(m)
    print(k)

p1(5, 7, 8, 9, name='sara', family='monfared')

خروجی:
۵
(۷, ۸, ۹)
{'name': 'sara', 'family': 'monfared'}

نکته: حالت دیکشنری داده اختیاری و دلخواه است، می‌توانید هر چندتا داده که خواستید ارسال کنید ولی به صورت کلید-مقدار است. یعنی نمی‌توانید فقط مقدار بدهید.

📚 خلاصه انواع پارامترها

پارامتر اجباری

def func(x):

باید حتما ارسال شود

پارامتر اختیاری

def func(x=10):

مقدار پیش‌فرض دارد

پارامتر تاپل (*args)

def func(*args):

تعداد دلخواه آرگومان

پارامتر دیکشنری (**kwargs)

def func(**kwargs):

کلید-مقدار دلخواه

۱۰ پروژه پایتون برای انواع داده در زیربرنامه

تمرین عملی انواع پارامترها در توابع پایتون

۱

محاسبه میانگین اعداد

📝 صورت مسئله:

تابعی بنویسید که با استفاده از پارامترهای اجباری، میانگین سه عدد را محاسبه کند.

🎯 خروجی مورد انتظار:

میانگین اعداد ۱۰، ۲۰ و ۳۰: ۲۰٫۰
میانگین اعداد ۵، ۱۵ و ۲۵: ۱۵٫۰


def calculate_average(num1, num2, num3):
    return (num1 + num2 + num3) / 3

# فراخوانی تابع
result1 = calculate_average(10, 20, 30)
result2 = calculate_average(5, 15, 25)

print("میانگین اعداد ۱۰، ۲۰ و ۳۰:", result1)
print("میانگین اعداد ۵، ۱۵ و ۲۵:", result2)

۲

ماشین حساب با پارامتر اختیاری

📝 صورت مسئله:

تابعی بنویسید که دو عدد و یک عملگر (با مقدار پیش‌فرض ‘+’) دریافت کند و عملیات ریاضی را انجام دهد.

🎯 خروجی مورد انتظار:

۱۵ + ۳ = ۱۸
۱۵ – ۳ = ۱۲
۱۵ * ۳ = ۴۵
۱۵ / ۳ = ۵٫۰


def calculator(a, b, operator='+'):
    if operator == '+':
        return a + b
    elif operator == '-':
        return a - b
    elif operator == '*':
        return a * b
    elif operator == '/':
        return a / b

# فراخوانی تابع
print("15 + 3 =", calculator(15, 3))
print("15 - 3 =", calculator(15, 3, '-'))
print("15 * 3 =", calculator(15, 3, '*'))
print("15 / 3 =", calculator(15, 3, '/'))

۳

جمع اعداد با پارامتر تاپل (*args)

📝 صورت مسئله:

تابعی بنویسید که بتواند هر تعداد عدد را دریافت کرده و مجموع آن‌ها را محاسبه کند.

🎯 خروجی مورد انتظار:

مجموع ۱، ۲، ۳: ۶
مجموع ۱۰، ۲۰، ۳۰، ۴۰: ۱۰۰
مجموع اعداد ۵: ۵


def sum_numbers(*args):
    total = 0
    for num in args:
        total += num
    return total

# فراخوانی تابع با تعداد مختلف آرگومان
print("مجموع ۱، ۲، ۳:", sum_numbers(1, 2, 3))
print("مجموع ۱۰، ۲۰، ۳۰، ۴۰:", sum_numbers(10, 20, 30, 40))
print("مجموع اعداد ۵:", sum_numbers(5))

۴

ثبت اطلاعات دانشجو با پارامتر دیکشنری (**kwargs)

📝 صورت مسئله:

تابعی بنویسید که اطلاعات دانشجو را به صورت دیکشنری دریافت کرده و نمایش دهد.

🎯 خروجی مورد انتظار:

اطلاعات دانشجو:
نام: علی
نام خانوادگی: احمدی
سن: ۲۰
معدل: ۱۸٫۵


def register_student(**student_info):
    print("اطلاعات دانشجو:")
    for key, value in student_info.items():
        print(f" {key}: {value}")

# فراخوانی تابع
register_student(
    name="علی",
    family="احمدی",
    age=20,
    average=18.5
)

۵

تبدیل واحد دما

📝 صورت مسئله:

تابعی بنویسید که دما را از سلسیوس به فارنهایت تبدیل کند (با پارامتر اجباری).

🎯 خروجی مورد انتظار:

۰°C = 32°F
۱۰۰°C = 212°F
۳۷°C = 98.6°F


def celsius_to_fahrenheit(celsius):
    fahrenheit = (celsius * 9/5) + 32
    return round(fahrenheit, 1)

# فراخوانی تابع
temps = [0, 100, 37]
for temp in temps:
    result = celsius_to_fahrenheit(temp)
    print(f"{temp}°C = {result}°F")

۶

پیام خوشامدگویی با پارامتر اختیاری

📝 صورت مسئله:

تابعی بنویسید که نام کاربر را دریافت کند و پیام خوشامدگویی بدهد (زمان پیش‌فرض = صبح).

🎯 خروجی مورد انتظار:

صبح بخیر، علی!
عصر بخیر، سارا!
شب بخیر، محمد!


def greet(name, time="صبح"):
    greetings = {
        "صبح": "صبح بخیر",
        "عصر": "عصر بخیر",
        "شب": "شب بخیر"
    }
    return f"{greetings[time]}، {name}!"

# فراخوانی تابع
print(greet("علی"))
print(greet("سارا", "عصر"))
print(greet("محمد", "شب"))

۷

پیدا کردن بزرگترین عدد با *args

📝 صورت مسئله:

تابعی بنویسید که هر تعداد عدد دریافت کرده و بزرگترین آن‌ها را پیدا کند.

🎯 خروجی مورد انتظار:

بزرگترین عدد بین ۱، ۵، ۳: ۵
بزرگترین عدد بین ۱۰، ۲۰، ۳۰، ۴۰، ۲۵: ۴۰
بزرگترین عدد بین ۷: ۷


def find_max(*numbers):
    if not numbers:
        return None
    max_num = numbers[0]
    for num in numbers:
        if num > max_num:
            max_num = num
    return max_num

# فراخوانی تابع
print("بزرگترین عدد بین ۱، ۵، ۳:", find_max(1, 5, 3))
print("بزرگترین عدد بین ۱۰، ۲۰، ۳۰، ۴۰، ۲۵:", find_max(10, 20, 30, 40, 25))
print("بزرگترین عدد بین ۷:", find_max(7))

۸

ایجاد پروفایل کاربر با **kwargs

📝 صورت مسئله:

تابعی بنویسید که اطلاعات پروفایل کاربر را دریافت و فرمت کند.

🎯 خروجی مورد انتظار:

پروفایل کاربر:
============
نام کاربری: ali_ahmadi
ایمیل: ali@example.com
سن: ۲۵
شهر: تهران
============


def create_profile(**user_data):
    print("پروفایل کاربر:")
    print("============")
    for key, value in user_data.items():
        print(f"{key}: {value}")
    print("============")

# فراخوانی تابع
create_profile(
    username="ali_ahmadi",
    email="ali@example.com",
    age=25,
    city="تهران"
)

۹

چک کردن عدد اول

📝 صورت مسئله:

تابعی بنویسید که بررسی کند آیا یک عدد اول است یا خیر.

🎯 خروجی مورد انتظار:

۷ عدد اول است
۱۰ عدد اول نیست
۱۳ عدد اول است
۱ عدد اول نیست

۱۰

پروژه: محاسبه فاکتوریل با زیربرنامه

📝 صورت مسئله:

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

🧮 مفهوم فاکتوریل چیست؟

فاکتوریل یک عدد صحیح مثبت (n!) حاصل ضرب تمام اعداد صحیح مثبت از ۱ تا آن عدد است.

n! = 1 × ۲ × ۳ × … × n

۳!
= ۳ × ۲ × ۱
= ۶

۴!
= ۴ × ۳ × ۲ × ۱
= ۲۴

۵!
= ۵ × ۴ × ۳ × ۲ × ۱
= ۱۲۰

⚠️ نکته: فاکتوریل عدد صفر برابر با ۱ تعریف می‌شود (۰! = ۱)

🎯 کاربردهای فاکتوریل در دنیای واقعی

🔢 ترکیبیات و احتمال

برای محاسبه تعداد حالات مختلف چیدن اشیا در کنار هم

📊 آمار

در توزیع‌های آماری و محاسبات مرتبط با احتمال

🧮 ریاضیات گسسته

در مبحث جایگشت‌ها و ترکیبات

📝 مثال کاربردی ساده:

مسئله: ۴ نفر می‌خواهند در یک صف بایستند. چند حالت مختلف برای ایستادن آن‌ها وجود دارد؟

پاسخ: ۴! = ۴ × ۳ × ۲ × ۱ = ۲۴ حالت

💻 کد پایتون محاسبه فاکتوریل:

def factorial(n):
    """
    تابع محاسبه فاکتوریل یک عدد
    ورودی: n (عدد صحیح)
    خروجی: فاکتوریل عدد n
    """
    
    if n == 0 or n == 1:
        return 1
    
    result = 1
    for i in range(2, n + 1):
        result *= i
    
    return result

# 📥 دریافت عدد از کاربر
try:
    num = int(input("لطفاً یک عدد صحیح وارد کنید: "))
    
    if num < 0:
        print("فاکتوریل برای اعداد منفی تعریف نشده است!")
    else:
        # 📤 فراخوانی تابع و نمایش نتیجه
        fact = factorial(num)
        print(f"فاکتوریل {num} برابر است با: {fact}")
        
except ValueError:
    print("لطفاً فقط عدد وارد کنید!")
      

🎯 نمونه اجرای برنامه:

ورودی ۱:

لطفاً یک عدد صحیح وارد کنید: ۵
خروجی: فاکتوریل ۵ برابر است با: ۱۲۰

ورودی ۲:

لطفاً یک عدد صحیح وارد کنید: ۰
خروجی: فاکتوریل ۰ برابر است با: ۱

ورودی ۳:

لطفاً یک عدد صحیح وارد کنید: -۳
خروجی: فاکتوریل برای اعداد منفی تعریف نشده است!

🔍 توضیح الگوریتم:

مراحل محاسبه فاکتوریل ۵:

  1. شروع با result = 1
  2. i = 2 → result = 1 × ۲ = ۲
  3. i = 3 → result = 2 × ۳ = ۶
  4. i = 4 → result = 6 × ۴ = ۲۴
  5. i = 5 → result = 24 × ۵ = ۱۲۰
محاسبه گرافیکی:
۵! = ۵ × ۴ × ۳ × ۲ × ۱
= ۱۲۰

🔹 پارامترها در توابع پایتون

پارامتر: مقداری است
که از برنامه اصلی به زیر برنامه ارسال می‌شود. این پارامتر را به ۴ روش می‌توان ارسال کردکه گفتیم.


🔸 انواع متغیر از نظر سطح دسترسی

۱٫ متغیر سراسری (Global)

در برنامه اصلی تعریف می‌شود، هم در برنامه اصلی و هم در زیربرنامه‌ها قابل دسترسی است.

def p1():    # خط ۱
    print(n)  # خط ۲

n = 10          # خط ۴
print(n)      # خط ۵
p1()          # خط ۶
print(n)      # خط ۷
            

📤 خروجی:

۱۰
۱۰
۱۰
            

📝 توضیح:
زیر برنامه ای به نام p1 داریم
در برنامه اصلی متغیری داریم به نام n=10 دارم
خط ۶ می گم p1 را فراخوانی کن
خط ۷ می گم n دوباره پرینت کن n
برنامه از خط ۴ شروع میشه، در خط ۴ میاد مقدار ۱۰ رو درون متغیر قرار میده و پرینت می کنه ۱۰ رو و سپس خط ۷
پس در زیر برنامه در حالت پیش فرض ، متغیرهای سراسری قابل دستیابی هستند.

۲٫ متغیر محلی (Local)

فقط داخل زیربرنامه تعریف می‌شود و فقط در زیربرنامه قابل دسترسی است.

def p1():    # خط ۱
    n = 40  # خط ۲
    print(n)  # خط ۳

n = 10          # خط ۵
print(n)      # خط ۶
p1()          # خط ۷
print(n)      # خط ۸
            

📤 خروجی:

۱۰
۴۰
۱۰
            

📝 توضیح:
در خط ۵ متغیر سراسری n=10 تعریف شده است.
در خط ۶ مقدار ۱۰ چاپ می‌شود.
در خط ۷ تابع p1 فراخوانی می‌شود که داخل آن یک متغیر محلی n=40 تعریف شده و چاپ می‌شود.
در خط ۸ دوباره متغیر سراسری n=10 چاپ می‌شود.


💡 پروژه‌های کاربردی

📊 پروژه ۱: محاسبه حقوق کارمندان با متغیر سراسری

محاسبه حقوق نهایی با احتساب مالیات ثابت به عنوان متغیر سراسری

# متغیر سراسری مالیات
tax_rate = 0.15

def calculate_salary(base_salary):
    # دسترسی به متغیر سراسری tax_rate
    tax_amount = base_salary * tax_rate
    net_salary = base_salary - tax_amount
    print(f"حقوق پایه: {base_salary}, مالیات: {tax_amount:.1f}, حقوق خالص: {net_salary:.1f}")
    return net_salary

# برنامه اصلی
print("محاسبه حقوق کارمندان:")
emp1 = calculate_salary(5000)
emp2 = calculate_salary(7500)
emp3 = calculate_salary(6000)
            

📌 خروجی پروژه:

محاسبه حقوق کارمندان:
حقوق پایه: ۵۰۰۰, مالیات: ۷۵۰٫۰, حقوق خالص: ۴۲۵۰٫۰
حقوق پایه: ۷۵۰۰, مالیات: ۱۱۲۵٫۰, حقوق خالص: ۶۳۷۵٫۰
حقوق پایه: ۶۰۰۰, مالیات: ۹۰۰٫۰, حقوق خالص: ۵۱۰۰٫۰
            

👥 پروژه ۲: شمارنده بازدید با متغیر محلی

شمارنده تعداد بازدید از یک صفحه با استفاده از متغیر محلی

def page_visitor():
    # متغیر محلی شمارنده
    visit_count = 0
    
    def increment():
        nonlocal visit_count
        visit_count += 1
        return visit_count
    
    return increment

# ایجاد شمارنده مجزا برای هر صفحه
page1_counter = page_visitor()
page2_counter = page_visitor()

print("بازدید صفحه ۱:", page1_counter())
print("بازدید صفحه ۱:", page1_counter())
print("بازدید صفحه ۲:", page2_counter())
            

📌 خروجی پروژه:

بازدید صفحه ۱: ۱
بازدید صفحه ۱: ۲
بازدید صفحه ۲: ۱
            

📦 پروژه ۳: مدیریت موجودی انبار

سیستم مدیریت موجودی با متغیر سراسری برای سقف مجاز و متغیر محلی برای هر محصول

# متغیر سراسری سقف مجاز انبار
MAX_CAPACITY = 1000

def manage_product(product_name):
    # متغیر محلی هر محصول
    stock = 0
    
    def add(quantity):
        nonlocal stock
        global MAX_CAPACITY
        if stock + quantity <= MAX_CAPACITY:
            stock += quantity
            print(f"{quantity} واحد به {product_name} اضافه شد. موجودی: {stock}")
        else:
            print(f"⚠️ خطا: ظرفیت انبار {MAX_CAPACITY} است")
        return stock
    return add

product1 = manage_product("لپ‌تاپ")
product2 = manage_product("موبایل")

product1(300)
product1(200)
product2(500)
product2(600)
            

📌 خروجی پروژه:

۳۰۰ واحد به لپ‌تاپ اضافه شد. موجودی: ۳۰۰
۲۰۰ واحد به لپ‌تاپ اضافه شد. موجودی: ۵۰۰
۵۰۰ واحد به موبایل اضافه شد. موجودی: ۵۰۰
⚠️ خطا: ظرفیت انبار ۱۰۰۰ است
            

🎮 پروژه ۴: سیستم امتیازدهی بازی

مدیریت امتیاز بازیکنان با متغیر سراسری برای سطح بازی

# متغیر سراسری سطح بازی
game_level = "آسان"

def create_player(name):
    score = 0
    
    def play(points):
        nonlocal score
        global game_level
        
        multiplier = {"آسان": ۱, "متوسط": ۱٫۵, "سخت": ۲}[game_level]
        earned_points = points * multiplier
        score += earned_points
        print(f"{name} در سطح {game_level}، {earned_points:.1f} امتیاز گرفت. کل: {score:.1f}")
        return score
    return play

player1 = create_player("علی")
player2 = create_player("سارا")

player1(10)
player2(15)
game_level = "متوسط"
player1(20)
player2(25)
            

📌 خروجی پروژه:

علی در سطح آسان، ۱۰٫۰ امتیاز گرفت. کل: ۱۰٫۰
سارا در سطح آسان، ۱۵٫۰ امتیاز گرفت. کل: ۱۵٫۰
علی در سطح متوسط، ۳۰٫۰ امتیاز گرفت. کل: ۴۰٫۰
سارا در سطح متوسط، ۳۷٫۵ امتیاز گرفت. کل: ۵۲٫۵
            

⚙️ پروژه ۵: تنظیمات سیستم

مدیریت تنظیمات سیستم با قابلیت بازنشانی به حالت پیش‌فرض

# متغیرهای سراسری تنظیمات پیش‌فرض
DEFAULT_THEME = "روشن"
DEFAULT_LANGUAGE = "فارسی"
DEFAULT_FONT_SIZE = 12

def user_settings(username):
    theme, language, font_size = DEFAULT_THEME, DEFAULT_LANGUAGE, DEFAULT_FONT_SIZE
    
    def change(setting, value):
        nonlocal theme, language, font_size
        if setting == "theme": theme = value
        elif setting == "language": language = value
        elif setting == "font_size": font_size = value
        print(f"{username}: پوسته={theme}, زبان={language}, قلم={font_size}")
    
    def reset():
        nonlocal theme, language, font_size
        theme, language, font_size = DEFAULT_THEME, DEFAULT_LANGUAGE, DEFAULT_FONT_SIZE
        print(f"{username}: بازنشانی شد")
    
    return change, reset

user1_set, user1_reset = user_settings("احمد")
user2_set, _ = user_settings("مریم")

user1_set("theme", "تاریک")
user1_set("font_size", 14)
user2_set("language", "انگلیسی")
user1_reset()
            

📌 خروجی پروژه:

احمد: پوسته=تاریک, زبان=فارسی, قلم=۱۴
احمد: پوسته=تاریک, زبان=فارسی, قلم=۱۴
مریم: پوسته=روشن, زبان=انگلیسی, قلم=۱۲
احمد: بازنشانی شد
            

پروژه متغیرهای سراسری و محلی در پایتون

✨ ۵ پروژه جدید کاربردی ✨

🏦
پروژه ۶: سیستم بانکداری با نرخ سود سراسری

مدیریت حساب‌های بانکی با نرخ سود ثابت سراسری و موجودی محلی هر حساب

# متغیر سراسری نرخ سود بانک
INTEREST_RATE = 0.12

def create_bank_account(account_holder, initial_balance):
    # متغیرهای محلی هر حساب
    balance = initial_balance
    transactions = []
    
    def deposit(amount):
        nonlocal balance
        balance += amount
        transactions.append(f"+{amount}")
        return f"واریز: {amount}, موجودی: {balance}"
    
    def withdraw(amount):
        nonlocal balance
        if balance >= amount:
            balance -= amount
            transactions.append(f"-{amount}")
            return f"برداشت: {amount}, موجودی: {balance}"
        return "موجودی کافی نیست"
    
    def calculate_yearly_interest():
        global INTEREST_RATE
        interest = balance * INTEREST_RATE
        return f"سود سالانه: {interest:.2f} (نرخ: {INTEREST_RATE*100}%)"
    
    def get_info():
        return f"حساب {account_holder}: موجودی={balance}, تراکنش‌ها={transactions}"
    
    return deposit, withdraw, calculate_yearly_interest, get_info

# ایجاد حساب‌های بانکی
acc1_deposit, acc1_withdraw, acc1_interest, acc1_info = create_bank_account("علی رضایی", ۵۰۰۰)
acc2_deposit, acc2_withdraw, acc2_interest, acc2_info = create_bank_account("سارا احمدی", ۸۰۰۰)

print(acc1_deposit(1500))
print(acc1_withdraw(2000))
print(acc1_interest())
print(acc2_deposit(3000))
print(acc2_interest())
print(acc1_info())
print(acc2_info())
            

📌 خروجی پروژه ۶:

واریز: ۱۵۰۰, موجودی: ۶۵۰۰
برداشت: ۲۰۰۰, موجودی: ۴۵۰۰
سود سالانه: ۵۴۰٫۰۰ (نرخ: ۱۲٫۰%)
واریز: ۳۰۰۰, موجودی: ۱۱۰۰۰
سود سالانه: ۱۳۲۰٫۰۰ (نرخ: ۱۲٫۰%)
حساب علی رضایی: موجودی=۴۵۰۰, تراکنش‌ها=['+۱۵۰۰', '-۲۰۰۰']
حساب سارا احمدی: موجودی=۱۱۰۰۰, تراکنش‌ها=['+۳۰۰۰']
            

🏨
پروژه ۷: سیستم رزرو هتل با قیمت‌پایه سراسری

مدیریت رزرو اتاق‌های هتل با قیمت پایه سراسری و تخفیف محلی

# متغیر سراسری قیمت پایه هر شب
BASE_PRICE_PER_NIGHT = 200

def hotel_reservation(guest_name):
    # متغیرهای محلی هر مهمان
    reservations = []
    total_nights = 0
    discount_rate = 0
    
    def book_room(room_type, nights):
        nonlocal total_nights
        global BASE_PRICE_PER_NIGHT
        
        room_prices = {"استاندارد": ۱, "لوکس": ۱٫۸, "سوئیت": ۲٫۵}
        price_multiplier = room_prices.get(room_type, 1)
        
        room_price = BASE_PRICE_PER_NIGHT * price_multiplier
        total_price = room_price * nights * (1 - discount_rate)
        
        reservations.append({
            "نوع": room_type,
            "شب": nights,
            "قیمت": total_price
        })
        total_nights += nights
        
        return f"اتاق {room_type} برای {nights} شب رزرو شد. قیمت: {total_price:.2f} $"
    
    def set_discount(rate):
        nonlocal discount_rate
        discount_rate = rate
        return f"تخفیف {rate*100}% برای {guest_name} اعمال شد"
    
    def get_total_bill():
        total = sum(r["قیمت"] for r in reservations)
        return f"صورتحساب {guest_name}: {total:.2f} $ برای {total_nights} شب"
    
    return book_room, set_discount, get_total_bill

# رزرو برای مهمان‌ها
guest1_book, guest1_discount, guest1_bill = hotel_reservation("محمد کریمی")
guest2_book, guest2_discount, guest2_bill = hotel_reservation("زهرا محمدی")

print(guest1_book("استاندارد", ۳))
print(guest1_discount(0.1))
print(guest1_book("لوکس", ۲))
print(guest2_book("سوئیت", ۴))
print(guest1_bill())
print(guest2_bill())
            

📌 خروجی پروژه ۷:

اتاق استاندارد برای ۳ شب رزرو شد. قیمت: ۶۰۰٫۰۰ $
تخفیف ۱۰٫۰% برای محمد کریمی اعمال شد
اتاق لوکس برای ۲ شب رزرو شد. قیمت: ۶۴۸٫۰۰ $
اتاق سوئیت برای ۴ شب رزرو شد. قیمت: ۲۰۰۰٫۰۰ $
صورتحساب محمد کریمی: ۱۲۴۸٫۰۰ $ برای ۵ شب
صورتحساب زهرا محمدی: ۲۰۰۰٫۰۰ $ برای ۴ شب
            

🛒
پروژه ۸: سیستم فروشگاه آنلاین با مالیات سراسری

مدیریت سبد خرید با نرخ مالیات ثابت سراسری و تخفیف‌های محلی

# متغیر سراسری نرخ مالیات
TAX_RATE = 0.09

def shopping_cart(customer_name):
    # متغیرهای محلی هر مشتری
    items = []
    subtotal = 0
    coupon_discount = 0
    
    def add_item(item_name, price, quantity=1):
        nonlocal subtotal
        total_price = price * quantity
        items.append({"نام": item_name, "تعداد": quantity, "قیمت": total_price})
        subtotal += total_price
        return f"{quantity} عدد {item_name} با قیمت {total_price} تومان اضافه شد"
    
    def apply_coupon(discount_percent):
        nonlocal coupon_discount
        coupon_discount = discount_percent
        return f"تخفیف {discount_percent*100}% اعمال شد"
    
    def calculate_total():
        global TAX_RATE
        discount_amount = subtotal * coupon_discount
        after_discount = subtotal - discount_amount
        tax = after_discount * TAX_RATE
        final_total = after_discount + tax
        
        return {
            "مشتری": customer_name,
            "زیرمجموع": subtotal,
            "تخفیف": discount_amount,
            "مالیات": tax,
            "قابل‌پرداخت": final_total
        }
    
    def show_cart():
        result = f"سبد خرید {customer_name}:\n"
        for item in items:
            result += f"  - {item['نام']}: {item['تعداد']} عدد = {item['قیمت']} تومان\n"
        return result
    
    return add_item, apply_coupon, calculate_total, show_cart

# ایجاد سبد خرید برای مشتریان
cart1_add, cart1_coupon, cart1_total, cart1_show = shopping_cart("احمد موسوی")
cart2_add, cart2_coupon, cart2_total, cart2_show = shopping_cart("فاطمه حسینی")

print(cart1_add("لپتاپ", ۲۵۰۰۰۰۰۰))
print(cart1_add("ماوس", ۵۰۰۰۰۰, ۲))
print(cart1_coupon(0.05))
print(cart2_add("هدفون", ۱۵۰۰۰۰۰))
print(cart1_show())
print("صورتحساب احمد:", cart1_total())
print("صورتحساب فاطمه:", cart2_total())
            

📌 خروجی پروژه ۸:

۱ عدد لپتاپ با قیمت ۲۵۰۰۰۰۰۰ تومان اضافه شد
۲ عدد ماوس با قیمت ۱۰۰۰۰۰۰ تومان اضافه شد
تخفیف ۵٫۰% اعمال شد
۱ عدد هدفون با قیمت ۱۵۰۰۰۰۰ تومان اضافه شد
سبد خرید احمد موسوی:
  - لپتاپ: ۱ عدد = ۲۵۰۰۰۰۰۰ تومان
  - ماوس: ۲ عدد = ۱۰۰۰۰۰۰ تومان

صورتحساب احمد: {'مشتری': 'احمد موسوی', 'زیرمجموع': ۲۶۰۰۰۰۰۰, 'تخفیف': ۱۳۰۰۰۰۰٫۰, 'مالیات': ۲۲۲۳۰۰۰٫۰, 'قابل‌پرداخت': ۲۶۹۲۳۰۰۰٫۰}
صورتحساب فاطمه: {'مشتری': 'فاطمه حسینی', 'زیرمجموع': ۱۵۰۰۰۰۰, 'تخفیف': ۰, 'مالیات': ۱۳۵۰۰۰٫۰, 'قابل‌پرداخت': ۱۶۳۵۰۰۰٫۰}
            

🎓
پروژه ۹: سیستم مدیریت دانشجو با معدل‌کل سراسری

مدیریت نمرات دانشجویان با معیار قبولی سراسری

# متغیر سراسری معدل قبولی
PASSING_GPA = 12.0

def student_record(student_name, student_id):
    # متغیرهای محلی هر دانشجو
    courses = {}
    total_points = 0
    total_credits = 0
    
    def add_grade(course_name, grade, credits):
        nonlocal total_points, total_credits
        courses[course_name] = {"نمره": grade, "واحد": credits}
        total_points += grade * credits
        total_credits += credits
        return f"درس {course_name} با نمره {grade} و {credits} واحد ثبت شد"
    
    def calculate_gpa():
        if total_credits == 0:
            return 0
        return total_points / total_credits
    
    def check_status():
        global PASSING_GPA
        gpa = calculate_gpa()
        status = "قبول" if gpa >= PASSING_GPA else "مشروط"
        return f"دانشجو: {student_name} ({student_id})\nمعدل: {gpa:.2f}\nوضعیت: {status}"
    
    def get_transcript():
        transcript = f"کارنامه {student_name}:\n"
        for course, info in courses.items():
            transcript += f"  {course}: {info['نمره']} ({info['واحد']} واحد)\n"
        return transcript
    
    return add_grade, check_status, get_transcript

# ثبت نمرات دانشجویان
student1_add, student1_status, student1_transcript = student_record("کیان رستمی", "۴۰۱۱۲۳")
student2_add, student2_status, student2_transcript = student_record("نرگس زمانی", "۴۰۱۴۵۶")

print(student1_add("ریاضی ۱", ۱۵, ۳))
print(student1_add("فیزیک ۱", ۱۴, ۳))
print(student1_add("برنامه‌نویسی", ۱۸, ۴))
print(student2_add("ریاضی ۱", ۱۰, ۳))
print(student2_add("معادلات", ۸, ۳))
print(student1_transcript())
print(student1_status())
print(student2_status())
            

📌 خروجی پروژه ۹:

درس ریاضی ۱ با نمره ۱۵ و ۳ واحد ثبت شد
درس فیزیک ۱ با نمره ۱۴ و ۳ واحد ثبت شد
درس برنامه‌نویسی با نمره ۱۸ و ۴ واحد ثبت شد
درس ریاضی ۱ با نمره ۱۰ و ۳ واحد ثبت شد
درس معادلات با نمره ۸ و ۳ واحد ثبت شد
کارنامه کیان رستمی:
  ریاضی ۱: ۱۵ (۳ واحد)
  فیزیک ۱: ۱۴ (۳ واحد)
  برنامه‌نویسی: ۱۸ (۴ واحد)

دانشجو: کیان رستمی (۴۰۱۱۲۳)
معدل: ۱۵٫۹۰
وضعیت: قبول
دانشجو: نرگس زمانی (۴۰۱۴۵۶)
معدل: ۹٫۰۰
وضعیت: مشروط
            

💪
پروژه ۱۰: سیستم باشگاه ورزشی با تعرفه سراسری

مدیریت عضویت اعضای باشگاه با تعرفه پایه سراسری و ساعات حضور محلی

# متغیر سراسری تعرفه باشگاه (تومان در ساعت)
BASE_RATE_PER_HOUR = 50000

def gym_membership(member_name, member_type):
    # متغیرهای محلی هر عضو
    total_hours = 0
    sessions = []
    membership_discount = {"نقره‌ای": ۰, "طلایی": ۰٫۱۵, "الماسی": ۰٫۲۵}.get(member_type, 0)
    
    def attend(date, hours):
        nonlocal total_hours
        global BASE_RATE_PER_HOUR
        
        total_hours += hours
        session_cost = hours * BASE_RATE_PER_HOUR * (1 - membership_discount)
        sessions.append({"تاریخ": date, "ساعت": hours, "هزینه": session_cost})
        
        return f"حضور در تاریخ {date}: {hours} ساعت (هزینه: {session_cost:,.0f} تومان)"
    
    def get_monthly_bill():
        total_cost = sum(s["هزینه"] for s in sessions)
        return f"صورتحساب ماهانه {member_name} (عضویت {member_type}):\n" \
               f"  مجموع ساعات: {total_hours} ساعت\n" \
               f"  مبلغ قابل پرداخت: {total_cost:,.0f} تومان\n" \
               f"  تخفیف اعمال شده: {membership_discount*100}%"
    
    def get_attendance_summary():
        summary = f"گزارش حضور {member_name}:\n"
        for session in sessions:
            summary += f"  {session['تاریخ']}: {session['ساعت']} ساعت\n"
        return summary
    
    return attend, get_monthly_bill, get_attendance_summary

# ثبت حضور اعضای باشگاه
member1_attend, member1_bill, member1_summary = gym_membership("امیر حسینی", "الماسی")
member2_attend, member2_bill, member2_summary = gym_membership("لیلا کریمی", "نقره‌ای")

print(member1_attend("1402/02/01", 2))
print(member1_attend("1402/02/03", 1.5))
print(member1_attend("1402/02/05", 2.5))
print(member2_attend("1402/02/02", 1))
print(member2_attend("1402/02/04", 2))
print(member1_summary())
print(member1_bill())
print(member2_bill())
            

📌 خروجی پروژه ۱۰:

حضور در تاریخ ۱۴۰۲/۰۲/۰۱: ۲ ساعت (هزینه: ۷۵,۰۰۰ تومان)
حضور در تاریخ ۱۴۰۲/۰۲/۰۳: ۱٫۵ ساعت (هزینه: ۵۶,۲۵۰ تومان)
حضور در تاریخ ۱۴۰۲/۰۲/۰۵: ۲٫۵ ساعت (هزینه: ۹۳,۷۵۰ تومان)
حضور در تاریخ ۱۴۰۲/۰۲/۰۲: ۱ ساعت (هزینه: ۵۰,۰۰۰ تومان)
حضور در تاریخ ۱۴۰۲/۰۲/۰۴: ۲ ساعت (هزینه: ۱۰۰,۰۰۰ تومان)
گزارش حضور امیر حسینی:
  ۱۴۰۲/۰۲/۰۱: ۲ ساعت
  ۱۴۰۲/۰۲/۰۳: ۱٫۵ ساعت
  ۱۴۰۲/۰۲/۰۵: ۲٫۵ ساعت

صورتحساب ماهانه امیر حسینی (عضویت الماسی):
  مجموع ساعات: ۶٫۰ ساعت
  مبلغ قابل پرداخت: ۲۲۵,۰۰۰ تومان
  تخفیف اعمال شده: ۲۵٫۰%
صورتحساب ماهانه لیلا کریمی (عضویت نقره‌ای):
  مجموع ساعات: ۳ ساعت
  مبلغ قابل پرداخت: ۱۵۰,۰۰۰ تومان
  تخفیف اعمال شده: ۰%
            

🚀 پروژه‌های پیشرفته پایتون

متغیرهای سراسری (Global) و محلی (Local) در عمل

🏦 پروژه ۱۱
🏥 پروژه ۱۲
✈️ پروژه ۱۳
🎮 پروژه ۱۴
📚 پروژه ۱۵

🚗

پروژه ۱۱: سیستم کرایه ماشین با نرخ روزانه سراسری

مدیریت ناوگان کرایه ماشین با نرخ پایه سراسری و تخفیف‌های ویژه مشتریان

# متغیر سراسری نرخ کرایه روزانه
DAILY_RATE = 800000  # تومان

def car_rental_system(customer_name, customer_type="عادی"):
    # متغیرهای محلی هر مشتری
    rentals = []
    total_days = 0
    loyalty_points = 0
    
    # تخفیف براساس نوع مشتری
    discount_rates = {
        "عادی": ۰,
        "نقره‌ای": ۰٫۱,
        "طلایی": ۰٫۲,
        "الماسی": ۰٫۳
    }
    customer_discount = discount_rates.get(customer_type, 0)
    
    def rent_car(car_model, days):
        nonlocal total_days, loyalty_points
        global DAILY_RATE
        
        # قیمت‌گذاری براساس مدل ماشین
        car_multiplier = {
            "پراید": ۱,
            "پژو": ۱٫۳,
            "سمند": ۱٫۵,
            "دنا": ۱٫۸,
            "تارا": ۲
        }.get(car_model, 1)
        
        base_price = DAILY_RATE * car_multiplier * days
        discount_amount = base_price * customer_discount
        final_price = base_price - discount_amount
        
        # محاسبه امتیاز وفاداری
        earned_points = days * 10
        loyalty_points += earned_points
        
        rental_info = {
            "ماشین": car_model,
            "روز": days,
            "قیمت_پایه": base_price,
            "تخفیف": discount_amount,
            "قیمت_نهایی": final_price,
            "امتیاز": earned_points
        }
        rentals.append(rental_info)
        total_days += days
        
        return (f"✅ ماشین {car_model} برای {days} روز کرایه شد\n"
                f"   قیمت پایه: {base_price:,.0f} تومان\n"
                f"   تخفیف {customer_discount*100}%: {discount_amount:,.0f} تومان\n"
                f"   قیمت نهایی: {final_price:,.0f} تومان\n"
                f"   امتیاز کسب شده: {earned_points}")
    
    def use_loyalty_points(points_to_use):
        nonlocal loyalty_points
        if loyalty_points >= points_to_use:
            loyalty_points -= points_to_use
            discount_value = points_to_use * 1000  # هر امتیاز = ۱۰۰۰ تومان
            return f"🎁 {points_to_use} امتیاز استفاده شد. معادل {discount_value:,.0f} تومان تخفیف"
        return f"❌ امتیاز کافی نیست. موجودی: {loyalty_points}"
    
    def get_customer_summary():
        summary = f"📋 گزارش مشتری: {customer_name} (نوع: {customer_type})\n"
        summary += f"   مجموع روزهای کرایه: {total_days}\n"
        summary += f"   امتیاز وفاداری: {loyalty_points}\n"
        summary += "   تاریخچه کرایه:\n"
        
        total_cost = 0
        for r in rentals:
            summary += f"     - {r['ماشین']}: {r['روز']} روز = {r['قیمت_نهایی']:,.۰f} تومان\n"
            total_cost += r['قیمت_نهایی']
        
        summary += f"   جمع کل پرداختی: {total_cost:,.0f} تومان"
        return summary
    
    return rent_car, use_loyalty_points, get_customer_summary

# اجرای پروژه
print("🟢"*۵۰)
print("🚗 شروع پروژه سیستم کرایه ماشین")
print("🟢"*۵۰)

# مشتری ۱: علی (طلایی)
rent1, points1, summary1 = car_rental_system("علی محمدی", "طلایی")
print("\n🔸 مشتری ۱ (علی - طلایی):")
print(rent1("دنا", ۳))
print(rent1("تارا", ۲))
print(points1(50))
print(summary1())

# مشتری ۲: سارا (عادی)
rent2, points2, summary2 = car_rental_system("سارا احمدی", "عادی")
print("\n🔸 مشتری ۲ (سارا - عادی):")
print(rent2("پراید", ۵))
print(summary2())
        

📊 خروجی پروژه ۱۱:

🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢
🚗 شروع پروژه سیستم کرایه ماشین
🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢🟢

🔸 مشتری ۱ (علی - طلایی):
✅ ماشین دنا برای ۳ روز کرایه شد
   قیمت پایه: ۴,۳۲۰,۰۰۰ تومان
   تخفیف ۲۰%: ۸۶۴,۰۰۰ تومان
   قیمت نهایی: ۳,۴۵۶,۰۰۰ تومان
   امتیاز کسب شده: ۳۰

✅ ماشین تارا برای ۲ روز کرایه شد
   قیمت پایه: ۳,۲۰۰,۰۰۰ تومان
   تخفیف ۲۰%: ۶۴۰,۰۰۰ تومان
   قیمت نهایی: ۲,۵۶۰,۰۰۰ تومان
   امتیاز کسب شده: ۲۰

🎁 ۵۰ امتیاز استفاده شد. معادل ۵۰,۰۰۰ تومان تخفیف

📋 گزارش مشتری: علی محمدی (نوع: طلایی)
   مجموع روزهای کرایه: ۵
   امتیاز وفاداری: ۰
   تاریخچه کرایه:
     - دنا: ۳ روز = ۳,۴۵۶,۰۰۰ تومان
     - تارا: ۲ روز = ۲,۵۶۰,۰۰۰ تومان
   جمع کل پرداختی: ۶,۰۱۶,۰۰۰ تومان

🔸 مشتری ۲ (سارا - عادی):
✅ ماشین پراید برای ۵ روز کرایه شد
   قیمت پایه: ۴,۰۰۰,۰۰۰ تومان
   تخفیف ۰%: ۰ تومان
   قیمت نهایی: ۴,۰۰۰,۰۰۰ تومان
   امتیاز کسب شده: ۵۰

📋 گزارش مشتری: سارا احمدی (نوع: عادی)
   مجموع روزهای کرایه: ۵
   امتیاز وفاداری: ۵۰
   تاریخچه کرایه:
     - پراید: ۵ روز = ۴,۰۰۰,۰۰۰ تومان
   جمع کل پرداختی: ۴,۰۰۰,۰۰۰ تومان
        

🏥

پروژه ۱۲: سیستم نوبت‌دهی بیمارستان با تعرفه ویزیت سراسری

مدیریت نوبت‌های پزشکی با تعرفه پایه و بیمه‌های مختلف

# متغیر سراسری تعرفه ویزیت
BASE_VISIT_FEE = 250000  # تومان

def hospital_appointment_system(patient_name, insurance_type="آزاد"):
    # متغیرهای محلی هر بیمار
    appointments = []
    total_cost = 0
    medical_history = []
    
    # پوشش بیمه
    insurance_coverage = {
        "آزاد": ۰,
        "تامین اجتماعی": ۰٫۷,
        "سلامت": ۰٫۸,
        "نیروهای مسلح": ۰٫۹
    }
    coverage = insurance_coverage.get(insurance_type, 0)
    
    def book_appointment(doctor_name, specialty, date, is_specialist=False):
        nonlocal total_cost
        global BASE_VISIT_FEE
        
        # تعرفه براساس تخصص
        specialty_multiplier = {
            "عمومی": ۱,
            "متخصص اطفال": ۱٫۵,
            "متخصص قلب": ۲٫۵,
            "متخصص مغز و اعصاب": ۳,
            "جراح": ۲
        }.get(specialty, 1)
        
        if is_specialist:
            specialty_multiplier *= 1.5
        
        visit_fee = BASE_VISIT_FEE * specialty_multiplier
        patient_payment = visit_fee * (1 - coverage)
        
        appointment = {
            "پزشک": doctor_name,
            "تخصص": specialty,
            "تاریخ": date,
            "هزینه_کل": visit_fee,
            "پوشش_بیمه": visit_fee * coverage,
            "پرداخت_بیمار": patient_payment
        }
        
        appointments.append(appointment)
        total_cost += patient_payment
        medical_history.append(f"{date}: {doctor_name} ({specialty})")
        
        return (f"📅 نوبت برای {date} با دکتر {doctor_name} ثبت شد\n"
                f"   هزینه ویزیت: {visit_fee:,.0f} تومان\n"
                f"   سهم بیمه ({insurance_type} - {coverage*100}%): {visit_fee * coverage:,.0f} تومان\n"
                f"   پرداخت بیمار: {patient_payment:,.0f} تومان")
    
    def get_prescription(medicines):
        # محاسبه هزینه دارو با تخفیف بیمه
        total_medicine_cost = 0
        prescription_text = "💊 نسخه تجویزی:\n"
        
        for med, price in medicines.items():
            patient_share = price * (1 - coverage/2)  # بیمه ۵۰% داروها را پوشش می‌دهد
            total_medicine_cost += patient_share
            prescription_text += f"   • {med}: {price:,.0f} تومان (سهم بیمار: {patient_share:,.0f} تومان)\n"
        
        prescription_text += f"   جمع هزینه دارو: {total_medicine_cost:,.0f} تومان"
        return prescription_text
    
    def get_medical_report():
        report = f"🏥 گزارش پزشکی {patient_name}\n"
        report += f"   نوع بیمه: {insurance_type} (پوشش {coverage*100}%)\n"
        report += "   سوابق نوبت‌ها:\n"
        
        for h in medical_history:
            report += f"     • {h}\n"
        
        report += f"   جمع هزینه‌های پرداختی: {total_cost:,.0f} تومان"
        return report
    
    return book_appointment, get_prescription, get_medical_report

# اجرای پروژه
print("\n🟡"*۵۰)
print("🏥 شروع پروژه سیستم نوبت‌دهی بیمارستان")
print("🟡"*۵۰)

# بیمار ۱: رضا (تامین اجتماعی)
book1, prescription1, report1 = hospital_appointment_system("رضا کریمی", "تامین اجتماعی")
print("\n🔸 بیمار ۱ (رضا - تامین اجتماعی):")
print(book1("دکتر احمدی", "متخصص قلب", "۱۴۰۲/۰۳/۱۵", True))
print(book1("دکتر محمدی", "عمومی", "۱۴۰۲/۰۳/۲۰"))
print(prescription1({"آسپرین": ۵۰۰۰۰, "آتورواستاتین": ۱۲۰۰۰۰}))
print(report1())

# بیمار ۲: مریم (آزاد)
book2, prescription2, report2 = hospital_appointment_system("مریم حسینی", "آزاد")
print("\n🔸 بیمار ۲ (مریم - آزاد):")
print(book2("دکتر رضایی", "متخصص اطفال", "۱۴۰۲/۰۳/۱۸"))
print(prescription2({"شربت سرفه": ۴۵۰۰۰, "استامینوفن": ۳۰۰۰۰}))
print(report2())
        

📊 خروجی پروژه ۱۲:

🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡
🏥 شروع پروژه سیستم نوبت‌دهی بیمارستان
🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡🟡

🔸 بیمار ۱ (رضا - تامین اجتماعی):
📅 نوبت برای ۱۴۰۲/۰۳/۱۵ با دکتر دکتر احمدی ثبت شد
   هزینه ویزیت: ۹۳۷,۵۰۰ تومان
   سهم بیمه (تامین اجتماعی - ۷۰%): ۶۵۶,۲۵۰ تومان
   پرداخت بیمار: ۲۸۱,۲۵۰ تومان

📅 نوبت برای ۱۴۰۲/۰۳/۲۰ با دکتر دکتر محمدی ثبت شد
   هزینه ویزیت: ۲۵۰,۰۰۰ تومان
   سهم بیمه (تامین اجتماعی - ۷۰%): ۱۷۵,۰۰۰ تومان
   پرداخت بیمار: ۷۵,۰۰۰ تومان

💊 نسخه تجویزی:
   • آسپرین: ۵۰,۰۰۰ تومان (سهم بیمار: ۳۲,۵۰۰ تومان)
   • آتورواستاتین: ۱۲۰,۰۰۰ تومان (سهم بیمار: ۷۸,۰۰۰ تومان)
   جمع هزینه دارو: ۱۱۰,۵۰۰ تومان

🏥 گزارش پزشکی رضا کریمی
   نوع بیمه: تامین اجتماعی (پوشش ۷۰%)
   سوابق نوبت‌ها:




















پروژه ۱: محاسبه حقوق کارمندان با متغیر سراسری

محاسبه حقوق نهایی با احتساب مالیات ثابت به عنوان متغیر سراسری

# متغیر سراسری مالیات
tax_rate = 0.15

def calculate_salary(base_salary):
    # دسترسی به متغیر سراسری tax_rate
    tax_amount = base_salary * tax_rate
    net_salary = base_salary - tax_amount
    print(f"حقوق پایه: {base_salary}, مالیات: {tax_amount}, حقوق خالص: {net_salary}")
    return net_salary

# برنامه اصلی
print("محاسبه حقوق کارمندان:")
emp1 = calculate_salary(5000)
emp2 = calculate_salary(7500)
emp3 = calculate_salary(6000)

خروجی:

محاسبه حقوق کارمندان:
حقوق پایه: ۵۰۰۰, مالیات: ۷۵۰٫۰, حقوق خالص: ۴۲۵۰٫۰
حقوق پایه: ۷۵۰۰, مالیات: ۱۱۲۵٫۰, حقوق خالص: ۶۳۷۵٫۰
حقوق پایه: ۶۰۰۰, مالیات: ۹۰۰٫۰, حقوق خالص: ۵۱۰۰٫۰

پروژه ۲: شمارنده بازدید با متغیر محلی

شمارنده تعداد بازدید از یک صفحه با استفاده از متغیر محلی

def page_visitor():
    # متغیر محلی شمارنده
    visit_count = 0
    
    def increment():
        nonlocal visit_count
        visit_count += 1
        return visit_count
    
    return increment

# ایجاد شمارنده مجزا برای هر صفحه
page1_counter = page_visitor()
page2_counter = page_visitor()

print("بازدید صفحه ۱:", page1_counter())
print("بازدید صفحه ۱:", page1_counter())
print("بازدید صفحه ۲:", page2_counter())

خروجی:

بازدید صفحه ۱: ۱
بازدید صفحه ۱: ۲
بازدید صفحه ۲: ۱

پروژه ۳: مدیریت موجودی انبار (ترکیبی از سراسری و محلی)

سیستم مدیریت موجودی با متغیر سراسری برای سقف مجاز و متغیر محلی برای هر محصول

# متغیر سراسری سقف مجاز انبار
MAX_CAPACITY = 1000

def manage_product(product_name):
    # متغیر محلی هر محصول
    stock = 0
    
    def add(quantity):
        nonlocal stock
        global MAX_CAPACITY
        if stock + quantity <= MAX_CAPACITY:
            stock += quantity
            print(f"{quantity} واحد به {product_name} اضافه شد. موجودی: {stock}")
        else:
            print(f"خطا: ظرفیت انبار {MAX_CAPACITY} است")
        return stock
    return add

# مدیریت محصولات مختلف
product1 = manage_product("لپ‌تاپ")
product2 = manage_product("موبایل")

product1(300)
product1(200)
product2(500)
product2(600)  # این خطا می‌دهد چون از سقف مجاز عبور می‌کند

خروجی:

۳۰۰ واحد به لپ‌تاپ اضافه شد. موجودی: ۳۰۰
۲۰۰ واحد به لپ‌تاپ اضافه شد. موجودی: ۵۰۰
۵۰۰ واحد به موبایل اضافه شد. موجودی: ۵۰۰
خطا: ظرفیت انبار ۱۰۰۰ است

پروژه ۴: سیستم امتیازدهی بازی

مدیریت امتیاز بازیکنان با متغیر سراسری برای سطح بازی و متغیر محلی برای امتیاز هر بازیکن

# متغیر سراسری سطح بازی
game_level = "آسان"

def create_player(name):
    # متغیر محلی امتیاز بازیکن
    score = 0
    
    def play(points):
        nonlocal score
        global game_level
        
        if game_level == "آسان":
            multiplier = 1
        elif game_level == "متوسط":
            multiplier = 1.5
        else:
            multiplier = 2
            
        earned_points = points * multiplier
        score += earned_points
        print(f"{name} در سطح {game_level}، {earned_points} امتیاز کسب کرد. کل امتیاز: {score}")
        return score
    return play

# ایجاد بازیکنان
player1 = create_player("علی")
player2 = create_player("سارا")

player1(10)
player2(15)

# تغییر سطح بازی
game_level = "متوسط"
player1(20)
player2(25)

خروجی:

علی در سطح آسان، ۱۰٫۰ امتیاز کسب کرد. کل امتیاز: ۱۰٫۰
سارا در سطح آسان، ۱۵٫۰ امتیاز کسب کرد. کل امتیاز: ۱۵٫۰
علی در سطح متوسط، ۳۰٫۰ امتیاز کسب کرد. کل امتیاز: ۴۰٫۰
سارا در سطح متوسط، ۳۷٫۵ امتیاز کسب کرد. کل امتیاز: ۵۲٫۵

پروژه ۵: تنظیمات سیستم با متغیر سراسری و محلی

مدیریت تنظیمات سیستم با قابلیت بازنشانی به حالت پیش‌فرض

# متغیرهای سراسری تنظیمات پیش‌فرض
DEFAULT_THEME = "روشن"
DEFAULT_LANGUAGE = "فارسی"
DEFAULT_FONT_SIZE = 12

def user_settings(username):
    # متغیرهای محلی هر کاربر
    theme = DEFAULT_THEME
    language = DEFAULT_LANGUAGE
    font_size = DEFAULT_FONT_SIZE
    
    def change_setting(setting_name, value):
        nonlocal theme, language, font_size
        global DEFAULT_THEME, DEFAULT_LANGUAGE, DEFAULT_FONT_SIZE
        
        if setting_name == "theme":
            theme = value
        elif setting_name == "language":
            language = value
        elif setting_name == "font_size":
            font_size = value
            
        print(f"{username}: پوسته={theme}, زبان={language}, اندازه قلم={font_size}")
    
    def reset_to_default():
        nonlocal theme, language, font_size
        theme = DEFAULT_THEME
        language = DEFAULT_LANGUAGE
        font_size = DEFAULT_FONT_SIZE
        print(f"{username}: تنظیمات به حالت پیش‌فرض بازگشت")
    
    return change_setting, reset_to_default

# ایجاد تنظیمات برای دو کاربر
user1_set, user1_reset = user_settings("احمد")
user2_set, user2_reset = user_settings("مریم")

user1_set("theme", "تاریک")
user1_set("font_size", 14)
user2_set("language", "انگلیسی")
user1_reset()

خروجی:

احمد: پوسته=تاریک, زبان=فارسی, اندازه قلم=۱۴
احمد: پوسته=تاریک, زبان=فارسی, اندازه قلم=۱۴
مریم: پوسته=روشن, زبان=انگلیسی, اندازه قلم=۱۲
احمد: تنظیمات به حالت پیش‌فرض بازگشت


📚 صفحه اصلی جزوه


دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *