أهم الدوال المدمجة في بايثون

أهم الدوال المدمجة في بايثون

تلعب الدوال المدمجة (Built-in Functions) في بايثون دورًا محوريًا في تسريع عملية البرمجة وتسهيل كتابة الكود. هذه الدوال تأتي مدمجة مع لغة بايثون نفسها، ولا تحتاج إلى استيراد أي مكتبات خارجية لاستخدامها، مما يجعلها الخيار الأول للمبرمجين في تنفيذ المهام الأساسية والمتكررة.
بدلاً من إعادة اختراع العجلة في كل مرة نحتاج فيها إلى طباعة نتيجة، أو فرز قائمة، أو جمع عناصر، تقدم بايثون مجموعة غنية من الأدوات الجاهزة التي تغطي معظم الاحتياجات الشائعة، وتضمن تنفيذها بكفاءة عالية.

تكمن قوة هذه الدوال في كونها بسيطة في الاستخدام، لكنها عميقة في الإمكانيات. يستطيع المبرمج المبتدئ استخدامها فورًا بدون معرفة متقدمة، بينما يمكن للمبرمج الخبير توظيفها بطرق ذكية لصناعة حلول أكثر تعقيدًا واحترافية.

في هذا المقال، نستعرض أهم الدوال المدمجة في بايثون التي يجب على كل مبرمج أن يتقنها، مع شرح مبسط وواضح لكيفية استخدامها.

1. دالة print() – لعرض البيانات على الشاشة

دالة print() هي أبسط وأكثر دالة تُستخدم في بايثون. تُستخدم لطباعة النصوص أو المتغيرات أو نتائج العمليات على شاشة الإخراج. تُعتبر أداة أساسية في أي برنامج، خصوصًا أثناء عملية تصحيح الأخطاء (debugging) أو تتبع سير الكود.

مثال:

print("مرحبًا بك في بايثون")
x = 5
print("قيمة x هي:", x)

يمكنك تمرير أكثر من قيمة مفصولة بفواصل، وتستطيع التحكم في نهاية السطر (end) أو الفاصل بين العناصر (sep) باستخدام الوسيطات.

مثال أكثر تقدمًا:

print("القائمة:", 1, 2, 3, sep=" - ", end=".\n")

هذه الدالة لا تعيد قيمة، بل فقط تُخرج البيانات. ورغم بساطتها، إلا أنها أداة لا غنى عنها في كتابة أي برنامج بلغة بايثون.

2. دالة len() – لحساب عدد العناصر

دالة len() تُستخدم لحساب عدد العناصر داخل كائن قابل للتكرار مثل السلاسل النصية (strings)، القوائم (lists)، القواميس (dictionaries)، والمجموعات (sets). وهي من الأدوات السريعة والمباشرة لمعرفة حجم البيانات.

مثال:

اسم = "Python"
print(len(اسم))  # الناتج: 6

أرقام = [1, 2, 3, 4]
print(len(أرقام))  # الناتج: 4

عند استخدامها مع قاموس، تُرجع عدد المفاتيح:

مستخدم = {"اسم": "أحمد", "عمر": 25}
print(len(مستخدم))  # الناتج: 2

دالة len() مفيدة في الحلقات، الشروط، أو لضمان أن البيانات ليست فارغة، وهي جزء أساسي من كتابة كود يعتمد على طول المدخلات أو النتائج.

3. دالة type() – لمعرفة نوع البيانات

دالة type() تُستخدم لمعرفة نوع الكائن (variable type) في بايثون، وهي مفيدة جدًا عند التعامل مع البيانات الديناميكية أو التحقق من الأنواع في البرامج التي تعتمد على مدخلات المستخدم أو بيانات من مصادر خارجية.

مثال:

x = 10
print(type(x))  # <class 'int'>

y = "نص"
print(type(y))  # <class 'str'>

z = [1, 2, 3]
print(type(z))  # <class 'list'>

يمكن استخدام type() داخل الشروط لتغيير سلوك البرنامج حسب نوع البيانات:

if type(x) == int:
    print("x عدد صحيح")

لكن الأفضل استخدام isinstance() في التحقق من النوع، لأنها أكثر مرونة (سنشرحها لاحقًا). ومع ذلك تبقى type() أداة مباشرة وسريعة ومستخدمة بكثرة لفهم طبيعة المتغيرات خاصة أثناء التجريب أو التصحيح.

