تعلم Python في 10 دقائق
Python هي لغة برمجة عالية المستوى ومُفسّرة معروفة بصيغتها الموجزة وميزاتها القوية. هذا البرنامج التعليمي مبني على أحدث إصدار من Python 3.13+، لمساعدتك على تعلم Python بسرعة.
1. كتابة برنامج Python الأول
لنبدأ ببرنامج بسيط. أنشئ ملفًا باسم hello.py
وأدخل الكود التالي:
print("مرحبًا بالعالم!")
احفظ الملف وشغّل الأمر التالي في الطرفية أو سطر الأوامر:
python hello.py
الناتج سيكون:
مرحبًا بالعالم!
يوضح هذا البرنامج البسيط وظيفة الإخراج الأساسية في Python. تُستخدم الدالة print()
لعرض المعلومات النصية في وحدة التحكم.
2. الصيغة الأساسية
صيغة Python بسيطة وسهلة الفهم. تستخدم Python التهيئة لتحديد كتل التعليمات البرمجية، على عكس اللغات الأخرى التي تستخدم الأقواس المتعرجة {}
.
# هذا تعليق
print("مرحبًا بالعالم!")
قواعد الصيغة الأساسية في Python:
- التهيئة: بشكل افتراضي، تُستخدم 4 مسافات للإشارة إلى مستوى كتلة التعليمات البرمجية. على سبيل المثال، يجب تهيئة التعليمات داخل الدوال أو الحلقات.
- التعليقات: تبدأ التعليقات أحادية السطر بـ
#
، بينما تستخدم التعليقات متعددة الأسطر علامات الاقتباس الثلاثية"""
أو'''
. - العبارات: عادةً عبارة واحدة لكل سطر، ولا حاجة لوضع فاصلة منقوطة
;
في النهاية. - كتل التعليمات: تُحدد بالتهيئة، مثل
if
،for
، أو أجسام الدوال.
مثال على تعليق متعدد الأسطر:
"""
هذا تعليق متعدد الأسطر،
يمتد عبر عدة أسطر.
"""
التهيئة هي ميزة رئيسية في صيغة Python، تُستخدم لتحديد الهيكلية الهرمية لكتل التعليمات البرمجية:
if True:
print("هذا السطر مهيأ")
print("هذا السطر مهيأ أيضًا")
print("هذا السطر غير مهيأ")
3. المتغيرات وأنواع البيانات
في Python، المتغيرات هي حاويات لتخزين البيانات. Python هي لغة ذات كتابة ديناميكية، مما يعني أنك لست بحاجة إلى التصريح بنوع المتغير مسبقًا.
قواعد تسمية المتغيرات الأساسية:
- يمكن أن تحتوي أسماء المتغيرات على الحروف والأرقام والشرطات السفلية فقط.
- لا يمكن أن تبدأ أسماء المتغيرات برقم.
- أسماء المتغيرات حساسة لحالة الأحرف.
- لا يمكن استخدام الكلمات المحجوزة في Python كأسماء متغيرات.
يتم تحديد نوع المتغير بناءً على القيمة المُسندة. أنواع البيانات الأساسية الرئيسية في Python هي:
- الصحيح (int): مثل
42
أو-10
، بدون حد للحجم. - العائم (float): مثل
3.14
أو2.5e3
(التدوين العلمي). - النص (str): مثل
"مرحبًا"
أو'العالم'
، باستخدام علامات اقتباس مفردة أو مزدوجة. - المنطقي (bool):
True
أوFalse
. - النوع الفارغ (NoneType): يُمثل بـ
None
، يشير إلى القيمة الفارغة أو العدم.
تدعم Python تلميحات الأنواع لتحسين قابلية قراءة الكود، تُستخدم للفحص الثابت ودعم بيئات التطوير المتكاملة، دون التأثير على سلوك وقت التشغيل:
name: str = "علي"
age: int = 25
3.1 الأنواع العددية (Number)
تدعم Python ثلاثة أنواع عددية: الصحيح (int)، العائم (float)، والمعقد (complex).
# الصحيح
age = 25
population = 1000000
# العائم
temperature = 36.5
pi = 3.14159
# المعقد
complex_num = 3 + 4j
3.2 النص (String)
النصوص هي تسلسلات من الأحرف، محاطة بعلامات اقتباس مفردة أو مزدوجة.
single_quote = 'نص بعلامات اقتباس مفردة'
double_quote = "نص بعلامات اقتباس مزدوجة"
multiline = """هذا نص
متعدد الأسطر"""
عمليات النصوص:
text = "برمجة Python"
print(len(text)) # طول النص
print(text.upper()) # تحويل إلى أحرف كبيرة
print(text.lower()) # تحويل إلى أحرف صغيرة
print(text[0]) # الوصول إلى الحرف الأول
print(text[2:6]) # تقطيع النص
3.3 النوع المنطقي (Boolean)
النوع المنطقي له قيمتان: True
و False
.
is_active = True
is_complete = False
# العمليات المنطقية
result1 = True and False # False
result2 = True or False # True
result3 = not True # False
3.4 النوع الفارغ (None)
يُمثل None
حالة عدم وجود قيمة أو الحالة الفارغة.
value = None
if value is None:
print("القيمة فارغة")
4. هياكل البيانات
توفر Python عدة هياكل بيانات مدمجة لتخزين البيانات ومعالجتها. فيما يلي الهياكل المستخدمة بشكل شائع واستخداماتها.
4.1 القائمة (List)
القائمة هي مجموعة مرتبة وقابلة للتعديل. يمكنك إضافة أو إزالة أو تعديل العناصر في القائمة. تُعرف القوائم باستخدام الأقواس المربعة []
.
numbers = [1, 2, 3, 4, 5]
numbers.append(6) # إضافة عنصر
numbers.insert(0, 0) # إدراج في موقع محدد
numbers.remove(3) # إزالة قيمة محددة
numbers[0] = 10 # تعديل عنصر
print(numbers) # [10, 2, 4, 5, 6]
تقطيع القوائم للوصول إلى قوائم فرعية:
numbers = [10, 20, 30, 40, 50]
print(numbers[1:4]) # الناتج: [20, 30, 40]
print(numbers[:3]) # الناتج: [10, 20, 30]
print(numbers[-2:]) # الناتج: [40, 50]
فهم القوائم:
squares = [x**2 for x in range(5)]
print(squares) # [0, 1, 4, 9, 16]
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64]
4.2 التوبل (Tuple)
التوبل هي مجموعة مرتبة ولكن غير قابلة للتعديل. بمجرد إنشائها، لا يمكن تعديل عناصرها. تُعرف التوبلات باستخدام الأقواس ()
، وهي أسرع من القوائم بشكل عام بسبب عدم قابليتها للتعديل ويمكن استخدامها كمفاتيح في القواميس.
point = (10, 20)
x, y = point # التفكيك
print(x, y) # الناتج: 10 20
التوبلات ذات العنصر الواحد تتطلب فاصلة:
single_tuple = (42,)
4.3 القاموس (Dict)
القاموس هو مجموعة غير مرتبة (مرتبة في Python 3.7+) من أزواج المفتاح-القيمة. كل مفتاح فريد ومرتبط بقيمة. تُعرف القواميس باستخدام الأقواس المتعرجة {}
.
student = {
"name": "جون",
"age": 20,
"major": "علوم الحاسوب"
}
# الوصول إلى القاموس وتعديله
print(student["name"])
student["age"] = 21
student["gpa"] = 3.8
# الوصول الآمن
print(student.get("phone", "غير متوفر"))
# التكرار على القاموس
for key, value in student.items():
print(f"{key}: {value}")
فهم القواميس:
# إنشاء قاموس مربعات
squares_dict = {x: x**2 for x in range(5)}
print(squares_dict) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# فهم القواميس الشرطي
even_squares_dict = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares_dict) # {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
4.4 المجموعة (Set)
المجموعة هي مجموعة غير مرتبة بدون عناصر مكررة. تُعرف باستخدام الأقواس المتعرجة {}
أو set()
.
# إنشاء مجموعة
fruits = {"تفاح", "موز", "برتقال"}
numbers = set([1, 2, 3, 3, 4, 4, 5]) # إزالة التكرارات تلقائيًا
print(numbers) # {1, 2, 3, 4, 5}
# عمليات المجموعات
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
print(set1 | set2) # الاتحاد: {1, 2, 3, 4, 5, 6}
print(set1 & set2) # التقاطع: {3, 4}
print(set1 - set2) # الفرق: {1, 2}
print(set1 ^ set2) # الفرق التماثلي: {1, 2, 5, 6}
5. العمليات والعوامل
توفر Python مجموعة غنية من العوامل لمختلف الحسابات والمقارنات، بما في ذلك العوامل الحسابية، المقارنة، المنطقية، البتية، والهوية.
- العوامل الحسابية:
+
,-
,*
,/
,//
(القسمة الصحيحة)،%
(الباقي)،**
(الأس). - عوامل المقارنة:
==
,!=
,>
,<
,>=
,<=
. - العوامل المنطقية:
and
,or
,not
. - عوامل العضوية:
in
,not in
. - عوامل الهوية:
is
,is not
.
5.1 العوامل الحسابية
تُستخدم العوامل الحسابية للعمليات الرياضية. تتبع أولوية العوامل القواعد الرياضية (على سبيل المثال، **
له أولوية أعلى من +
أو -
). يمكن استخدام الأقواس ()
لتغيير الأولوية.
a, b = 10, 3
print(f"الجمع: {a + b}") # 13
print(f"الطرح: {a - b}") # 7
print(f"الضرب: {a * b}") # 30
print(f"القسمة: {a / b}") # 3.333...
print(f"القسمة الصحيحة: {a // b}") # 3
print(f"الباقي: {a % b}") # 1
print(f"الأس: {a ** b}") # 1000
5.2 عوامل المقارنة
تقارن عوامل المقارنة بين قيمتين وتُرجع قيمة منطقية (True
أو False
).
x, y = 5, 10
print(f"متساوٍ: {x == y}") # False
print(f"غير متساوٍ: {x != y}") # True
print(f"أكبر من: {x > y}") # False
print(f"أقل من: {x < y}") # True
print(f"أكبر أو يساوي: {x >= y}") # False
print(f"أقل أو يساوي: {x <= y}") # True
5.3 العوامل المنطقية
تجمع العوامل المنطقية أو تتلاعب بالقيم المنطقية (True
أو False
)، وتُستخدم عادةً في العبارات الشرطية.
a, b = True, False
print(f"عملية AND: {a and b}") # False
print(f"عملية OR: {a or b}") # True
print(f"عملية NOT: {not a}") # False
5.4 عوامل الهوية
يُقارن العامل is
بين هوية كائنين، للتحقق مما إذا كانا يشيران إلى نفس عنوان الذاكرة (وليس فقط القيم المتساوية). يختلف عن ==
، الذي يقارن المحتوى.
list1 = [1, 2, 3]
list2 = [1, 2, 3]
list3 = list1
print(f"list1 هو list2: {list1 is list2}") # False
print(f"list1 هو list3: {list1 is list3}") # True
print(f"list1 == list2: {list1 == list2}") # True
5.5 عوامل العضوية
تختبر عوامل العضوية ما إذا كانت قيمة عضوًا في تسلسل (مثل القائمة، التوبل، النص، المجموعة)، وتُرجع قيمة منطقية.
fruits = ["تفاح", "موز", "برتقال"]
print(f"'تفاح' في fruits: {'تفاح' in fruits}") # True
print(f"'عنب' ليس في fruits: {'عنب' not in fruits}") # True
6. التحكم في التدفق
توفر Python عدة عبارات للتحكم في التدفق لإدارة ترتيب تنفيذ البرنامج.
6.1 عبارات if
تقيّم عبارة if
شرطًا وتنفذ كتلتها إذا كان الشرط True
. استخدم elif
و else
للشروط المعقدة.
age = 20
if age >= 18:
print("بالغ")
elif age >= 13:
print("مراهق")
else:
print("طفل")
6.2 حلقات for
تتكرر حلقة for
على كائن قابل للتكرار (مثل القائمة، التوبل، النص، أو النطاق).
# التكرار على قائمة
fruits = ["تفاح", "موز", "كرز"]
for fruit in fruits:
print(fruit)
# استخدام range() للحلقات
for i in range(5):
print(i) # الناتج: 0, 1, 2, 3, 4
6.3 حلقات while
تواصل حلقة while
تنفيذ كتلة طالما بقي شرطها True
.
count = 0
while count < 5:
print(count)
count += 1
- break و continue:
break
تخرج من الحلقة،continue
تتخطى التكرار الحالي.
for i in range(10):
if i == 5:
break
if i % 2 == 0:
continue
print(i) # الناتج: 1, 3
6.4 عبارات match
تم تقديم عبارة match
في Python 3.10، وتوفر مطابقة هيكلية قوية، كبديل متقدم لسلاسل if/elif/else
.
http_status = 200
match http_status:
case 200 | 201:
print("نجاح")
case 404:
print("غير موجود")
case 500:
print("خطأ في الخادم")
case _: # الحالة الافتراضية، تتطابق مع أي حالة أخرى
print("حالة غير معروفة")
7. الإدخال والإخراج
7.1 الإدخال والإخراج الأساسي
استخدم الدالة input()
للحصول على إدخال المستخدم والدالة print()
لإخراج المعلومات.
# الحصول على إدخال المستخدم
name = input("من فضلك، أدخل اسمك: ")
age = int(input("من فضلك، أدخل عمرك: "))
# إخراج المعلومات
print("مرحبًا", name)
print("عمرك", age, "سنة")
7.2 الإخراج المنسق (f-strings)
تم تقديم f-strings (النصوص المنسقة الحرفية) في Python 3.6+، وهي طريقة مريحة وقوية لتنسيق النصوص. ضع بادئة f
أو F
قبل النص وأدرج المتغيرات أو التعبيرات بين أقواس متعرجة {}
.
user = "علي"
items = 3
total_cost = 45.5
# استخدام f-string لرسالة منسقة
message = f"المستخدم {user} اشترى {items} عناصر بقيمة ${total_cost:.2f}."
print(message)
# التعبيرات في f-strings
print(f"2 + 3 يساوي {2 + 3}")
التعبيرات واستدعاء الدوال في f-strings:
width = 10
height = 5
# استخدام التعبيرات في f-strings
area = f"مساحة المستطيل: {width * height}"
print(area)
# استدعاء الدوال
text = "python"
formatted = f"أحرف كبيرة: {text.upper()}، الطول: {len(text)}"
print(formatted)
خيارات التنسيق في f-strings:
pi = 3.14159265359
large_number = 1234567
# تنسيق الأرقام
print(f"Pi (2 decimals): {pi:.2f}")
print(f"Pi (4 decimals): {pi:.4f}")
print(f"Large number (thousands): {large_number:,}")
print(f"Percentage: {0.85:.1%}")
# محاذاة النصوص
name = "Python"
print(f"Left align: '{name:<10}'")
print(f"Right align: '{name:>10}'")
print(f"Center align: '{name:^10}'")
تنسيق التاريخ والوقت باستخدام f-strings:
from datetime import datetime
now = datetime.now()
print(f"الوقت الحالي: {now}")
print(f"الوقت المنسق: {now:%Y-%m-%d %H:%M:%S}")
print(f"التاريخ فقط: {now:%Y-%m-%d}")
9. الدوال
الدوال في Python هي كتل تعليمات برمجية قابلة لإعادة الاستخدام لمهام محددة، تُعرف باستخدام الكلمة المفتاحية def
، وتدعم المعاملات الافتراضية، الوسائط المتغيرة، ووسائط الكلمات المفتاحية.
تعريف دالة أساسية:
def greet(name):
"""دالة تحية"""
return f"مرحبًا، {name}!"
# استدعاء الدالة
message = greet("جون")
print(message)
وسائط الكلمات المفتاحية:
تُمرر وسائط الكلمات المفتاحية باستخدام صيغة parameter_name=value
.
def greet(name, greeting="مرحبًا"):
return f"{greeting}، {name}!"
print(greet("علي")) # الناتج: مرحبًا، علي!
print(greet("بوب", "مرحبًا")) # الناتج: مرحبًا، بوب!
الوسائط المتغيرة:
تتيح الوسائط المتغيرة للدوال قبول عدد غير محدد من الوسائط، إما مواضع (*args
) أو كلمات مفتاحية (**kwargs
).
# وسائط مواضع متغيرة (*args)
def sum_numbers(*args):
return sum(args)
print(sum_numbers(1, 2, 3, 4)) # الناتج: 10
# وسائط كلمات مفتاحية متغيرة (**kwargs)
def print_kwargs(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_kwargs(name="علي", age=25, city="بيجين")
تعليقات الدوال:
تُضيف تعليقات الدوال بيانات وصفية إلى معلمات الدوال وقيم الإرجاع، مما يحسن قابلية القراءة والتوثيق.
def calculate_area(length: float, width: float) -> float:
"""حساب مساحة المستطيل"""
return length * width
def process_user(name: str, age: int, active: bool = True) -> dict:
"""معالجة معلومات المستخدم"""
return {
"name": name,
"age": age,
"active": active
}
10. التعبيرات اللامدا
تُنشئ التعبيرات اللامدا دوالًا مجهولة، توفر طريقة موجزة لتعريف دوال صغيرة.
square = lambda x: x ** 2
print(square(5)) # الناتج: 25
تُستخدم عادةً مع الدوال ذات الترتيب الأعلى مثل map
أو filter
:
numbers = [1, 2, 3, 4]
squares = list(map(lambda x: x ** 2, numbers))
print(squares) # الناتج: [1, 4, 9, 16]
11. الفئات والكائنات
تدعم Python البرمجة الكائنية باستخدام الكلمة المفتاحية class
:
class Person:
"""فئة الشخص"""
def __init__(self, name, age):
"""المنشئ"""
self.name = name
self.age = age
def introduce(self):
"""طريقة التعريف"""
return f"أنا {self.name}، عمري {self.age} سنة"
def have_birthday(self):
"""طريقة عيد الميلاد"""
self.age += 1
return f"{self.name} احتفل بعيد ميلاده، الآن عمره {self.age} سنة"
# إنشاء كائنات
person1 = Person("جون", 25)
person2 = Person("جين", 30)
print(person1.introduce())
print(person2.have_birthday())
11.1 خصائص الفئة والكائن
في Python، هناك نوعان من الخصائص لتخزين البيانات في الفئات والكائنات: خصائص الفئة وخصائص الكائن.
- خصائص الفئة: تُعرف خارج الطرق، تنتمي إلى الفئة نفسها، وتُشترك بين جميع الكائنات.
- خصائص الكائن: تُعرف في الطرق (عادةً
__init__
)، وترتبط بكائنات محددة عبرself
.
class Student:
# خصائص الفئة
school = "جامعة ستانفورد"
student_count = 0
def __init__(self, name, major):
# خصائص الكائن
self.name = name
self.major = major
Student.student_count += 1
@classmethod
def get_student_count(cls):
"""طريقة الفئة"""
return cls.student_count
@staticmethod
def is_valid_age(age):
"""طريقة ثابتة"""
return 0 < age < 150
# مثال على الاستخدام
student1 = Student("جون", "علوم الحاسوب")
student2 = Student("جين", "رياضيات")
print(f"المدرسة: {Student.school}")
print(f"إجمالي الطلاب: {Student.get_student_count()}")
print(f"عمر صالح: {Student.is_valid_age(20)}")
11.2 وراثة الفئات
تتيح الوراثة لفئة (فرعية) أن ترث الخصائص والطرق من فئة أخرى (أصلية)، مما يمكّن إعادة استخدام الكود وتوسيعه.
class Animal:
def __init__(self, name, species):
self.name = name
self.species = species
def make_sound(self):
return f"{self.name} يصدر صوتًا"
def info(self):
return f"{self.name} هو {self.species}"
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name, "كلب")
self.breed = breed
def make_sound(self):
return f"{self.name} ينبح"
def fetch(self):
return f"{self.name} يجلب الكرة"
class Cat(Animal):
def __init__(self, name, color):
super().__init__(name, "قط")
self.color = color
def make_sound(self):
return f"{self.name} يموء"
def climb(self):
return f"{self.name} يتسلق شجرة"
# استخدام الوراثة
dog = Dog("بدي", "جولدن ريتريفر")
cat = Cat("ميمي", "برتقالي")
print(dog.info())
print(dog.make_sound())
print(dog.fetch())
print(cat.info())
print(cat.make_sound())
print(cat.climb())
11.3 الطرق الخاصة (Magic Methods)
الطرق الخاصة (أو الطرق السحرية) هي طرق ذات أسماء تبدأ وتنتهي بشرطتين سفليتين تُحدد سلوكيات محددة، تُستدعى تلقائيًا بواسطة Python في سيناريوهات معينة.
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def __str__(self):
"""التمثيل النصي"""
return f"مستطيل({self.width}x{self.height})"
def __repr__(self):
"""التمثيل النصي الرسمي"""
return f"Rectangle(width={self.width}, height={self.height})"
def __eq__(self, other):
"""مقارنة المساواة"""
if isinstance(other, Rectangle):
return self.width == other.width and self.height == other.height
return False
def __lt__(self, other):
"""مقارنة أقل من (حسب المساحة)"""
if isinstance(other, Rectangle):
return self.area() < other.area()
return NotImplemented
def __add__(self, other):
"""عملية الجمع"""
if isinstance(other, Rectangle):
return Rectangle(self.width + other.width, self.height + other.height)
return NotImplemented
def area(self):
"""حساب المساحة"""
return self.width * self.height
# استخدام الطرق الخاصة
rect1 = Rectangle(3, 4)
rect2 = Rectangle(5, 6)
rect3 = Rectangle(3, 4)
print(rect1) # مستطيل(3x4)
print(repr(rect1)) # Rectangle(width=3, height=4)
print(rect1 == rect3) # True
print(rect1 < rect2) # True
print(rect1 + rect2) # مستطيل(8x10)
12. مديرو السياق
تضمن مديرو السياق الحصول على الموارد وإطلاقها بشكل صحيح، ويُستخدمون عادةً مع عبارة with
لإدارة الموارد، مثل الملفات أو اتصالات قواعد البيانات.
12.1 استخدام مديري السياق
عمليات الملفات هي حالة استخدام شائعة لمديري السياق:
with open("example.txt", "r") as file:
content = file.read()
print(content)
تضمن عبارة with
إغلاق الملف تلقائيًا بعد العمليات.
12.2 مديرو السياق المخصصون
أنشئ مديري سياق مخصصين بتعريف الطريقتين __enter__
و __exit__
:
class DatabaseConnection:
def __init__(self, database_name):
self.database_name = database_name
self.connection = None
def __enter__(self):
"""تُستدعى عند دخول السياق"""
print(f"الاتصال بقاعدة البيانات: {self.database_name}")
self.connection = f"اتصال بـ {self.database_name}"
return self.connection
def __exit__(self, exc_type, exc_value, traceback):
"""تُستدعى عند الخروج من السياق"""
print(f"إغلاق اتصال قاعدة البيانات: {self.database_name}")
if exc_type:
print(f"حدث استثناء: {exc_type.__name__}: {exc_value}")
self.connection = None
return False # عدم قمع الاستثناءات
# استخدام مدير السياق المخصص
with DatabaseConnection("user_database") as conn:
print(f"استخدام الاتصال: {conn}")
print("إجراء عمليات قاعدة البيانات...")
استخدام وحدة contextlib
لإنشاء مديري السياق:
from contextlib import contextmanager
import time
@contextmanager
def timer(operation_name):
"""مدير سياق المؤقت"""
print(f"بدء {operation_name}")
start_time = time.time()
try:
yield
finally:
end_time = time.time()
print(f"{operation_name} اكتمل في {end_time - start_time:.2f} ثوانٍ")
# استخدام مدير السياق المستند إلى الزخرفة
with timer("معالجة البيانات"):
# محاكاة عملية تستغرق وقتًا
time.sleep(1)
print("معالجة البيانات...")
13. معالجة الاستثناءات
تضمن معالجة الاستثناءات قوة البرنامج، باستخدام try
، except
، else
، و finally
لإدارة الاستثناءات.
try:
result = 10 / 0
except ZeroDivisionError:
print("لا يمكن القسمة على صفر!")
else:
print("القسمة ناجحة")
finally:
print("هذا يعمل دائمًا")
الناتج:
لا يمكن القسمة على صفر!
هذا يعمل دائمًا
14. عمليات الملفات
توفر Python طرقًا بسيطة لقراءة الملفات وكتابتها، تُستخدم عادةً مع مديري السياق.
14.1 قراءة الملفات
قراءة محتوى ملف نصي:
with open("example.txt", "r") as file:
content = file.read()
print(content)
قراءة سطرًا بسطر:
with open("example.txt", "r") as file:
for line in file:
print(line.strip())
14.2 كتابة الملفات
الكتابة إلى ملف نصي:
with open("output.txt", "w") as file:
file.write("مرحبًا، Python!\n")
إضافة محتوى:
with open("output.txt", "a") as file:
file.write("إضافة محتوى جديد.\n")
15. الوحدات والحزم
الوحدات هي ملفات تحتوي على كود Python، والحزم هي أدلة تحتوي على وحدات متعددة. استورد الوحدات باستخدام import
:
import math
print(math.sqrt(16)) # الناتج: 4.0
مثال على وحدة مخصصة (افترض أن الملف يُسمى mymodule.py
):
# mymodule.py
def say_hello():
return "مرحبًا من الوحدة!"
الاستيراد والاستخدام:
import mymodule
print(mymodule.say_hello()) # الناتج: مرحبًا من الوحدة!
16. النطاق والفضاء الاسمي
16.1 النطاق
يُحدد النطاق المنطقة التي يكون فيها المتغير متاحًا. تتبع Python قاعدة LEGB للبحث عن المتغيرات:
- L (محلي): داخل دالة أو طريقة فئة.
- E (مغلق): في الدالة الخارجية لدالة متداخلة (إغلاق).
- G (عام): على مستوى الوحدة.
- B (مدمج): الدوال والاستثناءات المدمجة مثل
print()
أوlen()
.
x = "x عام"
def outer_func():
x = "x مغلق"
def inner_func():
x = "x محلي"
print(x) # يصل إلى النطاق المحلي x
inner_func()
print(x) # يصل إلى النطاق المغلق x
outer_func()
print(x) # يصل إلى النطاق العام x
استخدام global
أو nonlocal
لتعديل متغيرات النطاق:
x = "عام"
def modify_global():
global x
x = "معدل"
modify_global()
print(x) # الناتج: معدل
16.2 الفضاء الاسمي
الفضاء الاسمي هو تعيين من الأسماء إلى الكائنات، مثل قاموس حيث المفاتيح هي أسماء المتغيرات والقيم هي الكائنات.
كل وحدة، دالة، وفئة لها فضاؤها الاسمي الخاص، مما يمنع تعارض الأسماء. استخدم globals()
و locals()
لفحص الفضاءات الاسمية.
a_variable = 10
def some_function():
b_variable = 20
# locals() يُرجع قاموس الفضاء الاسمي المحلي الحالي
print(f"Locals: {locals()}")
print(f"Globals: {globals().keys()}") # يطبع مفاتيح الفضاء الاسمي العام
some_function()
17. المولدات
المولدات هي تكرارات خاصة تولد القيم عند الطلب، بدلاً من إنشاء جميع القيم دفعة واحدة، مما يجعلها فعالة في الذاكرة لمجموعات البيانات الكبيرة.
تستخدم المولدات الكلمة المفتاحية yield
لإرجاع القيم بشكل كسول:
def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
for num in fibonacci(5):
print(num) # الناتج: 0, 1, 1, 2, 3
18. الخيوط المتعددة
تتيح الخيوط المتعددة للبرنامج تنفيذ عدة عمليات بشكل متزامن، مفيدة للمهام المرتبطة بالإدخال/الإخراج مثل طلبات الشبكة أو عمليات الملفات.
توفر وحدة threading
في Python أدوات لإنشاء الخيوط وإدارتها. بسبب قفل المترجم العام (GIL)، لا تحقق الخيوط المتعددة توازيًا حقيقيًا للمعالج في عملية واحدة، لكنها تحسن الأداء بشكل كبير للمهام المرتبطة بالإدخال/الإخراج.
import threading
import time
def worker(thread_name):
print(f"الخيط {thread_name} يبدأ...")
time.sleep(2) # محاكاة عملية تستغرق وقتًا
print(f"الخيط {thread_name} انتهى.")
# إنشاء الخيوط
thread1 = threading.Thread(target=worker, args=("أ",))
thread2 = threading.Thread(target=worker, args=("ب",))
# بدء الخيوط
thread1.start()
thread2.start()
# الانتظار حتى تكتمل جميع الخيوط
thread1.join()
thread2.join()
print("اكتملت جميع الخيوط.")
19. البرمجة غير المتزامنة
البرمجة غير المتزامنة مثالية لسيناريوهات الإدخال/الإخراج العالي والتزامن العالي، باستخدام حلقة أحداث لإدارة المهام بدلاً من الخيوط.
تدعم Python البرمجة غير المتزامنة عبر مكتبة asyncio
وصيغة async/await
.
async def
: تُعرف دالة مشتركة.await
: تُوقف تنفيذ الدالة المشتركة، في انتظار اكتمال كائن قابل للانتظار.
import asyncio
async def say_hello():
print("مرحبًا")
await asyncio.sleep(1) # نوم غير مانع، يحاكي الإدخال/الإخراج
print("العالم")
async def main():
# إنشاء وانتظار مهمة
await asyncio.create_task(say_hello())
# تشغيل الدالة المشتركة الرئيسية
asyncio.run(main())
الناتج:
مرحبًا
العالم