Python Coding Academy
135 subscribers
7 photos
3 files
4 links
🐍 Learn Python. Build Skills. Create the Future.

📚 Python lessons from beginner to advanced
💻 Clear explanations & real-world examples
🚀 Learn to code. Learn to build.
Download Telegram
🐍 آموزش جامع Python — پست ۶۰
استفاده از not برای معکوس کردن شرط
با not می‌توانیم نتیجه یک شرط را معکوس کنیم.
🔹 مثال ساده
is_admin = False

if not is_admin:
print("Access denied")

چون:
is_admin → False
not False → True

پس شرط اجرا می‌شود.
🔹 مثال با مقایسه
age = 15

if not age >= 18:
print("You are a minor")

ابتدا:
age >= 18 → False
not False → True

🔹 not با پرانتز
می‌توانیم چند شرط را داخل پرانتز قرار دهیم و نتیجه کلی را معکوس کنیم:
age = 20
has_id = True

if not (age >= 18 and has_id):
print("Access denied")
else:
print("Access granted")

ابتدا:
age >= 18 and has_id
True and True → True

سپس:
not True → False

بنابراین else اجرا می‌شود.
🔹 ترکیب با and
is_logged_in = True
is_admin = False

if is_logged_in and not is_admin:
print("Normal user")

هر دو بخش شرط باید درست باشند.
⚠️ نکته مهم
پرانتز مشخص می‌کند not دقیقاً روی کدام عبارت اعمال شود:
not (A and B)

یعنی نتیجه کل (A and B) معکوس شود.
🧠 خلاصه
not True  → False
not False → True
not (A and B) → معکوس نتیجه A and B

🎯 تمرین
age = 16
has_id = True

if not (age >= 18 and has_id):
print("Access denied")
else:
print("Access granted")

خروجی را پیش‌بینی کنید.
پست ۶۰ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۶۱
ترکیب not با and و or
در پست قبل با not آشنا شدیم.
حالا می‌توانیم not را همراه با and و or استفاده کنیم.
🔹 مثال با and
age = 20
has_id = False

if age >= 18 and not has_id:
print("ID is required")

اینجا:
age >= 18 → True
has_id → False
not False → True

پس:
True and True → True

🔹 مثال با or
username = "guest"

if not (username == "admin" or username == "root"):
print("Normal user")

ابتدا داخل پرانتز بررسی می‌شود:
username == "admin" → False
username == "root" → False

False or False → False

سپس:
not False → True

پس پیام Normal user چاپ می‌شود.
⚠️ نکته مهم
پرانتز در این نوع شرط‌ها بسیار مهم است:
not (A or B)

یعنی ابتدا A or B محاسبه شود و سپس نتیجه آن با not معکوس شود.
🧠 خلاصه
not (A and B) → معکوس نتیجه A and B
not (A or B) → معکوس نتیجه A or B

🎯 تمرین
خروجی کد زیر را قبل از اجرا پیش‌بینی کنید:
is_logged_in = True
is_banned = False

if is_logged_in and not is_banned:
print("Access granted")
else:
print("Access denied")

پست ۶۱ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۶۲
اولویت not در ترکیب شرط‌ها
وقتی not را همراه با and و or استفاده می‌کنیم، ترتیب بررسی شرط‌ها اهمیت دارد.
🔹 ترتیب بررسی
در شرط‌هایی که تا اینجا یاد گرفتیم:
()
not
and
or

یعنی not قبل از and و or بررسی می‌شود.
🔹 مثال
a = True
b = False

result = not a or b
print(result)

ابتدا:
not a
not True → False

سپس:
False or False → False

پس خروجی:
False

🔹 استفاده از پرانتز
پرانتز می‌تواند ترتیب را تغییر دهد:
result = not (a or b)
print(result)

ابتدا:
a or b
True or False → True

سپس:
not True → False

⚠️ نکته مهم
این دو عبارت همیشه یک شکل نوشته نمی‌شوند:
not a or b