4. دالة input() – لقراءة إدخال من المستخدم

دالة input() تُستخدم لقراءة بيانات من المستخدم عبر سطر الأوامر. تُرجع دائمًا القيمة كنص (من نوع str) مهما كان ما يدخله المستخدم، لذا غالبًا ما نحتاج إلى تحويل القيمة إلى نوع آخر مثل int أو float.

مثال بسيط:

الاسم = input("ما اسمك؟ ")
print("مرحبًا،", الاسم)

مثال مع تحويل النوع:

العمر = int(input("كم عمرك؟ "))
print("بعد 10 سنوات سيكون عمرك:", العمر + 10)

إذا لم يتم تحويل النوع يدويًا، فإن العمليات الحسابية قد تفشل أو تنتج سلوكًا غير متوقع.

مثال خاطئ:

x = input("أدخل رقمًا: ")
print(x + 10)  # هذا سيعطي خطأ لأن x نص

في التطبيقات التفاعلية أو عند بناء سكربتات تعتمد على تفاعل المستخدم، تعتبر input() دالة أساسية لجمع البيانات المطلوبة بطريقة مباشرة وسريعة.

5. دوال التحويل بين الأنواع: int() و float() و str()

بايثون توفر دوال مدمجة لتحويل البيانات بين أنواعها الأساسية، مثل الأعداد الصحيحة والعشرية والسلاسل النصية. وتُعتبر هذه التحويلات ضرورية في كثير من الأحيان عند التعامل مع مدخلات المستخدم أو البيانات القادمة من ملفات أو شبكات.


1. int() – لتحويل القيمة إلى عدد صحيح (integer):

تحوّل القيم الرقمية أو السلاسل الرقمية إلى عدد صحيح.

x = int("42")
print(x + 10)  # الناتج: 52

إذا كانت القيمة تحتوي على كسور أو أحرف غير رقمية، سيحدث خطأ.

int("3.5")  # يسبب خطأ

2. float() – لتحويل القيمة إلى عدد عشري (float):

يقبل الأرقام الصحيحة والعشرية كنصوص أو كأرقام.

y = float("3.14")
print(y * 2)  # الناتج: 6.28

3. str() – لتحويل القيمة إلى سلسلة نصية (string):

مفيد لطباعة القيم أو جمعها مع نصوص.

age = 25
print("عمري هو " + str(age))  # عمري هو 25

هذه الدوال الثلاثة هي الأدوات الأساسية للربط بين أنواع البيانات المختلفة في بايثون، ولا يمكن كتابة برنامج تفاعلي أو ديناميكي بدون استخدامها في مواضع متعددة.

6. دالة range() – لإنشاء تسلسل من الأرقام

تُستخدم range() في بايثون لإنشاء سلسلة من الأعداد تُستخدم غالبًا في الحلقات، خاصة for، وتُعد من أهم الأدوات عند تنفيذ عمليات متكررة لها علاقة بالأرقام أو الفهارس.


الاستخدام الأساسي:

for i in range(5):
    print(i)

الناتج:

0
1
2
3
4

range(start, stop, step):

  • start: البداية (افتراضيًا 0)

  • stop: النهاية (غير مشمولة)

  • step: مقدار الزيادة (افتراضيًا 1)

مثال:

for i in range(2, 10, 2):
    print(i)

الناتج:

2
4
6
8

مثال آخر لحساب مجموع الأعداد من 1 إلى 100:

المجموع = sum(range(1, 101))
print(المجموع)  # 5050

دالة range() لا تُنتج قائمة حقيقية بل تُنتج كائنًا كسولًا (lazy object) يوفر الأداء العالي في الحلقات الكبيرة. ويمكن تحويل الناتج إلى قائمة باستخدام list() إذا لزم الأمر:

أرقام = list(range(5))
print(أرقام)  # [0, 1, 2, 3, 4]

دالة range() ضرورية في أي برنامج يحتاج إلى تكرار مضبوط أو عدّ مؤقت، وهي أساس كثير من حلقات التكرار المنضبطة.

7. دالة enumerate() – للحصول على الفهرس والقيمة معًا

عند التكرار على تسلسل مثل قائمة أو سلسلة نصية، نحتاج أحيانًا إلى معرفة رقم الفهرس الحالي (index) إلى جانب القيمة. هنا تأتي أهمية enumerate()، فهي تُرجع كل من الفهرس والعنصر في كل دورة تكرار.


مثال بدون enumerate() (الطريقة التقليدية):

ألوان = ["أحمر", "أخضر", "أزرق"]
for i in range(len(ألوان)):
    print(i, ألوان[i])

نفس المثال باستخدام enumerate() (الطريقة الأفضل):

ألوان = ["أحمر", "أخضر", "أزرق"]
for index, color in enumerate(ألوان):
    print(index, color)

الناتج:

0 أحمر
1 أخضر
2 أزرق

يمكن تحديد بداية الفهرسة باستخدام الوسيط الثاني:

for i, val in enumerate(ألوان, start=1):
    print(i, val)

الناتج:

1 أحمر
2 أخضر
3 أزرق

enumerate() تُستخدم كثيرًا في التطبيقات التي تحتاج إلى تتبع ترتيب العناصر أو ربط كل عنصر بموقعه، مثل بناء القوائم المرتبة أو التعامل مع نماذج أو ملفات. وهي أكثر وضوحًا وأمانًا من استخدام range(len(...))، لذا يُنصح بها دائمًا.

8. دالة zip() – لدمج أكثر من تسلسل معًا

دالة zip() تُستخدم لدمج تسلسلات متعددة (مثل القوائم أو التابعات) في سلسلة واحدة من tuples، حيث يتم أخذ عنصر واحد من كل تسلسل في كل دورة. تُعتبر مفيدة جدًا عند الحاجة إلى التكرار المتوازي على أكثر من قائمة.


مثال:

أسماء = ["علي", "سارة", "محمد"]
درجات = [90, 85, 88]

for اسم, درجة in zip(أسماء, درجات):
    print(اسم, "حصل على", درجة)

الناتج:

علي حصل على 90  
سارة حصلت على 85  
محمد حصل على 88

يمكن تحويل ناتج zip() إلى قائمة من tuples:

بيانات = list(zip(أسماء, درجات))
print(بيانات)
# [('علي', 90), ('سارة', 85), ('محمد', 88)]

ملاحظة: إذا كانت القوائم غير متساوية الطول، فإن zip() تتوقف عند أقصر قائمة:

print(list(zip([1, 2, 3], [10, 20])))
# [(1, 10), (2, 20)]

عكس zip() باستخدام unpacking:

أ = [1, 2]
ب = [3, 4]
مجمعة = list(zip(أ, ب))  # [(1, 3), (2, 4)]

# عكس الدمج
أ2, ب2 = zip(*مجمعة)
print(list(أ2))  # [1, 2]
print(list(ب2))  # [3, 4]

zip() قوية وبسيطة وتُستخدم في الربط بين الأعمدة أو ترتيب البيانات أو إنشاء قاموس من قائمتين، ما يجعلها من الأدوات المفيدة جدًا في كتابة كود واضح وفعّال.

9. دوال sorted() و reversed() – لترتيب أو عكس تسلسل


دالة sorted()

تُستخدم sorted() لترتيب عناصر أي تسلسل (مثل قائمة أو سلسلة نصية) وإرجاع نسخة جديدة مرتبة بدون تغيير الأصلية.

مثال:

أرقام = [5, 2, 9, 1]
مرتبة = sorted(أرقام)
print(مرتبة)  # [1, 2, 5, 9]
print(أرقام)   # الأصلية تبقى كما هي

يمكن التحكم في الترتيب بالوسيط reverse:

مرتبة_عكس = sorted(أرقام, reverse=True)
print(مرتبة_عكس)  # [9, 5, 2, 1]

دالة reversed()

تُستخدم reversed() لعكس ترتيب العناصر في تسلسل وتُرجع كائن يمكن تكراره (iterator) يعكس الترتيب الأصلي.

مثال:

نص = "مرحبا"
معكوس = ''.join(reversed(نص))
print(معكوس)  # "ابحرم"

يمكن تحويل الناتج إلى قائمة:

قائمة_معكوسة = list(reversed([1, 2, 3]))
print(قائمة_معكوسة)  # [3, 2, 1]

