פונקציית Range

הפונקציה range היא אחת מהפונקציות השימושיות והנפוצות ביותר בפייתון. range עושה דבר מאוד פשוט – מייצרת טווח של מספרים ומחזירה אותם כרשימה. רשימה היא מבנה נתונים מסוים בפייתון ועל רשימות אסביר בהרחבה בהמשך. כרגע מה שחשוב לדעת זה שרשימה היא טיפוס נתונים (ממש כמו מספר, או מחרוזת) המסוגל להכיל מספר רב של ערכים. אפשר לחשוב על רשימה כעל מחסנית (או מערך, אם אתם מגיעים משפות תכנות אחרות) באורך בלתי מוגבל שאליה אפשר להכניס (או להוציא) ערכים.

כתיבת פונקציית range

כמו שאפשר לראות, הפונקציה מחזירה רשימה של ערכים רציפים מ-0 ועד המספר שניתן לה כפרמטר (לא כולל). זאת אומרת שכשאנחנו נותנים לפונקציה range את המספר 10 נקבל את הערכים 0 עד 9. חשוב לזכור שהערך האחרון לא נכלל ברשימה ש-range מחזירה, וזה מתקשר לעיקרון חשוב שכבר ראינו – רצפים בפייתון מתחילים ב-0 וזה כולל גם רצפים שניצור באמצעות הפונקציה range. אם בכל זאת נרצה ליצור רצף שלא מתחיל ב-0, אפשר לספק לפונקציה פרמטר נוסף. כאשר היא מקבלת שני פרמטרים הראשון ישמש כנקודת התחלה והשני כנקודת הסיום.

במקרה כזה יש להקפיד שהפרמטר השני גדול מהראשון, אחרת נקבל רשימה ריקה

נוכל גם להשתמש בזוג פרמטרים כדי לייצר טווח מספרים שלילי

כל הטווחים האלה מתקדמים כברירת מחדל בקפיצות של 1. אפשר לשנות זאת בעזרת פרמטר שלישי

בדוגמה הזאת יצרנו טווח שמתחיל במספר 20 ומגיע עד 55 בקפיצות של 5. מכיוון שהערך האחרון לא מופיע בטווח הרשימה נעצרת ב-50.
range יכולה ליצור רצפים של מספרים בלבד, כל טיפוס אחר שננסה לתת כפרמטר יוביל לשגיאה

אבל כן נוכל להשתמש במשתנים, כל עוד הם מספריים כמובן

פונקציית xrange

כשאנחנו משתמשים בפונקציה range, פייתון מייצרת רשימת ערכים אשר מאוחסנת בזיכרון של המחשב. כשעובדים עם מספר קטן של ערכים (כמו בדוגמאות שראינו) אין לזה השפעה, אבל אם נרצה ליצור טווח המורכב מכמות גדולה מאוד של ערכים אנחנו עלולים להעמיס על הזיכרון ובכך לפגוע בביצועים של התכנית. בעוד שלפעמים נצטרך לאחסן את הערכים האלה לשימוש מאוחר יותר, בהרבה מקרים נזדקק לרשימת המספרים רק לצורך "ריצה" על הערכים בלולאה (אפרט על לולאות בפוסט הבא). במקרה כזה השימוש ברשימה ש-range מייצרת הוא טכני בלבד ולכן אין לנו צורך מיוחד לשמור את הערכים ולכן נעדיף להשתמש בפונקציה xrange.

xrange עובדת באופן מאוד דומה ל-range. בדוגמה הזאת אנחנו מעוניינים ליצור רצף מספרים אשר מכיל את כל המספרים מ-10 עד 100 בקפיצות של 5. אבל אם ננסה להדפיס את רשימת הערכים שנוצרה, לא ממש נקבל את מה שציפינו לו.

בעוד ש-range מייצרת רשימת ערכים מטיפוס list, שאותה המחשב צריך להחזיק בזיכרון, xrange מייצרת טיפוס נתונים שונה (שבאופן לא מפתיע נקרא xrange) שהוא אובייקט "מחולל ערכים" (generator). הכוונה היא שהאובייקט הזה לא שומר את כל הערכים מראש אלא מייצר אותם באופן דינמי כאשר יש צורך וכך אין צורך לשמור שום ערך בזיכרון. מסיבה זו אנחנו יכולים לבצע "ריצה" סדורה על הערכים בצורת לולאה, או לבקש בכל פעם רק את הערך הבא, אבל אין לפייתון אפשרות להציג את כל הערכים בבת אחת כמו שהוא מציג את הרשימה.

אז למתי זה טוב? כשנרצה לייצר סטים גדולים במיוחד של מספרים לצורך איטרציה (מעבר סדור על הערכים הללו), עדיף להשתמש ב-xrange כדי לחסוך את המקום בזיכרון. זה מה שחשוב להבין כרגע, בהמשך נדבר עוד על מחוללי ערכים ואיטרציות.

Python 3

בגדול, הגישה של xrange נחשבת לנכונה יותר: אין טעם להחזיק בנקודת זמן אחת את כל הערכים כאשר אפשר כל פעם פשוט לייצר את הערך הבא ולעבוד רק איתו. מהסיבה הזאת range נחשבת ללא יעילה ובפייתון 3 זנחו את השיטה הזאת לגמרי. מה שקורה בפועל הוא שבפייתון 3 range היא מחולל (generator). אז אם אתם משתמשים בפייתון 3 אתם פשוט כותבים range והיא מתנהגת כמו xrange בפייתון 2. וכמובן ש-xrange לא קיימת בכלל.