نطاق المتغيرات واستيراد الوحدات — أساسيات Python
نطاق المتغيرات واستيراد الوحدات
ما هو النطاق (scope)؟
النطاق هو المكان الذي يمكن فيه استخدام المتغير. المتغير الذي تنشئه داخل دالة يعيش داخلها فقط:
def calculate():
result = 42 # متغير محلي
return result
calculate()
print(result) # NameError: result غير معرّف هنا- المتغير المحلي (local): يُنشأ داخل الدالة ويختفي عند انتهائها.
- المتغير العام (global): يُنشأ خارج كل الدوال، ويمكن قراءته من داخلها.
tax = 0.15 # عام
def price_with_tax(price):
return price * (1 + tax) # قراءة المتغير العام مسموحةفخ الإسناد داخل الدالة
count = 0
def increment():
count = count + 1 # UnboundLocalError!بمجرد أن تُسند قيمة لاسم داخل دالة، تعتبره Python محلياً في كل الدالة، فتحاول قراءته قبل أن يُنشأ.
الحل الأفضل ليس global، بل تمرير القيمة وإرجاعها:
def increment(count):
return count + 1
count = increment(count)الدالة التي تعتمد فقط على معاملاتها وترجع نتيجة أسهل في الفهم والاختبار. استخدم global نادراً جداً.
المعاملات مستقلة
المعامل متغير محلي: تغيير قيمته داخل الدالة لا يغيّر المتغير الأصلي (للأرقام والنصوص). أما القوائم والقواميس فتعديل محتواها داخل الدالة يظهر خارجها لأنها نفس الكائن.
الوحدات (Modules)
الوحدة ملف فيه دوال جاهزة. Python تأتي بمكتبة قياسية ضخمة:
import math
print(math.sqrt(16), math.pi)
from random import randint, choice
print(randint(1, 6), choice(["حجر", "ورقة", "مقص"]))
import datetime
print(datetime.date.today())| الصيغة | الاستخدام |
|---|---|
| import math | math.sqrt(9) |
| from math import sqrt | sqrt(9) مباشرة |
| import datetime as dt | اسم مختصر |
تجنب from module import * لأنها تجعل مصدر الأسماء غير واضح وقد تستبدل أسماءك.
تنبيه
لا تسمِّ ملفك باسم وحدة موجودة مثل random.py أو math.py؛ ستستورد Python ملفك بدل الوحدة الحقيقية.
تمرين
اكتب دالة circle_area(r) تستخدم math.pi، ودالة roll_dice(n) ترجع قائمة بـ n رمية نرد عشوائية، ولا تستخدم أي متغير global.
import math
import random
from datetime import date
TAX_RATE = 0.15 # ثابت عام (قراءة فقط)
def price_with_tax(price):
return round(price * (1 + TAX_RATE), 2)
print(price_with_tax(100)) # 115.0
def calculate():
local_value = 42 # محلي
return local_value
print(calculate())
# print(local_value) # NameError لو أزلت التعليق
# الأسلوب الصحيح بدل global: مرّر وأرجع
def increment(count):
return count + 1
count = 0
count = increment(count)
count = increment(count)
print(count) # 2
# القوائم تُعدَّل من داخل الدالة لأنها نفس الكائن
def add_item(items, item):
items.append(item)
cart = []
add_item(cart, "قلم")
print(cart) # ['قلم']
# وحدات المكتبة القياسية
def circle_area(r):
return math.pi * r ** 2
def roll_dice(n):
return [random.randint(1, 6) for _ in range(n)]
print(round(circle_area(3), 2))
print(roll_dice(5))
print("اليوم:", date.today())
print(math.sqrt(49), math.floor(3.7), math.ceil(3.2))
اختبر فهمك