و:
not (a or b)

پرانتز مشخص می‌کند not روی کدام بخش اعمال شود.
🧠 خلاصه
()    → اول
not → بعد
and → سپس
or → در آخر

اگر شرط پیچیده شد، برای خوانایی از () استفاده کنید.
🎯 تمرین
خروجی هر دو عبارت را قبل از اجرا پیش‌بینی کنید:
a = True
b = False

print(not a or b)
print(not (a or b))

پست ۶۲ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۶۳
ترکیب چند شرط با if و elif
گاهی یک مقدار می‌تواند در چند حالت مختلف قرار بگیرد. در این شرایط از if و چند elif استفاده می‌کنیم.
🔹 مثال
score = 82

if score >= 90:
print("Excellent")
elif score >= 75:
print("Good")
elif score >= 50:
print("Passed")
else:
print("Failed")

خروجی:
Good

چون:
82 >= 90 → False
82 >= 75 → True

به محض اینکه یک شرط True شود، همان بلوک اجرا می‌شود و شرط‌های بعدی بررسی نمی‌شوند.
⚠️ ترتیب شرط‌ها مهم است
شرط‌ها از بالا به پایین بررسی می‌شوند.
ترتیب نادرست:
if score >= 50:
print("Passed")
elif score >= 90:
print("Excellent")

برای score = 95، شرط اول True می‌شود و دیگر elif بررسی نمی‌شود.
🧠 خلاصه
if   → اولین حالت
elif → حالت‌های بعدی
else → هیچ‌کدام درست نبود

🎯 تمرین
برنامه‌ای بنویسید که بر اساس temperature چاپ کند:
30 به بالا   → Hot
20 تا 29 → Warm
10 تا 19 → Cool
کمتر از 10 → Cold

پست ۶۳ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۶۴
ترکیب if و elif با چند شرط
می‌توانیم در هر شاخه از if و elif چند شرط را با and و or ترکیب کنیم.
🔹 مثال با and
age = 25
has_id = True

if age >= 18 and has_id:
print("Access granted")
elif age >= 18 and not has_id:
print("ID required")
else:
print("Access denied")

اگر:
age >= 18 → True
has_id → True

هر دو شرط اول درست هستند، بنابراین Access granted چاپ می‌شود.
🔹 مثال با or
username = "admin"

if username == "admin" or username == "root":
print("Privileged user")
else:
print("Normal user")

اگر یکی از دو مقایسه True باشد، شرط اجرا می‌شود.
⚠️ نکته مهم
در شرط‌های ترکیبی، از پرانتز برای مشخص کردن منطق استفاده کنید:
age = 20
has_id = True
is_member = False

if age >= 18 and (has_id or is_member):
print("Access granted")

ابتدا:
has_id or is_member
True or False → True

سپس:
age >= 18 and True
True and True → True

🧠 خلاصه
and → همه شرط‌ها باید درست باشند
or → حداقل یک شرط درست باشد
() → گروه‌بندی شرط‌ها

🎯 تمرین
شرطی بنویسید که اگر:
سن حداقل 18 باشد
و
کاربر عضو باشد یا مدیر باشد

پیام Access granted را چاپ کند.
پست ۶۴ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۶۵
شرط‌های تو در تو با if
گاهی یک شرط فقط زمانی باید بررسی شود که شرط دیگری قبلاً درست بوده باشد. در این حالت از if تو در تو استفاده می‌کنیم.
🔹 مثال
age = 20
has_id = True

if age >= 18:
if has_id:
print("Access granted")
else:
print("ID required")
else:
print("Too young")

ابتدا سن بررسی می‌شود:
age >= 18 → True

پس if داخلی اجرا می‌شود.
سپس:
has_id → True

بنابراین خروجی:
Access granted

🔹 شرط تو در تو با elif
score = 85

if score >= 50:
if score >= 90:
print("Excellent")
elif score >= 75:
print("Good")
else:
print("Passed")
else:
print("Failed")

