Python وظيفة range(): تعويم، قائمة، للحصول على أمثلة الحلقة

⚡ ملخص ذكي

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

  • 🔘 بناء الجملة: تقبل الدالة range(start, stop, step) ما يصل إلى ثلاثة وسائط عددية صحيحة، حيث تكون قيمة start الافتراضية 0 وقيمة step الافتراضية 1.
  • ☑️ محطة حصرية: تتوقف السلسلة دائمًا قبل قيمة واحدة من فهرس التوقف، لذا فإن range(5) ينتج عنه القيم من 0 إلى 4.
  • التحكم بالخطوات: تؤدي الخطوة الموجبة إلى زيادة القيم، بينما تؤدي الخطوة السالبة إلى العد للخلف لنطاق عكسي.
  • 🧪 حدود الأنواع: لا يتم قبول سوى الأعداد الصحيحة، لذا فإن الوسائط ذات الفاصلة العائمة أو السلاسل النصية تثير خطأ من نوع TypeError.
  • 🛠️ الأعداد العشرية في NumPy: تقوم دالة NumPy arange() بتوسيع سلوك دالة range() ليشمل متواليات الأعداد العشرية.
  • 🤖 سير عمل الذكاء الاصطناعي: يعتمد كود التعلم الآلي على الدالة range() لتكرار دورات التدريب، والدفعات الصغيرة، وشبكات المعلمات الفائقة.

Python وظيفة النطاق ().

ما هي تفاصيل Python يتراوح؟

Python range() هي وظيفة مضمنة متاحة مع Python من Python (3.x)، ويعطي تسلسلًا من الأرقام بناءً على مؤشر البداية ومؤشر التوقف المعطى. في حالة عدم إعطاء مؤشر البداية، يتم اعتبار المؤشر 0، وسوف يزيد القيمة بمقدار 1 حتى مؤشر التوقف.

على سبيل المثال، ستُخرج الدالة range(5) القيم 0، 1، 2، 3، 4. Python تُعدّ الدالة range() أمرًا مفيدًا للغاية، وتُستخدم غالبًا عند الحاجة إلى التكرار باستخدام لحلقة.

بناء الجملة

يُوضح الشكل التالي صيغة الدالة range():

range(start, stop, step)

المعاملات

  • بدء: (اختياري) فهرس البداية هو عدد صحيح، وإذا لم يتم تحديده، فإن القيمة الافتراضية هي 0.
  • توقف: يُحدد مؤشر التوقف القيمة التي يجب أن تتوقف عندها دالة النطاق. وهو مُدخل إلزامي لدالة النطاق. ستكون القيمة الأخيرة دائمًا أقل بواحد من قيمة التوقف.
  • خطوة: (اختياري) قيمة الخطوة هي الرقم الذي يجب زيادة الرقم التالي في النطاق به؛ افتراضيًا، تكون 1.

قيمة الإرجاع

قيمة الإرجاع عبارة عن سلسلة من الأرقام من مؤشر البداية إلى مؤشر التوقف المحدد.

Python range() الوظيفة والتاريخ

Python تم تقديم النطاق () من Python الإصدار 3؛ قبل ذلك، كانت الدالة هي xrange().

تُستخدم كل من الدالة range() والدالة xrange() لإنتاج سلسلة من الأرقام.

فيما يلي الفروقات بين الدالة range() والدالة xrange():

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

باستخدام النطاق ()

يوضح هذا المثال كيفية طباعة القيم من 0 إلى 9 باستخدام النطاق ().

القيمة المستخدمة في النطاق هي 10، لذا فإن الناتج هو 0 1 2 3 4 5 6 7 8 9.

بما أن البداية غير معطاة، فإن البداية تعتبر 0 ويتم إعطاء القيمة الأخيرة حتى 9. القيمة الأخيرة دائماً أقل بمقدار 1 من القيمة المعطاة، أي التوقف-1.

for i in range(10):
    print(i, end =" ")

الإخراج:

0 1 2 3 4 5 6 7 8 9

استخدام البداية والتوقف في النطاق ()

في الكود، قيمة البداية هي 3، وقيمة النهاية هي 10. هنا، فهرس البداية هو 3، لذا سيبدأ تسلسل الأرقام من 3 حتى قيمة النهاية. ستكون القيمة الأخيرة في التسلسل أقل بواحد من قيمة النهاية، أي 10 - 1 = 9.

for i in range(3, 10):
    print(i, end =" ")

الإخراج:

3 4 5 6 7 8 9

باستخدام البداية والتوقف والخطوة

قيمة البداية هي 3، لذا سيبدأ تسلسل الأرقام من 3. قيمة النهاية هي 10، لذا سينتهي تسلسل الأرقام عند (10-1)، أي 9. الخطوة هي 2، لذا ستتم زيادة كل قيمة في التسلسل بمقدار 2. إذا لم يتم تحديد قيمة الخطوة، فسيتم استخدام القيمة الافتراضية 1.

for i in range(3, 10, 2):
    print(i, end =" ")

الإخراج:

3 5 7 9

لقد رأينا حتى الآن كيف تُعطي الدالة range() القيمة المُضافة لقيمة التوقف المُعطاة. لنُجرّب الآن مثالاً للحصول على القيمة المُتناقصة في النطاق المُعطى.

زيادة القيم في النطاق باستخدام خطوة موجبة

يمكن استخدام المعامل step في الدالة range() لزيادة أو إنقاص القيم. القيمة الافتراضية هي قيمة موجبة، وهي 1، لذا ستُعطي دائمًا قيمًا متزايدة.

يجب أن تكون قيمة الخطوة موجبة في حال كنت تريد قيمًا متزايدة كناتج.

for i in range(1, 30, 5):
    print(i, end =" ")

الإخراج:

1 6 11 16 21 26

Reverse المدى: إنقاص القيم باستخدام خطوة سالبة

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

for i in range(15, 5, -1):
    print(i, end =" ")

الإخراج:

15 14 13 12 11 10 9 8 7 6

القيمة الابتدائية هي 15، والقيمة النهائية هي 5، وقيمة الخطوة هي عدد سالب، أي -1. باستخدام المدخلات المذكورة أعلاه، ستقوم دالة range() بإنقاص القيمة من 15 فصاعدًا حتى تصل إلى القيمة النهائية، ولكن الفرق هنا هو أن القيمة الأخيرة ستكون القيمة النهائية + 1.

استخدام الأرقام العائمة في Python نطاق()

دعونا الآن نعمل على range() باستخدام أرقام ذات فاصلة عائمة.

على سبيل المثال:

for i in range(10.5):
    print(i, end =" ")

في المثال أعلاه، استخدمنا قيمة الإيقاف 10.5.

الناتج هو:

Traceback (most recent call last):
  File "python_range.py", line 1, in <module>
    for i in range(10.5):
TypeError: 'float' object cannot be interpreted as an integer

Python يُظهر خطأً لأن الدالة range() لا تدعم الأرقام العشرية للبداية والنهاية والخطوة.

استخدام for-loop مع Python نطاق()

في هذا المثال، سنستخدم مصفوفة من الأرقام وسنرى كيفية تكرار المصفوفة داخل حلقة for باستخدام range().

على سبيل المثال:

arr_list = ['Mysql', 'Mongodb', 'PostgreSQL', 'Firebase']

for i in range(len(arr_list)):
    print(arr_list[i], end =" ")

الإخراج:

MysqlMongodb PostgreSQL Firebase

في المثال أعلاه، استخدمنا طول المصفوفة `arr_list` كقيمة توقف. ستستمر حلقة التكرار `for` في التكرار حتى تصل إلى قيمة التوقف، أي طول المصفوفة، والذي سيكون 4، لأن لدينا أربعة عناصر في `arr_list`. ستكون قيمة البداية 0 والخطوة 1، لذا ستبدأ القيم من 0 وتتوقف عند 3، أي طول المصفوفة ناقص 1، مما يعني أن 4 - 1 = 3.