sorted() تغير ترتيب العناصر لكن تعيد نسخة جديدة، أما reversed() فقط تعكس الترتيب عند التكرار ولا تغير الأصل. هاتان الدالتان تستخدمان في كثير من السيناريوهات مثل فرز النتائج أو التعامل مع البيانات العكسية.

10. دوال max() و min() و sum() – عمليات حسابية أساسية على التسلسلات


دالة max()

تُرجع أكبر قيمة في تسلسل مثل قائمة أو مجموعة أرقام.

مثال:

أرقام = [10, 20, 5, 30]
الأكبر = max(أرقام)
print(الأكبر)  # 30

دالة min()

تُرجع أصغر قيمة في التسلسل.

مثال:

الأصغر = min(أرقام)
print(الأصغر)  # 5

دالة sum()

تحسب مجموع جميع العناصر الرقمية في التسلسل.

مثال:

المجموع = sum(أرقام)
print(المجموع)  # 65

هذه الدوال أساسية في إجراء العمليات الإحصائية البسيطة على البيانات، وتوفر الوقت والجهد بدلاً من كتابة حلقات حسابية يدوية. تدعم جميعها التعامل مع الأرقام ويمكن استخدامها مع أنواع بيانات أخرى مع تعيين دوال مخصصة.

11. دوال map() و filter() و reduce() – معالجة تسلسلات بطريقة وظيفية


دالة map()

تطبق دالة معينة على كل عنصر في تسلسل وترجع كائنًا يحتوي النتائج.

مثال:

def مربع(x):
    return x * x

أرقام = [1, 2, 3, 4]
نتيجة = map(مربع, أرقام)
print(list(نتيجة))  # [1, 4, 9, 16]

دالة filter()

تُستخدم لتصفية عناصر التسلسل بناءً على دالة شرط ترجع True أو False.

مثال:

def أكبر_من_اثنين(x):
    return x > 2

أرقام = [1, 2, 3, 4]
مصفاة = filter(أكبر_من_اثنين, أرقام)
print(list(مصفاة))  # [3, 4]

دالة reduce()

ليست مدمجة بشكل مباشر في بايثون، ولكن يمكن استيرادها من مكتبة functools. تُستخدم لتطبيق دالة تجميعية على تسلسل وتحويله إلى قيمة واحدة.

مثال:

from functools import reduce

أرقام = [1, 2, 3, 4]
مجموع = reduce(lambda x, y: x + y, أرقام)
print(مجموع)  # 10

تُعد هذه الدوال أدوات قوية في البرمجة الوظيفية (Functional Programming)، تتيح كتابة كود نظيف وقابل لإعادة الاستخدام لمعالجة البيانات بفعالية.

12. دوال all() و any() – التحقق من تحقق شروط على التسلسلات


دالة all()

ترجع True إذا كانت كل القيم في التسلسل تحقق شرطًا معينًا (كلها صحيحة منطقيًا).

مثال:

قيم = [True, True, False]
print(all(قيم))  # False

دالة any()

ترجع True إذا كان هناك عنصر واحد على الأقل يحقق الشرط (واحد صحيح منطقيًا).

مثال:

قيم = [False, False, True]
print(any(قيم))  # True

كلا الدالتين تستخدمان بشكل واسع في التحقق من شروط معقدة على مجموعات البيانات أو القوائم، مثل التحقق من صلاحية مدخلات متعددة أو توافر شروط معينة داخل البيانات. يمكن استخدامهما مع تعبيرات شرطية داخل map أو generator expressions.

13. دالة isinstance() – للتحقق من نوع الكائن

تُستخدم isinstance() لفحص ما إذا كان كائن معين ينتمي إلى نوع معين أو إلى فئة فرعية من ذلك النوع. هذه الدالة أكثر مرونة وأمانًا من استخدام type() في عمليات التحقق.


الصيغة:

isinstance(object, classinfo)
  • object: الكائن المراد التحقق منه.

  • classinfo: النوع أو مجموعة الأنواع التي يتم التحقق ضدها.


مثال:

x = 10
print(isinstance(x, int))  # True

y = "نص"
print(isinstance(y, str))  # True

print(isinstance(y, (int, float)))  # False

يمكنك التحقق من أكثر من نوع باستخدام tuple في الوسيط الثاني:

if isinstance(x, (int, float)):
    print("x عدد")

isinstance() مفيدة في كتابة برامج أكثر مرونة وقابلية للصيانة، خاصة عند التعامل مع أنواع بيانات مختلفة أو في البرمجة الكائنية (OOP).

14. دالة id() – لإرجاع هوية الكائن في الذاكرة

دالة id() تعطي قيمة رقمية تمثل عنوان الكائن في الذاكرة أثناء تنفيذ البرنامج. هذا العنوان يُستخدم داخليًا لتعريف كل كائن فريد في بايثون.


مثال:

a = 10
b = 10
print(id(a))  # رقم يمثل موقع الكائن 10 في الذاكرة
print(id(b))  # عادة نفس الرقم لأن بايثون تعيد استخدام نفس الكائن للأعداد الصغيرة

هذه الدالة مفيدة عند مقارنة الكائنات على مستوى الذاكرة وليس فقط القيم، مثل التحقق مما إذا كان متغيران يشيران إلى نفس الكائن فعليًا وليس فقط متساويين في القيمة.


ملاحظة:
id() لا تُستخدم عادة في البرامج اليومية، لكنها أداة مهمة لفهم كيفية عمل بايثون داخليًا، خصوصًا في موضوعات مثل إدارة الذاكرة أو تحسين الأداء.

15. دوال eval() و exec() – تنفيذ تعبيرات أو أكواد بايثون كنصوص


دالة eval()

تُستخدم eval() لتقييم تعبير بايثون يُكتب كسلسلة نصية وإرجاع نتيجته. مفيدة عند الحاجة لتنفيذ حسابات أو تعبيرات ديناميكية.

مثال:

نتيجة = eval("3 + 5 * 2")
print(نتيجة)  # 13

دالة exec()

تُستخدم exec() لتنفيذ كود بايثون كامل مكتوب كنص، مثل تعاريف دوال أو حلقات أو أي تعليمات برمجية.

مثال:

كود = """
for i in range(3):
    print("رقم", i)
"""
exec(كود)

تحذير:

  • eval() و exec() خطيرتان إذا تم استخدامهما على مدخلات غير موثوقة، لأنها قد تسمح بتنفيذ تعليمات خبيثة.

  • يُنصح بتجنبهما إلا إذا كان هناك حاجة قوية مع اتخاذ إجراءات أمان مشددة.


هاتان الدالتان توفران مرونة هائلة في برمجة بايثون، لكن استخدامهما يتطلب حذرًا شديدًا وفهمًا عميقًا.

16. دوال abs() و round() – العمليات الرياضية البسيطة


دالة abs()

ترجع القيمة المطلقة (المقدار بدون إشارة) لعدد صحيح أو عشري.

مثال:

print(abs(-10))   # 10
print(abs(3.5))   # 3.5

دالة round()

تقرب الرقم العشري إلى أقرب عدد صحيح أو إلى عدد معين من المنازل العشرية.

مثال:

print(round(3.14159))       # 3
print(round(3.14159, 2))    # 3.14

هاتان الدالتان تستخدمان بكثرة في العمليات الحسابية اليومية أو في معالجة البيانات الرقمية حيث الحاجة إلى نتائج مقربة أو قيم موجبة فقط.

انتهى استعراض أهم دوال بايثون المدمجة التي تشكل الركيزة الأساسية لأي مبرمج يعمل بهذه اللغة. إتقان هذه الدوال يسهل كتابة الأكواد ويجعلها أكثر كفاءة ووضوحًا، كما يسرّع عملية تطوير البرامج ويقلل من الأخطاء البرمجية.
عند الاستخدام الذكي لهذه الدوال، يمكن للمبرمج التركيز على حل المشكلات البرمجية الحقيقية بدلًا من الانشغال بالمهام الروتينية أو التفصيلية.
أنصح دائمًا بالتدريب العملي على استخدام هذه الدوال في مشاريع صغيرة للتعرف على إمكانياتها والتعامل مع الحالات المختلفة التي قد تواجهها في البرمجة اليومية.

حول المحتوى:

في هذا المقال، نستعرض أهم الدوال المدمجة في بايثون التي يجب على كل مبرمج أن يتقنها، مع شرح مبسط وواضح لكيفية استخدامها.