خروجی:
Good

⚠️ نکته مهم
در شرط‌های تو در تو، تورفتگی (indentation) بسیار مهم است.
if condition:
if another_condition:
print("...")

if دوم داخل if اول قرار دارد.
🧠 خلاصه
if
if
code

یعنی شرط دوم فقط وقتی بررسی می‌شود که شرط اول True باشد.
🎯 تمرین
برنامه‌ای بنویسید که:
اگر کاربر وارد شده بود:
اگر مدیر بود → Admin
در غیر این صورت → User
در غیر این صورت:
Login required

پست ۶۵ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۶۶
ترکیب if تو در تو با and و or
در پست قبل با شرط‌های تو در تو آشنا شدیم.
حالا می‌توانیم داخل شرط‌های تو در تو از and و or هم استفاده کنیم.
🔹 مثال
is_logged_in = True
is_member = True
is_admin = False

if is_logged_in:
if is_admin or is_member:
print("Access granted")
else:
print("Membership required")
else:
print("Please login")

ابتدا:
is_logged_in → True

پس وارد شرط داخلی می‌شویم.
سپس:
is_admin or is_member
False or True → True

بنابراین:
Access granted

🔹 مثال با and
age = 20
has_id = True
is_member = True

if age >= 18:
if has_id and is_member:
print("Full access")
else:
print("Requirements not met")
else:
print("Too young")

برای Full access هر دو شرط داخلی باید True باشند.
⚠️ نکته مهم
در شرط‌های تو در تو، هر سطح از شرط باید تورفتگی مناسب داشته باشد:
if condition:
if another_condition:
print("...")

🧠 خلاصه
if اول      → شرط اصلی
if دوم → شرط وابسته
and / or → ترکیب شرط‌های داخلی

🎯 تمرین
برنامه‌ای بنویسید که:
اگر کاربر وارد شده بود:
اگر سن حداقل 18 بود:
اگر عضو یا مدیر بود → Access granted
در غیر این صورت → Membership required
در غیر این صورت → Too young
در غیر این صورت:
Please login

پست ۶۶ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۶۷
تبدیل شرط‌های تو در تو به شرط ترکیبی
گاهی یک شرط تو در تو را می‌توان با and یا or ساده‌تر نوشت.
🔹 حالت تو در تو
age = 20
has_id = True

if age >= 18:
if has_id:
print("Access granted")

می‌توانیم همین منطق را ساده‌تر بنویسیم:
if age >= 18 and has_id:
print("Access granted")

در این حالت، استفاده از and باعث می‌شود کد کوتاه‌تر و خواناتر شود.
🔹 یک مثال دیگر
شرط تو در تو:
is_logged_in = True
is_admin = True

if is_logged_in:
if is_admin:
print("Admin panel")

نسخه ترکیبی:
if is_logged_in and is_admin:
print("Admin panel")

⚠️ نکته مهم
هر شرط تو در تو را نمی‌توان بدون بررسی به and یا or تبدیل کرد.
اگر شرط داخلی فقط زمانی معنا دارد که شرط بیرونی اجرا شده باشد، ساختار تو در تو می‌تواند مناسب‌تر باشد.
🧠 خلاصه
شرط‌های مستقل → معمولاً and / or
شرط وابسته → ممکن است nested if مناسب‌تر باشد

هدف فقط کوتاه کردن کد نیست؛ خوانایی و منطق درست برنامه مهم‌تر است.
🎯 تمرین
کد زیر را بدون if تو در تو بازنویسی کنید:
age = 25
is_member = True

if age >= 18:
if is_member:
print("Access granted")

پست ۶۷ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۶۸
ترتیب بررسی شرط‌ها در if و elif
وقتی چند شرط با if و elif داریم، Python آن‌ها را از بالا به پایین بررسی می‌کند.
🔹 مثال
score = 95

if score >= 50:
print("Passed")
elif score >= 90:
print("Excellent")

خروجی:
Passed

چرا؟
چون شرط اول:
95 >= 50 → True

است و Python دیگر elif را بررسی نمی‌کند.
🔹 ترتیب درست
شرط‌های خاص‌تر را قبل از شرط‌های عمومی‌تر قرار دهید:
score = 95

if score >= 90:
print("Excellent")
elif score >= 50:
print("Passed")
else:
print("Failed")

خروجی:
Excellent

⚠️ نکته مهم
در if / elif / else:
1. از بالا شروع می‌شود.
2. اولین شرط True اجرا می‌شود.
3. شرط‌های بعدی دیگر بررسی نمی‌شوند.

🧠 خلاصه
شرط خاص‌تر
↓
شرط عمومی‌تر
↓
else

ترتیب شرط‌ها می‌تواند نتیجه برنامه را تغییر دهد.
🎯 تمرین
کد زیر را اصلاح کنید تا برای score = 95 مقدار Excellent چاپ شود:
score = 95

if score >= 50:
print("Passed")
elif score >= 90:
print("Excellent")

پست ۶۸ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۶۹
انتخاب حالت‌ها با match و case
در Python می‌توان برای بررسی چند مقدار مشخص، به‌جای زنجیره‌ای از if و elif از match و case استفاده کرد.
🔹 ساختار
match value:
case pattern:
code

🔹 مثال ساده
day = 2

match day:
case 1:
print("Monday")
case 2:
print("Tuesday")
case 3:
print("Wednesday")
case _:
print("Unknown day")

خروجی:
Tuesday

Python مقدار day را با caseها مقایسه می‌کند.
🔹 case _
علامت _ برای حالت پیش‌فرض استفاده می‌شود:
case _:
print("Unknown day")

یعنی اگر هیچ case دیگری تطبیق نداشت، این بخش اجرا شود.
🔹 مثال کاربردی
command = "start"

match command:
case "start":
print("Starting...")
case "stop":
print("Stopping...")
case "restart":
print("Restarting...")
case _:
print("Unknown command")

⚠️ نکته مهم
match و case از Python 3.10 به بعد در دسترس هستند.
همچنین match فقط جایگزین ساده‌ای برای تمام ifها نیست؛ قابلیت‌های پیشرفته‌تری برای Pattern Matching دارد که بعداً می‌توانیم بررسی کنیم.
🧠 خلاصه
match → مقداری که می‌خواهیم بررسی کنیم
case → حالت‌های مختلف
_ → حالت پیش‌فرض

🎯 تمرین
برنامه‌ای بنویسید که مقدار operation را بررسی کند:
"add" → Addition
"sub" → Subtraction
"mul" → Multiplication
"div" → Division
سایر موارد → Unknown operation

پست ۶۹ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۷۰
Pattern Matching در match
در پست قبل با match و case آشنا شدیم.
حالا یکی از قابلیت‌های مهم match را می‌بینیم: بررسی چند مقدار و الگو به‌صورت هم‌زمان.
🔹 مثال با چند مقدار
point = (0, 5)

match point:
case (0, 0):
print("Origin")
case (0, y):
print("On Y axis")
case (x, 0):
print("On X axis")
case (x, y):
print("Other point")

خروجی:
On Y axis

چون مقدار:
(0, 5)

با الگوی:
case (0, y):

مطابقت دارد و مقدار y برابر 5 می‌شود.
🔹 گرفتن چند مقدار
data = ("Ali", 20)

match data:
case (name, age):
print(name)
print(age)

خروجی:
Ali
20

در اینجا name و age از مقدار داخل data استخراج می‌شوند.
⚠️ نکته مهم
match فقط برای مقایسه ساده نیست؛ می‌تواند ساختار داده را هم بررسی و مقدارهای آن را استخراج کند.
این قابلیت را Pattern Matching می‌نامیم.
🧠 خلاصه
match → بررسی مقدار و الگو
case → تعریف الگو
(x, y) → تطبیق ساختار و استخراج مقدارها

🎯 تمرین
کد زیر را طوری کامل کنید که برای هر حالت پیام مناسب چاپ شود:
point = (10, 0)

match point:
case (0, 0):
print("Origin")
case (x, 0):
print("On X axis")
case (0, y):
print("On Y axis")
case _:
print("Other point")

خروجی را قبل از اجرا پیش‌بینی کنید.
پست ۷۰ از دوره جامع Python 🐍
👍1
🐍 آموزش جامع Python — پست ۷۱
استفاده از شرط در case با if
در match می‌توانیم علاوه بر الگو، یک شرط اضافی هم برای case تعیین کنیم.
به این شرط اضافی Guard می‌گوییم.
🔹 مثال
point = (10, 5)

match point:
case (x, y) if x == y:
print("On diagonal")
case (x, y):
print("Other point")

خروجی:
Other point

چون:
x = 10
y = 5

x == y → False

پس case اول انتخاب نمی‌شود و case دوم اجرا می‌شود.
🔹 مثال دیگر
age = 20

match age:
case age if age >= 18:
print("Adult")
case _:
print("Minor")

خروجی:
Adult

⚠️ نکته مهم
ساختار کلی:
case pattern if condition:
code

ابتدا pattern باید مطابقت داشته باشد، سپس شرط if بررسی می‌شود.
🧠 خلاصه
case pattern → بررسی الگو
if condition → بررسی شرط اضافی

این قابلیت زمانی مفید است که فقط تطبیق مقدار کافی نباشد.
🎯 تمرین
کد زیر را طوری تغییر دهید که فقط وقتی x و y برابر هستند، پیام Equal چاپ شود:
point = (5, 5)

match point:
case (x, y) if x == y:
print("Equal")
case _:
print("Not equal")

پست ۷۱ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۷۲
چند الگو در یک case
در match می‌توانیم چند مقدار یا الگوی مختلف را با | داخل یک case بررسی کنیم.
🔹 مثال
command = "start"

match command:
case "start" | "run":
print("Starting...")
case "stop" | "exit":
print("Stopping...")
case _:
print("Unknown command")

اگر مقدار command برابر "run" باشد، خروجی:
Starting...

چون "start" یا "run" هر کدام می‌توانند با این case مطابقت داشته باشند.
🔹 مثال با چند مقدار
day = 6

match day:
case 1 | 2 | 3 | 4 | 5:
print("Weekday")
case 6 | 7:
print("Weekend")
case _:
print("Invalid day")

خروجی:
Weekend

⚠️ نکته مهم
علامت | در اینجا یعنی:
این الگو OR آن الگو

مثلاً:
case "start" | "run":

یعنی مقدار باید با "start" یا "run" مطابقت داشته باشد.
🧠 خلاصه
case A | B:

یعنی اگر مقدار با A یا B مطابقت داشت، این case اجرا شود.
🎯 تمرین
کدی بنویسید که:
"jpg" یا "png" → Image
"mp3" یا "wav" → Audio
"mp4" یا "mkv" → Video
سایر موارد → Unknown

پست ۷۲ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۷۳
تطبیق ساختار داده‌ها با match
یکی از قابلیت‌های قدرتمند match این است که می‌توانیم ساختار داده‌ها را بررسی کنیم.
🔹 تطبیق لیست
data = [10, 20]

match data:
case [x, y]:
print("Two values:", x, y)
case _:
print("Different structure")

خروجی:
Two values: 10 20

Python تشخیص می‌دهد که data شامل دو مقدار است و آن‌ها را در x و y قرار می‌دهد.
🔹 تطبیق تعداد متفاوت
data = [10, 20, 30]

match data:
case [x]:
print("One value")
case [x, y]:
print("Two values")
case [x, y, z]:
print("Three values")

خروجی:
Three values

🔹 گرفتن بقیه مقدارها با *
data = [1, 2, 3, 4]

match data:
case [first, *rest]:
print(first)
print(rest)

خروجی:
1
[2, 3, 4]

*rest تمام مقدارهای باقی‌مانده را دریافت می‌کند.
⚠️ نکته مهم
در Pattern Matching، شکل داده هم می‌تواند بخشی از الگو باشد:
case [x, y]:

یعنی انتظار داریم داده ساختاری شامل دو عنصر داشته باشد.
🧠 خلاصه
[x, y]       → دو مقدار
[x, y, z] → سه مقدار
[first, *rest] → اولین مقدار + بقیه

🎯 تمرین
خروجی کد زیر را پیش‌بینی کنید:
data = [5, 10, 15, 20]

match data:
case [first, *rest]:
print(first)
print(rest)

پست ۷۳ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۷۴
Pattern Matching با dict
در match می‌توانیم ساختار یک دیکشنری (dict) را هم بررسی کنیم.
🔹 مثال ساده
user = {"name": "Ali", "age": 20}

match user:
case {"name": name, "age": age}:
print(name)
print(age)
case _:
print("Invalid data")

خروجی:
Ali
20

Python کلیدهای name و age را بررسی می‌کند و مقدارهای آن‌ها را در متغیرهای name و age قرار می‌دهد.
🔹 بررسی یک کلید خاص
لازم نیست تمام کلیدهای دیکشنری را در الگو بنویسیم:
user = {"name": "Ali", "age": 20, "admin": True}

match user:
case {"admin": True}:
print("Admin user")
case _:
print("Normal user")

خروجی:
Admin user

🔹 ترکیب با شرط
می‌توانیم بعد از Pattern Matching از if هم استفاده کنیم:
user = {"name": "Ali", "age": 20}

match user:
case {"name": name, "age": age} if age >= 18:
print(f"{name} is an adult")
case _:
print("Other user")

⚠️ نکته مهم
در Pattern Matching با dict، وجود کلیدهای اضافه معمولاً مانع تطبیق نمی‌شود.
مثلاً این الگو:
case {"name": name}:

می‌تواند با این دیکشنری هم مطابقت داشته باشد:
{"name": "Ali", "age": 20}

🧠 خلاصه
case {"name": name} → استخراج مقدار name
case {"admin": True} → بررسی مقدار یک کلید

🎯 تمرین
کدی بنویسید که دیکشنری زیر را بررسی کند:
user = {
"name": "Sara",
"age": 25,
"admin": True
}

اگر admin برابر True بود، چاپ کند:
Admin

در غیر این صورت:
Normal user

پست ۷۴ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۷۵
تطبیق اشیاء با match
در پست‌های قبل دیدیم که match می‌تواند با لیست و دیکشنری کار کند.
حالا می‌خواهیم ببینیم چطور می‌توانیم ساختار یک شیء را هم بررسی کنیم.
🔹 مثال
برای این بخش از یک کلاس ساده استفاده می‌کنیم:
class User:
__match_args__ = ("name", "age")

def __init__(self, name, age):
self.name = name
self.age = age


user = User("Ali", 20)

match user:
case User(name, age):
print(name)
print(age)
case _:
print("Unknown user")

خروجی:
Ali
20

🔹 شرط روی مقدار استخراج‌شده
می‌توانیم بعد از تطبیق، شرط هم قرار دهیم:
match user:
case User(name, age) if age >= 18:
print(f"{name} is an adult")
case User(name, age):
print(f"{name} is a minor")

خروجی:
Ali is an adult

⚠️ نکته مهم
__match_args__ مشخص می‌کند وقتی می‌نویسیم:
case User(name, age):

هر مقدار موقعیتی به کدام ویژگی کلاس مربوط شود.
در مثال ما:
name → user.name
age → user.age

🧠 خلاصه
match می‌تواند علاوه بر مقدارهای ساده و ساختارهایی مثل list و dict، با اشیاء کلاس‌ها نیز Pattern Matching انجام دهد.
🎯 تمرین
کلاس زیر را بسازید:
class Product:
__match_args__ = ("name", "price")

def __init__(self, name, price):
self.name = name
self.price = price

سپس با match بررسی کنید:
price >= 100 → Expensive
price < 100 → Cheap

پست ۷۵ از دوره جامع Python 🐍
👍1
🐍 آموزش جامع Python — پست ۷۶
محدوده متغیرها | Scope
تا اینجا بیشتر متغیرها را در سطح اصلی برنامه تعریف کردیم.
حالا باید با مفهوم Scope یا محدوده دسترسی متغیرها آشنا شویم.
🔹 متغیر در محدوده اصلی
name = "Ali"

print(name)

متغیر name در محدوده اصلی برنامه قرار دارد و از همان محدوده قابل دسترسی است.
🔹 متغیر داخل شرط
if True:
age = 20

print(age)

در Python، ایجاد شدن متغیر داخل if یک Scope جداگانه ایجاد نمی‌کند؛ بنابراین age در این مثال قابل دسترسی است.
🔹 متغیر داخل تابع
def show_name():
name = "Ali"
print(name)

show_name()

اینجا name داخل تابع تعریف شده است.
اگر خارج از تابع بنویسیم:
def show_name():
name = "Ali"

show_name()
print(name)

با خطا مواجه می‌شویم، چون name یک متغیر محلی (Local) است.
🔹 متغیر سراسری
name = "Ali"

def show_name():
print(name)

show_name()

تابع می‌تواند متغیر سراسری name را بخواند.
⚠️ نکته مهم
وجود if به‌تنهایی Scope جدید ایجاد نمی‌کند، اما تابع Scope محلی ایجاد می‌کند.
🧠 خلاصه
Global → محدوده اصلی برنامه
Local → محدوده داخل تابع
if → Scope جداگانه ایجاد نمی‌کند

در پست‌های بعدی Scope و نحوه کار متغیرها در توابع را دقیق‌تر بررسی می‌کنیم.
🎯 تمرین
خروجی کد زیر را پیش‌بینی کنید:
x = 10

if True:
y = 20

print(x)
print(y)

پست ۷۶ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۷۷
تغییر متغیر سراسری با global
در پست قبل با Global و Local Scope آشنا شدیم.
حالا می‌بینیم اگر بخواهیم داخل یک تابع، مقدار یک متغیر سراسری را تغییر دهیم، چه اتفاقی می‌افتد.
🔹 مشکل چیست؟
count = 10

def increase():
count = 20

increase()

print(count)

خروجی:
10

چون count = 20 داخل تابع، یک متغیر محلی جدید ایجاد می‌کند و متغیر سراسری را تغییر نمی‌دهد.
🔹 استفاده از global
با global به Python می‌گوییم منظورمان همان متغیر سراسری است:
count = 10

def increase():
global count
count = 20

increase()

print(count)

خروجی:
20

🔹 مثال کاربردی
score = 0

def add_score():
global score
score += 10

add_score()
add_score()

print(score)

خروجی:
20

هر بار که تابع اجرا می‌شود، همان متغیر سراسری score تغییر می‌کند.
⚠️ نکته مهم
استفاده زیاد از global معمولاً باعث می‌شود کد سخت‌تر قابل مدیریت و آزمایش باشد.
در برنامه‌های واقعی، اغلب بهتر است به‌جای تغییر مستقیم متغیرهای سراسری، از پارامترها و مقدار بازگشتی (return) استفاده کنیم که در فصل توابع به‌طور کامل یاد می‌گیریم.
🧠 خلاصه
متغیر داخل تابع → Local
متغیر خارج تابع → Global
global → اجازه تغییر متغیر Global داخل تابع

🎯 تمرین
خروجی کد زیر را پیش‌بینی کنید:
number = 5

def change():
global number
number += 10