باستخدام Python range() كقائمة

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

على سبيل المثال:

print(list(range(10)))

الإخراج:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

يمكنك أن ترى أن الإخراج هو تنسيق قائمة. لم يكن من الضروري تكرار النطاق () واستخدام طريقة القائمة () يمكننا تحويل الإخراج مباشرة من تنسيق النطاق إلى تنسيق القائمة.

استخدام الأحرف في نطاق بيثون ()

حتى الآن، استخدمنا الأعداد الصحيحة في بايثون range(). كما رأينا أن الأعداد العشرية غير مدعومة في بايثون range. دعنا نحاول رؤية النتيجة فيما يتعلق بما يحدث عندما نستخدم الأحرف.

على سبيل المثال:

for c in range ('z'):
        print(c, end =" ")

الإخراج:

Traceback (most recent call last):
  File "python_range.py", line 1, in <module>
    for c in range ('z'):
TypeError: 'str' object cannot be interpreted as an integer

يلقي خطأ يقول أنه لا يمكن تفسير السلسلة على أنها عدد صحيح.

للحصول على قائمة الحروف الهجائية يمكنك تخصيص الكود والحصول على المخرجات المطلوبة كما هو موضح أدناه:

على سبيل المثال:

def get_alphabets(startletter, stopletter, step):
    for c in range(ord(startletter.lower()), ord(stopletter.lower()), step):
        yield chr(c)

print(list(get_alphabets("a", "h", 1)))

الإخراج:

['a', 'b', 'c', 'd', 'e', 'f', 'g']

كيفية الوصول إلى عناصر النطاق

يمكنك الاستفادة من حلقة for للحصول على القيم من النطاق أو استخدام الفهرس للوصول إلى العناصر من النطاق ().

باستخدام للحلقة

على سبيل المثال:

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

الإخراج:

0
1
2
3
4
5

باستخدام الفهرس

يتم استخدام الفهرس مع النطاق للحصول على القيمة المتاحة في هذا الموضع. إذا كانت قيمة النطاق هي 5، للحصول على قيمة البداية، يمكنك استخدام النطاق (5)[0] ونطاق القيمة التالي (5)[1] وما إلى ذلك.

على سبيل المثال:

startvalue = range(5)[0] 
print("The first element in range is = ", startvalue) 

secondvalue = range(5)[1] 
print("The second element in range is = ", secondvalue) 

lastvalue = range(5)[-1]
print("The first element in range is = ", lastvalue)

الإخراج:

The first element in range is =  0
The second element in range is =  1
The first element in range is =  4

باستخدام القائمة ()

ستقوم هذه الطريقة بطباعة كافة العناصر من النطاق (). باستخدام list() سيتم إرجاع العناصر من range() بتنسيق القائمة.

على سبيل المثال:

print(list(range(10)))

الإخراج:

 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

أنه يعطي إخراج القائمة للنطاق المحدد.

مثال: الحصول على أرقام زوجية باستخدام range()

باستخدام الدالة range()، ستحصل على قائمة بالأعداد الزوجية ضمن النطاق المُعطى كمدخل. معاملات الدالة range() هي: البداية 2، النهاية 20، والخطوة 2، لذا ستتم زيادة القيم بمقدار 2 وستحصل على أعداد زوجية حتى النهاية ناقص 2.

على سبيل المثال:

for i in range(2, 20, 2):
    print(i, end =" ")

الإخراج:

2 4 6 8 10 12 14 16 18

دمج مخرجات النطاقين ().

في هذا المثال، سنقوم بربط دالتين range() بمساعدة دالة chain() من وحدة itertools.

على سبيل المثال:

from itertools import chain

print("Merging two range into one")
frange =chain(range(10), range(10, 20, 1))
for i in frange:
    print(i, end=" ")

الإخراج:

Merging two range into one
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

استخدام النطاق () مع NumPy

تحتوي وحدة NumPy على دالة arange() التي تعمل وتعطي مخرجات مشابهة لدالة range(). تأخذ دالة arange() نفس المعاملات التي تأخذها دالة range().

بناء الجملة:

arange(start, stop, step)

للعمل مع NumPy، اتبع الخطوات الموضحة أدناه.

الخطوة 1:: استيراد وحدة NumPy

import numpy

في حال ظهور خطأ أثناء التنفيذ يقول "لم يتم العثور على وحدة numpy"، فأنت بحاجة إلى تثبيت الوحدة كما هو موضح في الخطوة 2.

الخطوة 2:قم بتثبيت NumPy

pip install numpy

الخطوة 3:: مثال عملي على arange() باستخدام NumPy

import numpy as np

for  i in np.arange(10):
   print(i, end =" ")  

الإخراج:

0 1 2 3 4 5 6 7 8 9

الأرقام ذات الفاصلة العائمة باستخدام NumPy arange()

لا يمكن الحصول على سلسلة الأعداد العشرية باستخدام الدالة range()، ولكن يمكن الحصول عليها باستخدام الدالة arange() في NumPy.

على سبيل المثال:

النطاق المطلوب هو من 0.5 إلى 1.5. ستتم زيادة القيمة بمقدار 0.2.

import numpy as np

for  i in np.arange(0.5, 1.5, 0.2):
   print(i, end =" ")  

الإخراج:

0.5 0.7 0.8999999999999999 1.0999999999999999 1.2999999999999998

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

الأسئلة الشائعة

In Python 3. تُعيد الدالة range() كائن نطاق غير قابل للتغيير، وليس قائمة. فهي تُولّد الأرقام عند الطلب. استخدم list(range(n)) عند الحاجة إلى قائمة فعلية. Python 2 أعاد قائمة كاملة.

قيمة التوقف حصرية بحيث يتم ربط range(len(items)) بسلاسة بالفهارس التي تبدأ من الصفر. لتضمين نقطة النهاية، أضف واحدًا إلى قيمة التوقف، على سبيل المثال range(1, 11) للعد من 1 إلى 10.

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

ترفض الدالة range() الأعداد العشرية، لكن يمكن لبنية القائمة أن تُغيّر حجم الأعداد الصحيحة: [x * 0.5 for x in range(0, 6)] تُنتج من 0.0 إلى 2.5. هذا يُغني عن استيراد NumPy مع الحفاظ على الخطوة.ping من خلال القيم العشرية.

نعم. يخزن كائن النطاق قيم البداية والنهاية والخطوة فقط، لذا فإن range(1000000) يستخدم نفس القدر الضئيل والثابت من الذاكرة مثل range(10). يتم حساب القيم واحدة تلو الأخرى أثناء التكرار.

استخدم عامل التشغيل in: 5 in range(0, 10) تُرجع القيمة True. بالنسبة لكائنات النطاق، Python يقوم هذا الاختبار الخاص بالعضوية بإجراء عمليات حسابية سريعة في وقت ثابت بدلاً من فحص كل عنصر، لذلك يظل فعالاً على نطاقات ضخمة.

تستخدم أكواد التعلم الآلي الدالة range() للتكرار عبر دورات التدريب، وتكرار الدفعات الصغيرة، وبناء شبكات المعلمات الفائقة. وتُوسّع الدالتان arange() وlinspace() في مكتبة NumPy نطاقات الأرقام العشرية لجداول معدل التعلم وعمليات مسح العتبة الشائعة في تجارب الذكاء الاصطناعي.

نعم. يمكن لمساعدي البرمجة بالذكاء الاصطناعي مثل GitHub Copilot إكمال الحلقات القائمة على النطاق () تلقائيًا من تعليق أو اسم دالة، ويمكن للأدوات الآلية إعادة هيكلة حلقات الفهرسة إلى أنماط enumerate () أو أنماط الفهم بشكل أنظف، على الرغم من أن الحدود التي تم إنشاؤها لا تزال بحاجة إلى مراجعة سريعة.

تلخيص هذه التدوينة بـ: