شرح دالة Python range() مع أمثلة برمجية عملية

دقائق القراءة: 5

ما هي دالة range() في Python؟

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

بعكس ما قد يظنه بعض المبتدئين، فإن range() لا تُرجع قائمة جاهزة من الأرقام، بل تُرجع كائناً من نوع range object. هذا الكائن يُنتج القيم عند الحاجة أثناء التكرار، وهو ما يجعله أكثر كفاءة من ناحية استهلاك الذاكرة.

شرح دالة range في Python مع أمثلة على التكرار واستخدام الفهارس

الصيغة العامة لاستخدام range()

يمكن استخدام الدالة بالشكل العام التالي:

range(start, stop, step)

عند استخدام هذه الصيغة، تبدأ القيم من start وتستمر حتى قبل stop، مع التحرك بمقدار step في كل مرة.

  • start: نقطة البداية.
  • stop: نقطة التوقف، وهي غير مشمولة في الناتج.
  • step: مقدار الزيادة أو النقصان بين كل قيمة والتي تليها.

المعامل الوحيد الإلزامي هو stop. وإذا لم تُحدد start، فالقيمة الافتراضية تكون 0. وإذا لم تُحدد step، فالقيمة الافتراضية تكون 1.

من المهم أيضاً أن تكون القيم أعداداً صحيحة integers. فإذا استخدمت رقماً عشرياً float فستحصل على خطأ من نوع TypeError.

my_range = range(2.5)

رسالة TypeError عند استخدام رقم عشري مع دالة range في Python

استخدام range(stop) للتكرار البسيط

أبسط شكل من أشكال استخدام الدالة هو تمرير قيمة stop فقط:

range(stop)

في هذه الحالة، يبدأ التسلسل من 0 وينتهي عند stop - 1.

على سبيل المثال، عند استخدام range(5) ستحصل على القيم: 0, 1, 2, 3, 4.

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

# Output
0
1
2
3
4

لماذا يُستخدم هذا النمط كثيراً مع iterables؟

في Python تعتمد الفهارس على zero-indexing، أي أن أول عنصر يكون فهرسه 0. لذلك إذا كان لديك iterable طوله len، فإن الفهارس الصحيحة تمتد من 0 إلى len - 1. وهنا تصبح range(len(...)) وسيلة مباشرة لتوليد جميع الفهارس الممكنة.

مثال عملي على المرور على عناصر قائمة

my_list = ["Python", "C", "C++", "JavaScript", "Julia", "Rust", "Go"]

for index in range(len(my_list)):
    print(f"At index {index}, we have {my_list[index]}")

في هذا المثال نستخدم الدالة len() للحصول على طول القائمة، ثم نمر على جميع الفهارس الصالحة للوصول إلى العناصر.

نتيجة استخدام range مع len للوصول إلى عناصر القائمة في Python

لاحظ أن القائمة تحتوي على 7 عناصر، لذلك كانت الفهارس من 0 حتى 6.

ماذا يحدث عند استخدام قيمة سالبة فقط مع stop؟

إذا كتبت:

for index in range(-5):
    print(index)

# Output
# Nothing is printed

فلن يظهر أي ناتج. والسبب هو أن range() تفترض بداية افتراضية من 0، ولا يمكنها التقدم تصاعدياً من 0 إلى -5 باستخدام step الافتراضي الموجب.

استخدام range(start, stop) لتحديد البداية والنهاية

أحياناً لا تريد أن يبدأ التسلسل من الصفر، بل من قيمة محددة. في هذه الحالة يمكنك تمرير start وstop بشكل صريح:

range(start, stop)

وسينتج عن ذلك تسلسل يبدأ من start وينتهي عند stop - 1.

for index in range(10, 15):
    print(index)

# Output
10
11
12
13
14

استخدام الأعداد السالبة مع البداية والنهاية

عند تحديد البداية والنهاية بنفسك، يصبح من الممكن العمل مع القيم السالبة بسهولة:

for index in range(-5, 0):
    print(index)

# Output
-5
-4
-3
-2
-1

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

استخدام range(start, stop, step) مع خطوة مخصصة

ليس من الضروري أن تتحرك الدالة بمقدار 1 كل مرة. يمكنك تحديد قيمة مخصصة للمعامل step إذا أردت تجاوز بعض القيم أو الوصول إلى كل عنصر رقم k.

range(start, stop, step)

في هذه الحالة، تكون القيم على النحو التالي: start ثم start + step ثم start + 2*step وهكذا، شرط ألا تتجاوز قيمة stop.

for index in range(1, 20, 2):
    print(index)

# Output
1
3
5
7
9
11
13
15
17
19

في هذا المثال تم استخدام خطوة مقدارها 2، لذلك حصلنا على الأعداد الفردية من 1 إلى 19. لاحظ أن 20 نفسها لا تظهر في الناتج، لأن stop غير مشمولة دائماً.

قاعدة مهمة يجب تذكرها

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

استخدام range() مع خطوة سالبة للعد التنازلي

إذا أردت العدّ بشكل عكسي، فيمكنك استخدام قيمة سالبة مع step. عندها يبدأ التسلسل من قيمة أكبر ويتجه نحو قيمة أصغر، من دون أن يشمل stop.

range(start, stop, negative_step)

مثال عملي:

for index in range(20, 1, -2):
    print(index)

# Output
20
18
16
14
12
10
8
6
4
2

هنا بدأنا من 20 وتحركنا نزولاً بمقدار 2 في كل مرة حتى وصلنا إلى 2. ولم تظهر 1 لأن قيمة stop غير مشمولة.

شرط العد التنازلي الصحيح

لكي يعمل العدّ التنازلي كما تتوقع، يجب أن تكون قيمة start أكبر من قيمة stop. وإلا فسيكون التسلسل فارغاً.

for index in range(10, 20, -1):
    print(index)

# Output
# Nothing is printed

هذا السلوك منطقي، لأنك تحاول النزول من 10 إلى 20 بخطوة سالبة، وهو اتجاه غير ممكن.

عكس التسلسل باستخدام range() وreversed()

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

for index in reversed(range(5)):
    print(index)

# Output
4
3
2
1
0

تعيد reversed() كائناً قابلاً للتكرار بترتيب معكوس، وهو أسلوب واضح وسهل القراءة في كثير من السيناريوهات. وهذا يعادل عملياً:

for index in range(4, -1, -1):
    print(index)

أفضل الممارسات عند استخدام range() في Python

  • تأكد دائماً أن stop غير مشمولة في التسلسل.
  • استخدم range(len(iterable)) عندما تحتاج إلى الفهارس نفسها، وليس العناصر فقط.
  • إذا كان هدفك هو المرور على العناصر مباشرة، فقد يكون التكرار على العنصر نفسه أوضح من استخدام الفهارس.
  • استخدم step الموجب للتقدم وstep السالب للتراجع.
  • تجنب تمرير أعداد عشرية، لأن range() تتعامل مع الأعداد الصحيحة فقط.

ملخص سريع لاستخدامات range()

الصيغة الاستخدام مثال
range(stop) البدء من 0 حتى قبل stop range(5)
range(start, stop) تحديد البداية والنهاية range(10, 15)
range(start, stop, step) التحرك بخطوة مخصصة range(1, 20, 2)
range(start, stop, -1) العد التنازلي range(5, 0, -1)
reversed(range(...)) عكس التسلسل reversed(range(5))

الخلاصة التقنية

تُعد range() من أكثر الدوال استخداماً في Python لأنها تمنحك طريقة دقيقة وفعالة لتوليد التسلسلات العددية وإدارة التكرار داخل الحلقات. فهم العلاقة بين start وstop وstep يساعدك على كتابة شيفرة أوضح، وتجنب الأخطاء الشائعة المرتبطة بالفهارس والحدود النهائية. ومن الناحية العملية، كلما أتقنت range() أصبح تعاملك مع for loop أكثر احترافية وكفاءة.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *