ساختارهای شرطی
برنامهنویسی بدون تصمیمگیری معنا ندارد. در این فصل با ساختارهای شرطی پایتون آشنا میشویم: if، elif، else و حتی match-case جدید.
برنامهنویسی بدون تصمیمگیری معنا ندارد. در این فصل با ساختارهای شرطی پایتون آشنا میشویم: if، elif، else و حتی match-case جدید.
if ساده
age = 18
if age >= 18:
print("شما بزرگسال هستید")
print("میتوانید رای بدهید")
print("این خط همیشه چاپ میشود")
پایتون از {} یا کلمه end استفاده نمیکند. بلوک کد با تورفتگی مشخص میشود. استاندارد: ۴ فاصله (نه tab).
if-else
age = int(input("سن: "))
if age >= 18:
print("بزرگسال")
else:
print("صغیر")
# مثال دیگر: اعداد زوج/فرد
num = int(input("یک عدد: "))
if num % 2 == 0:
print(f"{num} زوج است")
else:
print(f"{num} فرد است")
if-elif-else
برای چند شرط متوالی:
score = int(input("نمره: "))
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
else:
grade = "F"
print(f"نمره شما: {grade}")
بهمحض اینکه یکی از شرطها True شود، بقیه بررسی نمیشوند. پس ترتیب شرطها مهم است: از خاصترین به عامترین.
شرط تو در تو
age = 25
has_license = True
if age >= 18:
if has_license:
print("میتوانید رانندگی کنید")
else:
print("ابتدا گواهینامه بگیرید")
else:
print("سن کافی ندارید")
# روش بهتر: ترکیب شرطها
if age >= 18 and has_license:
print("میتوانید رانندگی کنید")
elif age >= 18:
print("ابتدا گواهینامه بگیرید")
else:
print("سن کافی ندارید")
مقادیر Truthy و Falsy
در پایتون هر مقداری میتواند بهعنوان شرط استفاده شود. این مقادیر Falsy هستند (یعنی False محسوب میشوند):
if False: ...
if None: ...
if 0: ...
if 0.0: ...
if "": ... # رشته خالی
if []: ... # لیست خالی
if {}: ... # دیکشنری خالی
if (): ... # تاپل خالی
if set(): ... # ست خالی
# همه چیز دیگر Truthy است
if 1: ... # True
if -1: ... # True (مثبت یا منفی، فقط 0 نیست)
if "hi": ... # True
if [0]: ... # True (لیست با یک عضو)
if "False": ... # True! (رشتهای که "False" است نه bool)
کاربرد عملی
name = input("نام: ")
# روش غیرحرفهای
if name == "":
print("نامی وارد نکردید")
# روش Pythonic
if not name:
print("نامی وارد نکردید")
# بررسی لیست
items = []
if items:
print(f"تعداد: {len(items)}")
else:
print("لیست خالی است")
# مقدار پیشفرض با or
username = input("نام کاربری: ") or "مهمان"
print(f"خوش آمدید {username}")
شرط تکخطی (Ternary)
برای شرطهای ساده، میتوانید همه چیز را در یک خط بنویسید:
age = 20
# روش معمولی
if age >= 18:
status = "بزرگسال"
else:
status = "صغیر"
# روش ternary
status = "بزرگسال" if age >= 18 else "صغیر"
# مثالهای دیگر
max_value = a if a > b else b
discount = 0.2 if is_member else 0.0
message = f"سلام {name}" if name else "سلام مهمان"
print(status)
match-case (Python 3.10+)
در نسخههای جدید پایتون، match-case برای الگوهای پیچیده اضافه شد:
command = input("دستور: ").lower()
match command:
case "help" | "?":
print("راهنما...")
case "exit" | "quit":
print("خروج...")
case "list":
print("نمایش لیست...")
case _: # _ یعنی default
print("دستور ناشناس")
تطبیق ساختاری (Structural Matching)
def process_event(event):
match event:
case {"type": "login", "user": user}:
print(f"ورود کاربر: {user}")
case {"type": "logout", "user": user}:
print(f"خروج کاربر: {user}")
case {"type": "error", "code": int(code)} if code >= 500:
print(f"خطای سرور: {code}")
case _:
print("رویداد ناشناس")
process_event({"type": "login", "user": "ali"})
process_event({"type": "error", "code": 503})
مثالهای واقعی
سن قانونی
age = int(input("سن: "))
if age < 0:
print("سن نمیتواند منفی باشد")
elif age < 7:
print("کودک")
elif age < 18:
print("نوجوان")
elif age < 60:
print("بزرگسال")
else:
print("سالمند")
تخفیف فروشگاه
total = float(input("مبلغ خرید: "))
is_member = input("عضو هستید؟ (y/n): ").lower() == "y"
discount_rate = 0
if is_member:
if total >= 1_000_000:
discount_rate = 0.20
elif total >= 500_000:
discount_rate = 0.15
else:
discount_rate = 0.10
elif total >= 1_000_000:
discount_rate = 0.05
discount = total * discount_rate
final = total - discount
print(f"تخفیف: {discount:,.0f} تومان")
print(f"مبلغ نهایی: {final:,.0f} تومان")
حدس عدد
import random
secret = random.randint(1, 10)
guess = int(input("یک عدد بین ۱ تا ۱۰ حدس بزنید: "))
if guess == secret:
print("🎉 درست حدس زدید!")
elif abs(guess - secret) <= 2:
print(f"نزدیک بود! عدد {secret} بود")
else:
print(f"خیلی دور بود! عدد {secret} بود")
روز هفته
day = input("شماره روز (1-7): ")
match day:
case "1": print("شنبه")
case "2": print("یکشنبه")
case "3": print("دوشنبه")
case "4": print("سهشنبه")
case "5": print("چهارشنبه")
case "6": print("پنجشنبه")
case "7": print("جمعه")
case _: print("شماره نامعتبر")
تمرین فصل
سه عدد از کاربر بگیرید و بزرگترین آنها را چاپ کنید (بدون استفاده از max()).
سال میلادی را بگیرید و بگویید کبیسه است یا نه. سال کبیسه: بر ۴ بخشپذیر باشد، اما اگر بر ۱۰۰ بخشپذیر است باید بر ۴۰۰ هم بخشپذیر باشد.
قد (متر) و وزن (کیلوگرم) را بگیرید، شاخص توده بدنی (وزن / قد²) را محاسبه و وضعیت را گزارش دهید: کموزن (<18.5)، نرمال (18.5-25)، اضافهوزن (25-30)، چاق (>30).
یک رمز عبور بگیرید و قدرت آن را با این معیارها بسنجید:
- طول حداقل ۸ کاراکتر
- شامل حرف بزرگ
- شامل عدد
بر اساس تعداد معیارهای پاس شده: ضعیف، متوسط، قوی.
جمعبندی
در این فصل یاد گرفتیم:
- ساختار
if،if-else،if-elif-else - تورفتگی صحیح در پایتون
- شرطهای تو در تو و راه سادهسازی آنها
- مفهوم Truthy و Falsy
- شرط تکخطی ternary
match-caseجدید پایتون 3.10+