change()
change()

print(number)

پست ۷۷ از دوره جامع Python 🐍
🐍 آموزش جامع Python — پست ۷۸
قانون LEGB در Scope
وقتی Python با یک نام متغیر مواجه می‌شود، باید پیدا کند که مقدار آن از کجا می‌آید.
برای این کار از ترتیب LEGB استفاده می‌کند.
🔹 L — Local
ابتدا داخل محدوده فعلی، معمولاً داخل تابع، جست‌وجو می‌شود:
name = "Global"

def show():
name = "Local"
print(name)

show()

خروجی:
Local

چون name محلی وجود دارد.
🔹 E — Enclosing
اگر تابعی داخل تابع دیگری باشد، Python در تابع بیرونی هم جست‌وجو می‌کند:
def outer():
name = "Outer"

def inner():
print(name)

inner()

outer()

خروجی:
Outer

🔹 G — Global
اگر در محدوده‌های محلی پیدا نشود، Python در محدوده اصلی برنامه جست‌وجو می‌کند:
name = "Global"

def show():
print(name)

show()

خروجی:
Global

🔹 B — Built-in
در نهایت Python در نام‌های داخلی خودش جست‌وجو می‌کند.
مثلاً:
print(len("Python"))

len یک نام Built-in است.
🧠 ترتیب LEGB
L → Local
E → Enclosing
G → Global
B → Built-in

Python این محدوده‌ها را به همین ترتیب بررسی می‌کند.
⚠️ نکته مهم
اگر یک نام در چند محدوده وجود داشته باشد، نزدیک‌ترین محدوده اولویت دارد.
name = "Global"

def show():
name = "Local"
print(name)

show()

خروجی Local است، نه Global.
🎯 تمرین
خروجی کد زیر را قبل از اجرا پیش‌بینی کنید:
x = "Global"

def outer():
x = "Outer"

def inner():
x = "Inner"
print(x)

inner()

outer()

پست ۷۸ از دوره جامع Python 🐍
1
🐍 آموزش جامع Python — پست ۷۹
تغییر متغیر تابع بیرونی با nonlocal
در پست قبل با بخش Enclosing در قانون LEGB آشنا شدیم.
حالا می‌بینیم اگر بخواهیم داخل یک تابع داخلی، متغیر تابع بیرونی را تغییر دهیم، از nonlocal استفاده می‌کنیم.
🔹 مثال ساده
def outer():
count = 0

def inner():
nonlocal count
count += 1

inner()
print(count)

outer()

خروجی:
1

بدون nonlocal، دستور:
count += 1

باعث می‌شود Python آن را به‌عنوان استفاده از یک متغیر محلی در inner در نظر بگیرد و خطا ایجاد شود.
🔹 چند بار تغییر مقدار
def counter():
count = 0

def increase():
nonlocal count
count += 1
return count

print(increase())
print(increase())
print(increase())

counter()

خروجی:
1
2
3

هر بار inner اجرا می‌شود، همان count متعلق به outer تغییر می‌کند.
⚠️ تفاوت global و nonlocal
global   → متغیر در محدوده اصلی برنامه
nonlocal → متغیر در تابع بیرونی

مثلاً:
global count

به متغیر سراسری اشاره می‌کند، اما:
nonlocal count

به متغیر موجود در تابع بیرونی اشاره می‌کند.
🧠 خلاصه
Local    → داخل تابع فعلی
Enclosing → تابع بیرونی
global → محدوده اصلی برنامه
nonlocal → تغییر متغیر تابع بیرونی

🎯 تمرین
کد زیر را کامل کنید تا هر بار اجرای increase() مقدار count را یک واحد افزایش دهد:
def counter():
count = 0

def increase():
# کد را اینجا بنویسید

count += 1
print(count)

increase()
increase()
increase()

counter()

خروجی مورد انتظار:
1
2
3

پست ۷۹ از دوره جامع Python 🐍
👍1