Professional Documents
Culture Documents
חוברת פייתון
חוברת פייתון
.............................
..........
3 ................................................................ פרק _:1מבוא
..........................
....
3 ................................................................................................ מהי ?Python
......................
3................................................................................................ Pythonלעומת C
......................
3 ................................................................................................ הפעלת Python
.....................
5.. ................................ פרק _:2ה Interpreter-ומאחורי הקלעים
................................
................
5 ................................................................ משחקים עם הInterpreter-
...............................
.........
5 ................................................................ משתנים והשמות ()Assignments
.................
................................
7 ................................................................ איך Pythonעובד (מימוש)
............................
.........
8 ................................ פרק _:3טיפוסי נתונים ואופרטורים
...............................
.........
8 ................................................................................................ מספרים
................................
........
10 ................................................................................................ מחרוזות
........................
................................
11 ................................................................ מחרוזות Unicode
................................
........
11 ................................................................................................ רשימות
................................
...........
12 ................................................................................................ Tuples
................................
.........
13 ................................................................................................ מילונים
.....................
15................................................................ פרק _:4בקרת זרימה
..................
................................
15 ................................................................................................ if
................................
............
15 ................................................................................................ while
................
................................
15 ................................................................................................ for
.........................
17. ................................................................................................ range, xrange
........................
18................................................................................................ break, continue
................................
.............
18 ................................................................................................ pass
.....................
19 ................................................................ פרק _:5קלט ופלט
........................
19................................................................................................ הדפסה למסך
........................
................................
19 ................................................................ קלט מהמקלדת
................................
..........
19 ................................................................................................ קבצים
.......................
21.. ................................................................ פרק _:6פונקציות
........................
................................
21 ................................................................ הגדרת פונקציות
........................
21
................................................................................................ passבפונקציות
..............................
......
21 ................................................................................................ פרמטרים
................................
...........
23 ................................................................................................ תיעוד
.......................
................................
23 ................................................................ משתנים בפונקציות
................................
.............
24 ................................................................ החזרת -Tupleים מפונקציה
.............................
........
25 ................................ פרק map, reduce, filter, lambda_:7
................................
..............
25 ................................................................................................ map
................................
..........
25 ................................................................................................ reduce
................................
.............
25 ................................................................................................ filter
................................
..........
26 ................................................................................................ lambda
...........................
26
... ................................................................ שימוש ב reduce ,map-ו filter-ביחד
........................
................................
27 ................................................................ מילה על יעילות
........................
28... ................................................................ פרק _:8מודולים
...........................
28
... ................................................................................................ מהו מודול?
.........................
28. ................................................................ אוסף פונקציות שנמצא בקובץ אחר
..............................
......
29 ................................................................ הרצת קבצי Pythonכמו תוכניות
................................
...............
29 ................................................................ כתיבת מודולים של ממש
................
................................
30 ................................................................ מודולים מובנים בPython-
................
................................
30 ................................................................................................ dir
.....................
................................
31 ................................ פרק :_9ספריות נפוצות
.............................
.....
31 ................................................................................................ os ספריית
...........................
32
... ................................................................................................ sys ספריית
........................
32 ................................................................................................ string ספריית
.........................
32. ................................................................................................ math ספריית
פרק _:1מבוא
מהי ?Python
Pythonנוצרה בשנות ה90 - Pythonהיא שפת Scriptingנוחה לשימוש שהפכה למאוד פופולרית בשנים האחרונות.
המוקדמות ע"י גידו ואן רוסם ( )Guido van Rossumב ,Stichting Mathematisch Centrum -כשפת המשך לשפה שנקראה
.ABCבשנת 1995גידו המשיך את פיתוח בחברה ששמה ,)CNRI ( Corporation for National Research Initiativesואף
2000גידו וצוות הפיתוח של Pythonעברו ל BeOpen.com -כדי לייסד את הוציא מספר גירסאות של השפה .במאי
Python Software " ."BeOpen Python Labs teamבאוקטובר 2000בצוות עבר ל ,Digital Creations -וב 2001 -נוסד
,)PSF ( Foundationשהוא ארגון ללא מטרות רווח Digital Creations .היא אחת המממנות של .PSFכל מה שקשור ל -
Pythonהוא ,Open Sourceכלומר הקוד פתוח ונגיש לכולם ,ולכל אחד מותר לבצע בו שינויים ולהפיצו מחדש .אתר
הבית של PSFהוא .http://www.python.org/psf/
כאשר אומרים "שפת "Scriptingמתכוונים שאין צורך בהידור ( )Compilationוקישור ( )Linkageשל תוכניות .בPython -
פשוט כותבים ומריצים .כל סביבת עבודה של Pythonמגיעה עם Interpreterשמאפשר כתיבה ישירה של פקודות אליו,
אפילו בלי צורך לכתוב תוכנית או קובץ .בצורה כזו מאוד נוח להתנסות בשפה ,לבצע חישובים מהירים (עוד תכונה חזקה
של )Pythonולבדוק דברים קטנים במהירות ,בלי הצורך לכתוב תוכנית שלמה.
ל Pythonיתרונות רבים על פני שפות Scriptingאחרות .ראשית Python ,פשוטה בהרבה ללימוד ,לקריאה ולכתיבה
משפות אחרות (שחלקן מתעללות במתכנת ובמי שצריך לקרוא קוד כתוב) Python .גורמת לקוד שכתוב בה להיראות
מסודר ,ברור ומובנה (נראה כיצד מאוחר יותר) .מודל המימוש של השפה ברור בהרבה ממימוש שפות אחרות ,ובכך
תורם להבנת השפה ולשליטה בה.
שנית Python ,מכיל בתוכו אוסף מכובד מאד של ספריות סטנדרטיות ,כלומר ספריות שניתן להסתמך על קיומן בכל
,)zipתכנות לתקשורת מימוש של .Pythonבין הכלים השימושיים ניתן למצוא יכולות התמודדות עם קבצים דחוסים (
,TCP/IPכלים מרובים לתכנות בסביבת האינטרנט ,ממשק משתמש גרפי ( ,)GUIספריות לטיפול בטקסט ומחרוזות (כמו
כן עיבוד טקסטואלי למיניו) ,עבודה עם פונקציות מתקדמות של מערכת ההפעלה ,תמיכה בתכנות מבוזר ( Distributed
Python ,)Developmentיכולת טיפול אינטנסיבית בקבצי XMLונגזרותיהם ,ועוד הרבה הרבה הרבה דברים! כמו כן
מטפלת במידע בינארי (מידע שאינו טקסטואלי) בצורה הרבה יותר טובה משפות מתחרות.
בנוסף ,כמו שניתן לכתוב תוכניות קטנות ב ,Python -קיימים בה כלים לכתיבת תוכניות גדולות ,ואף מודולים שלמים.
Pythonתומכת בתכנות מכוון עצמים ( ,)OOPחריגות ( ,)Exceptionsמבני נתונים ( )Data Structuresוקישוריות גם ל ,C -או
כל שפה שניתן לקרוא לה מ.C-
דבר נוסף שכדאי לדעת על Pythonהוא שיש לה מספר גרסאות .אמנם יש תאימות לאחור ,אבל בגרסאות החדשות
( 2.0ומעלה) יש הרבה תכונות חדשות ונוחות לשימוש .בחוברת זו נלמד את גרסה ( 2.2גרסה 2.3יצאה לאוויר העולם
בזמן כתיבת שורות אלה ממש)
Pythonלעומת C
אוקיי ,אז Pythonהיא שפה מגניבה שמאפשרת לעשות הרבה דברים בקלות ובמהירות ,לא צריך להסתבך עם
קומפיילרים ולינקרים ואפילו אפשר לא לכתוב את התוכניות בקבצים אם רוצים .אבל ,זה לא אומר שמפסיקים
להשתמש ב:C-
בראש ובראשונה Python ,היא שפת – Scriptingמה שאומר ש Python -רצה לאט יותר מ .C -כאשר נעדיף ביצועים על
מהירות כתיבת הקוד (או נוחות הכתיבה) ,נשתמש ב ,Pascal ,C -או כל שפה מקומפלת אחרת .בנוסף ,ניתן לכתוב
מודולי הרחבה ל Python-באמצעות Cו ,C++-ולכן שפות אלה הן בעלות שימוש רב גם בעת העבודה עם .Python
הפעלת Python
דבר אחרון שנעשה במבוא המצומצם שלנו הוא להפעיל את .Python
כיום Python ,מופצת יחד עם כל ה-Distribution -ים הפופולריים של ,RedHat, Slackware, Corel, Debian ( Linuxועוד,)...
וניתן להוריד סביבות פיתוח של Pythonל( Windows-למשל ActivePythonשל ,ActiveStateגירסה 2.2ומעלה).
כמו כן ,ניתן לבקר באתר www.python.orgולמצוא שם גרסאות מוכנות ל – Windowsכולל התקנה נוחה ופשוטה.
pythonמהלינוקס שימו לב :הנכם מקבלים ,בנוסף לחוברת זו ,גם חוברת ודיסק של לינוקס .ניתן להפעיל את
שקיבלתם.
כדי להפעיל את Pythonבלינוקס ,פשוט מקלידים את הפקודה pythonב console-ומקבלים את ה prompt-של :Python
$ python
)Python 2.2.1 (#2, May 1 2002, 17:17:17
[GCC 2.95.2 19991024 (release)] on shrubbery
Type “help”, “copyright”, “credits” or “license” for more information.
>>>
כדי להפעיל את Pythonמחלונות ,צריך כמובן להתקין את אחת מסביבות העבודה שקיימות כיום לחלונות .אם התקנת
את הסביבה המצויינת למעלה ,ניתן להפעיל את הסביבה מStart Programs ActiveState ActivePython Python -
.Interpreter Shell
במהלך כל החוברת ,הדוגמאות שיירשמו יילקחו מסביבת העבודה בלינוקס ,אבל אין שום הבדל בין שתי סביבות
העבודה (בהנחה שעובדים עם גירסה עדכנית – 2.2ומעלה).
חשוב מאוד! חוברת זו מלמדת את גירסה 2.2של ,Pythonולכן כאשר אתם מורידים גירסה של ,Pythonיש לבדוק שזו
גירסה 2.2ומעלה.
פרק _:2ה Interpreter-ומאחורי הקלעים
משחקים עם הInterpreter-
אחרי שהפעלנו את ,Pythonהגיע הזמן להתחיל לשחק איתו קצת...
בהנחה שהפעלת את התוכנה הנכונה ,על המסך מופיע ה prompt -של – Pythonסימן של שלושה חיצים:
>>>
ב prompt-הזה ניתן למעשה לכתוב כל פקודת ,Pythonוהיא תורץ כל עוד היא חוקית ותקינה.
אבל הדבר הראשון שננסה הוא לא פקודה ,אלא ביטוי .נרשום את הביטוי :1+1
>>> 1+1
2
הביטוי נכון ,אבל זה לא ממש מרשים ...אמרנו של Python-יש יכולות חישוב מהירות .בואו ננסה משהו קצת יותר מסובך:
>>> 2L**2**2**2**2
2Lבמקום 2רגיל) יופיע בפרק על טיפוסי את התוצאה כבר לא נרשום כאן ...הסבר מלא על השורה (ולמה רשמנו
נתונים .אם הרצת את השורה האחרונה על המחשב שלך ,לקח לו כמה שניות להגיע לתוצאה ,אבל הוא כתב על המסך
ממש הרבה מספרים .מה שעשינו בשורה האחרונה היה:
>>> 1+1
2
>>> _+2
4
>>> _
4
>>> _**2
16
>>> x=5
)>>> type(x
>‟<type „int
בדוגמה הזאת נוצר משתנה בשם ,xוערכו ההתחלתי הוא .5כיוון ש 5 -הוא מספר שלם (יש לשים לב להבדל בין 5ל-
,5.0כמו ב )C-סוג המשתנה הוא .int
את סוג המשתנה מקבלים באמצעות הפונקצייה המובנית ,typeהמקבלת בסוגריים את המשתנה ומחזירה את הסוג
שלו.
כאשר מציבים למשתנה ערך חדש ,גם סוג המשתנה מתעדכן בהתאם .אם xהיה intעד עכשיו ,ונציב לתוכו ערך חדש,
סוג המשתנה ישתנה בהתאם לערך החדש:
>>> x=5.0
)>>> type(x
>‟<type „float
>>> x=5
>>> y=x
>>> y
5
בנוסף ,כדי להדפיס ערך של משתנה ,ניתן להשתמש בפקודה ( printזה כבר שימושי בתוך תוכניות ,לא ב:)Interpreter-
הפקודה ,printבנוסף לפקודות אחרות (יש להבדיל בין פקודות לבין פונקציות) מופיעה ללא סוגריים .זאת משום שזו
פקודה ולא פונקציה .ההבדל בין פונקציה לפקודה הוא שפקודה היא כל מילת מפתח של Pythonשאיתה כותבים את
בקרת הזרימה של התוכנית (הכוונה לפקודות ,print ,while ,ifוכו') .פונקציה היא אוסף של פקודות ,פונקציות אחרות
ופונקציות מובנות שאותן אספנו ביחד כדי ליצור פעולה בסיסית.
נקודה נוספת שיש לציין היא ש Python -היא ,Case-Sensitiveכלומר יש הבדל בין משתנה בשם aלבין משתנה בשם – A
אלו הם שני משתנים שונים ,משום שהאות Aאיננה האות .aחוקים אלה הם כמו החוקים של .C
בנוסף לטיפוסים המוכרים ב ,C -ב Python-יש מספר טיפוסים מובנים ( )Built Inנוספים (את כולם נסקור בפרק הבא).
אחד מהם הוא רשימה .יצירה רשימה נעשית באופן הבא:
כעת יש רשימה בשם ( lהאות Lקטנה) שמכילה את המספרים .3 ,2 ,1האינדקס של האיבר הראשון הוא אפס ,וניתן
להתייחס לרשימה כולה או לאיבר בודד בה:
>>> l
][1, 2, 3
]>>> l[0
1
כפי שניתן לראות ,יצרנו רשימה במשתנה ,xוהשמנו אותה למשתנה .yכתוצאה מכך ,לא נוצרה רשימה חדשה ,אלא
הצבעה לרשימה הקיימת .כאשר שינינו את הרשימה הקיימת ,כל מי שהצביע אליה הושפע מכך.
פרק _:3טיפוסי נתונים ואופרטורים
מספרים
אז נתחיל ממספרים ,הטיפוס הפשוט ביותר .מספר יכול להיות שלם ,עשרוני או ארוך ,כאשר יש הבדל ברור בין שלושת
סוגי המספרים ,ולכל-אחד מהסוגים האלה יש typeמיוחד משלו .ה type -של מספר שלם הוא ‘ ,’intה type -של מספר
עשרוני הוא ‘ ’floatוה type -של מספר ארוך הוא ‘ ( ’long intהכוונה ב type -היא לסוג המשתנה שמוחזר ע"י הפונקצייה
המובנית )(.)type
מספרים שלמים הם אותם משתני 32-bitבעלי סימן מ .C-הגבול שלהם הוא +2,147,483,647עד .-2,147,483,648
מספר שלם הוא כל מספר שלם שאין לו תוספות אחריו (שבר עשרוני ,או אותיות בעלות משמעות ,אותן נראה בהמשך)
ושאינו חורג מהתחום הנ"ל .אם מנסים להכריז על מספר שלם שחורג מהתחום ,מוצגת הודעה שגיאה:
>>> 4389678923476892347
OverflowError: integer literal too large
כמו כן ,אם כבר קיים משתנה שלם ומנסים לחשב באמצעותו ערך שחורג מהתחום של משתנה שלם ,גם אז מוצגת
הודעת שגיאה:
>>> 2**30
1073741824 הסבר :חישבנו את 2בחזקת ,30ועל-ידי כך הפכנו את
>>> _*2 המשתנה המחזיק את התוצאה האחרונה ( _ ) להיות מספר
Traceback (most recent call last): שלם רגיל שמחזיק את 2בחזקת .30
? File “<stdin>”, line 1, in כאשר ניסינו להכפיל אותו ב ,2 -כלומר לחשב את 2בחזקת
OverflowError: integer multiplication ,31התרחש Overflowבגלל חריגה מהתחום המותר.
Overflowויצירת כלומר ,מספרים שלמים מתנהגים כמו ב C -מבחינת גבולות וייצוג ,למרות שיש הגנות מסוימות מפני
מספרים "לא הגיוניים".
עקב מגבלות אלה ,ב Python-קיים טיפוס המסוגל לייצג מספר שלם בכל גודל שהוא (!) .השימוש במספר שלם ארוך
זהה לשימוש במספר שלם רגיל ,וההבדל היחיד הוא בהצהרה על המספר השלם הגדול.
הכוונה ב"כל גודל שהוא" היא ש Python-דואגת לשמור משתנה בגודל הדרוש כך שיחזיק את כל המספר ,ודואגת
לשנות את גודל המשתנה בהתאם עם כל שינוי של ערך המספר.
Lאחרי המספר ( Lעבור יצירת משתנה ארוך דומה מאוד ליצירת משתנה שלם רגיל .ההבדל היחיד הוא הוספת האות
Lגדולה – הרבה יותר ברור .)Longאין משמעות להוספת Lקטנה או גדולה ,אבל מומלץ בתור הרגל לכתוב תמיד
שהכוונה ליצירת מספר ארוך ,ולא הספרה אחת (.)1
>>> 2L
2L
32-bit ברגע זה נוצר משתנה ארוך (המאוחסן ב .)_-כאמור ,ייצוג משתנה זה בזיכרון שונה מאוד מהייצוג של מספרי
רגילים .עכשיו נחשב את 2בחזקת ,64דבר שאי-אפשר לעשות עם משתנים רגילים:
>>> 2L**64
18446744073709551616L
וכמובן ,אפשר לעשות עוד המון חישובים ארוכים ,ולהראות איך ש Python-יודע לרשום ממש הרבה מספרים על
המסך...
דבר שחשוב לציין הוא שבדוגמה האחרונה חושב המספר 2בחזקת .64במבוא (פרק קודם) נרשמה דוגמה ובה חושב 2
בחזקת 2בחזקת ...( 2ככה 5פעמים) .הדוגמה תעבוד על Pythonבגרסאות של 2.2ומעלה ,אבל לא תעבוד על
גרסאות 2.0ו 2.1 -אם לא יירשם 2Lבמפורש .הסיבה היא ש Python -בגרסאות הישנות לא מאפשר מעבר אוטומאטי בין
Pythonבגירסאות 2.2 שלמים רגילים לשלמים ארוכים ,ולכן יש לציין במפורש מתי משתמשים בשלמים ארוכים .ב-
ומעלה יש המרה אוטומאטית למספר שלם ארוך כאשר מתבצעת גלישה .לכן ,תמיד עדיף להוסיף Lאחרי המספר ,כדי
להיות בטוחים שתוכניות ה Python-ירוצו כמו שצריך על כל גירסא (כמובן ,רק אם יש צורך במספר ארוך).
סוג המשתנה הבא והאחרון לסעיף זה הוא המספר העשרוני .ייצוג המספר העשרוני שונה ממספר שלם ,ולכן חלות עליו
מגבלות מסוימות .גם למספר עשרוני יש גבולות (הגבולות תלויים במימוש של המספר העשרוני – האם זה מספר
עשרוני של 32-bitאו של ,)64-bitאבל אין לו טיפוס מקביל לשם הארוך.
יצירת משתנה עשרוני היא כמו ב ,C -ע"י כתיבת מספר עם נקודה עשרונית ושבר (אפשר שבר ,0רק כדי להצהיר שזה
מספר עשרוני).
>>> 21.0
21.0
כמו כן ,כאשר משלבים בחישוב מסוים מספר עשרוני ,התוצאה הופכת אוטומטית להיות עשרונית ,אלא אם כן
משתמשים באחת מפונקציות ה( casting -אותן נראה בהמשך).
>>> 1.0/2
0.5
כאשר משלבים בחישוב מספר ארוך ומספר עשרוני יכול להיווצר מקרה בו התוצאה גדולה מדי כדי להיות מיוצגת בצורה
עשרונית .אם ניתן לחשב את התוצאה ולאחסן אותה ,לא תהיה שום בעיה:
>>> 21L/7.0
3.0
אבל אם לוקחים מספר ממש ממש ארוך ומבצעים חישוב עם מספר עשרוני ,תיווצר שגיאה:
>>> 0xBEE
3054
Pythonכמובן יציג את המספר בייצוג עשרוני ,וזוהי דרך מצויינת להמיר מבסיס לבסיס ממש מהר .אפשר לעשות גם את
הפעולה ההפוכה ,בעזרת הפונקצייה המובנית )( hexשמקבלת מספר ומחזירה מחרוזת המכילה את המספר בייצוג
הקסהדצימלי:
>>> 0xBEE
3054
)_(>>> hex
‟„0xbee
ייצוג מספרים בבסיס )Octal( 8נעשה ע"י הוספת אפס לפני המספר אותו רוצים לייצג.
>>> 045
37
כמו הפונקצייה )( ,hexקיימת פונקצייה מובנית בשם )( octשממירה מספר דצימלי למחרוזת בייצוג אוקטלי:
)>>> oct(45
‟„055
אופרטורים :בתת -סעיף זה נראה את כל האופרטורים שיכולים לפעול על מספרים .יש לשים לב כי יש אופרטורים
שפועלים בין מספרים לבין טיפוסים אחרים ,אבל כאן נציג רק את האופרטורים הקשורים למספרים.
.Cכלומר ,כאשר יש פעולה בין 2אופרנדים זהים ,התוצאה היא חיבור ( ,)+חיסור ( )-וכפל (*) פועלים כמו בשפת
מהסוג של האופרנדים .כאשר האופרנדים לא זהים ,התוצאה תהיה מהטיפוס ה"יותר מתקדם" :בכל פעולה בה מעורב
מספר עשרוני התוצאה תהיה עשרונית .אם בפעולה לא מעורב משתנה עשרוני ,אבל מעורב משתנה ארוך ,התוצאה
תהיה ארוכה.
חילוק ( )/גם פועל כמו ב ,C -וכאשר ישנם טיפוסי נתונים שונים שמעורבים בחישוב ,הכלל לגבי חיבור חיסור וכפל קובע
גם כאן .כאשר יש חילוק בין שלמים ,התוצאה תמיד שלמה .לעומת זאת ,אם רוצים תוצאה עשרונית ,חייב להיות מעורב
מספר עשרוני.
אם רוצים לאלץ את Pythonלייצר תוצאה עשרונית ,אבל משתמשים רק במשתנים שלמים ,ניתן להשתמש בפונקצייה
)( floatכדי להמיר את אחד המשתנים השלמים למספר עשרוני ,ועל-ידי כך לגרום לתוצאה להיות עשרונית:
>>> x = 8
>>> y = 3
>>> x/y
2
>>> float(x) / y
2.6666666666666665
כמובן ,כדי לקבל תוצאה עשרונית נכונה בדוגמה האחרונה ,לא ניתן לעשות את הדבר הבא:
)>>> float(x/y
2.0
3ו ,6 -כי הם בסך-הכל שלמים שמיוצגים בצורה עשרונית .בדוגמה בדוגמה הראשונה חושב המודולו של המספרים
השניה חושב המודולו ההפוך (והתוצאה בהתאם).
בדוגמה השלישית לעומת זאת ,חושבה השארית של 2.5לחלק ל.3.5-
מחרוזות
מחרוזות ב Python-מיוצגות בצורה הפוכה מ :C -ב ,C -מחרוזת היא אוסף של תווים .ב ,Python -מחרוזת היא טיפוס נתונים
מובנה ,ותו הוא מחרוזת באורך .1ייצוג זה מקל מאוד על העבודה עם מחרוזות – מה שמצריך ב C -שימוש בפונקציות של
הספריה > <string.hמצריך כאן שורת קוד אחת קצרצרה.
בנוסף לכך ,קיימת ספריה ב Python-שנקראת ,stringובה הרבה פונקציות לטיפול מתקדם במחרוזות ,כך שלמעשה
טיפול במחרוזות הוא קל מאוד.
יצירת מחרוזת תיעשה באחת מהצורות הבאות:
כמו שניתן לראות ,מחרוזות ניתן ליצור בשתי צורות :המחרוזת נמצאת בין 2תווים של גרשיים או בין 2תווים של גרש
בודד .כמובן ,אם מחרוזת נמצאת בין 2תווים של גרשיים ,ניתן לכלול בה גרש בודד (בלי ‘\’) ,ולהפך .כמובן ,אפשר
להשתמש בתו ה ’\‘-כדי לכלול את התווים האלה במחרוזות.
כמו כן ,כל הצירופים של ‘\’ ותו אחריהם מ C -תקפים ב ’\n‘ :Python-לשורה חדשה ’\r‘ ,לתחילת השורה’\b‘ ,
לחזור תו אחד אחורה ’\t‘ ,עבור טאב ,וכו'...
כמו כן ,ב Python-יש מנגנון מובנה לפירמוט ( )Formattingשל מחרוזות (מה שעושה )( .)printfזה נעשה ע"י כתיבת כל
ה %-המוכרים כבר מ C-לתוך המחרוזת וכתיבת כל הפרמטרים אחרי המחרוזת:
בפועל ,אחרי המחרוזת יש את התו ‘ ,’%ואחריו אנחנו מעבירים ( Tupleהטיפוס יוצג בהמשך פרק זה) של כל הפרמטרים,
לפי הסדר .אם מעבירים מספר לא מדויק של פרמטרים (למשל ,רשמנו רק %dבמחרוזת ,והעברנו שני פרמטרים) ,יש
שגיאה .כמו כן ,אם מעבירים פרמטר שהוא לא מהסוג שהעברנו ב( % -מחרוזת עבור ,%dוכו') ,גם יש שגיאה.
פירמוט המחרוזות של Pythonהרבה יותר מוגן ונוח מזה של ,Cהוא לא מצריך קריאה לפונקציה ,וניתן להכניס אותו בכל
מקום ,אפילו בתוך קריאה לפונקציה (בפרמטר ,במקום להכניס סתם מחרוזת רגילה ,מכניסים מחרוזת מפורמטת):
כעת נסקור כמה פונקציות שימושיות מאוד .חלק מפונקציות אלה מובנות ב Python-עצמה ,וחלקן של טיפוס המחרוזת.
)( chrמקבלת כקלט מספר המייצג את ערך ה ASCII -של תו מסוים ,ומחזירה מחרוזת ובה תו אחד שערך ה ASCII -שלו
הוא הערך שקיבלה הפונקציה כפרמטר:
)>>> chr(97
‟„a
)>>> chr(65
‟„A
)( strלעומתה מקבלת משתנה ומנסה להמיר אותו למחרוזת .הפונקציה מסוגלת לקבל יותר מטיפוסים בסיסיים ,אפילו
רשימות ומילונים (נראה בהמשך):
)>>> str(1234
‟„1234
)]>>> str([1,2,3
‟]„[1, 2, 3
הפונקציה )( splitעושה דבר דומה ל split-ב ,Perl-כאשר היא מקבלת מחרוזת ותו ,ומפצלת את המחרוזת לרשימה ,כאשר
התו שהיא קיבלה מפריד בין האיברים ברשימת הפלט .לדוגמה:
הפונקציה )( ,joinלעומתה ,עושה בדיוק ההפך – היא מקבלת רשימה ,ומופעלת על מחרוזת .הפלט הוא מחרוזת
המורכבת מכל איברי הרשימה ,והמחרוזת הנתונה ביניהם:
,Pythonשכמו דבר שלא ניתן לעשות עם מחרוזות הוא לשנות את ערכו של תו בודד .הסיבה לכך נעוצה במימוש של
שכבר ציינו בנוי ממצביעים .מחרוזת היא מצביע לעצם שמכיל את המחרוזת .הביטוי הבא:
‟>>> s = „ugifletzet
]>>> s[1
‟„g
מחזיר תת-מחרוזת שמכילה רק תו אחד במחרוזת ,ולא מאפשר השמה לערך זה .אם נרצה לשנות את המחרוזת ,ניאלץ
להזין את המשתנה בערך חדש לגמרי.
בסעיף על רשימות נראה שבאמצעות Slicingניתן לקבל תת-מחרוזת (ולא רק תו אחד).
מחרוזות Unicode
דבר נוסף שנתמך ע"י Pythonהוא מחרוזות – Unicodeמחרוזות אלו הן מחרוזות בהן כל תו מיוצג ע"י שני בתים ,וכך ניתן
לייצג יותר תווים בטיפוס אחד .התמיכה ב Unicode -היא לא לשימוש שוטף ב ,Python -אלא יותר עבור תאימות עם
מודולים שיש להם ממשק הדורש .Unicode
מחרוזת Unicodeנוצרת בדיוק כמו מחרוזת רגילה ,רק שלפני המחרוזת יש את התו ‘:’u
רשימות
רשימה היא טיפוס שמחזיק טיפוסים אחרים ,שומר על הסדר שלהם ,מאפשר להוסיף ,להסיר ולקבל איברים מכל מקום
ברשימה ,וניתן לעבור על כל אחד מהאיברים שברשימה .ב ,Python -רשימה היא טיפוס מובנה ,ובנוסף ,רשימה אחת
יכולה להחזיק איזה טיפוס שנרצה ,ואפילו כמה סוגי טיפוסים בבת-אחת.
יצירת רשימה נעשית ע"י רשימה בה איבריה מופיעים בין סוגריים מרובעות:
]>>> x = x + [6
>>> x
][1, 2, 3, 4, 5, 6
)>>> x.append(6
>>> x
][1, 2, 3, 4, 5, 6
הדרך הראשונה יכולה לגרום להקצאה של רשימה חדשה – וזה בגלל שיכול להיות שנוצרת רשימה חדשה אליה
מוכנסים האיברים של שתי הרשימות המחוברות ,ובה משתמשים מאותו הרגע .הדרך השניה מבטיחה שלא תהיה יצירה
של רשימה חדשה ,אלא שימוש ברשימה הקיימת והוספת איבר אליה.
כמו כן ,ניתן "לשכפל" רשימה ,כלומר להעתיק את אותה הרשימה מספר פעמים:
>>> x * 3
][1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6
– Slicingאו בעברית "חיתוך" ,היא הפעולה בה אנחנו לוקחים רשימה קיימת ויוצרים ממנה רשימה חדשה ,ע"י חיתוך של
חלק מהרשימה המקורית .ה Slicing -נעשה ע"י ציון האינדקסים של תחילת וסיום החיתוך .לדוגמה ,הנה רשימה חדשה
שמורכבת מאינדקסים 1עד (לא כולל!) :3
]>>> x[1:3
][2, 3
המספר הראשון (לפני הנקודותיים) הוא האינדקס ממנו מתחיל החיתוך ,והמספר השני הוא האינדקס שבו יסתיים
החיתוך ,אבל הוא בעצמו לא ייכלל ברשימה הנוצרת.
מטעמי נוחות ,כאשר רוצים להעתיק קטע רשימה שמתחיל מיד בהתחלה שלה ,או מסתיים מיד בסופה ,אין צורך לציין
את האינדקס הראשון (תמיד )0או את האינדקס האחרון (תמיד אורך הרשימה) ,וניתן להשמיט אותו .לדוגמה ,הנה
הרשימה עד אינדקס :4
]>>> x[:4
][1, 2, 3, 4
]>>> x[4:
][5, 6
כמו כן ,כאשר משמיטים גם את התחלת הרשימה וגם את סופה ,מקבלים את כל הרשימה:
]>>> x[:
][1, 2, 3, 4, 5, 6
לכאורה זהו בזבוז מקום ,הרי ניתן לרשום סתם xולקבל את הרשימה כמו שהיא ,אבל מיד נראה למה זה טוב.
כמו שכבר ציינו מקודם ,ב Python-משתנים הם בסך-הכל מצביעים ,כלומר שם של משתנה הוא מצביע לטיפוס מסוים.
כאשר משתנה מצביע לטיפוס כלשהו – בין אם זה טיפוס מובנה או טיפוס שנוצר ע"י המשתמש (בהמשך החוברת נראה
כיצד עושים את זה) ,הוא מצביע לכתובת מסוימת בזיכרון .כאשר מבצעים השמה (עושים =) בין שני משתנים,
מעתיקה את המצביע ממשתנה אחד למשתנה והמשתנים הם לא מטיפוס "פשוט" (לא מספר) ,ההשמה למעשה
האחר.
בדוגמה הבאה ניצור רשימה בשם ,xנשים אותה במשתנה ,yנוסיף איבר לרשימה yונראה כיצד הרשימה xמשתנה גם
כן:
הדוגמה האחרונה מראה תכונה חזקה מאוד של – Pythonאין בה צורך במצביעים ,כיוון שאין מה משהו אחר ממצביעים.
ב Python-כל משתנה הוא מצביע ,והשמה היא העתקה של המצביע ,ולא התוכן (למעט מספרים ומחרוזות).
כאשר מעבירים פרמטרים לפונקציה ,הדבר עובד באותה הצורה – שינוי של פרמטר שיועבר לפונקציה הוא שינוי
המשתנה המקורי שהועבר לפונקציה.
תכונה זו מאוד נוחה ,אבל לפעמים נרצה ליצור עותק של משתנה קיים – מה נעשה אז? השיטה הכי טובה היא
להשתמש ב Slicing-אותו למדנו מקודם ,ובו ראינו שכאשר עושים Slicingשכולל את כל האיברים (בלי ציון התחלה ובלי
ציון סוף) ,נוצר עותק חדש של העצם המקורי .כעת נראה איך תתבצע ההשמה עם :Slicing
יש לציין שה Slicing-יעבוד עבור מחרוזות ,רשימות-Tuple ,ים ,וכל טיפוס סדרתי.
Tuples
Tupleהוא טיפוס של רשימה קבועה .הטיפוס נועד לשימוש במצבים בהם אין אפשרות ליצור רשימה ,או כאשר יש צורך
ברשימה שאורכה לא משתנה .כמו כן ,לא ניתן לשנות אף אחד מהאיברים ב.Tuple -
יצירת Tupleנעשית בדיוק כמו יצירת רשימה ,רק שבמקום סוגריים מרובעות משתמשים בסוגריים עגולות:
)>>> t = (1, 2, 3
>>> t
)(1, 2, 3
קבלת איבר מה Tuple-היא כמו איבר מרשימה – ע"י סוגריים מרובעות:
]>>> t[0
1
אבל אם ננסה לשנות איבר ברשימה ,לא יהיה ניתן לעשות זאת:
צריך לדעת שלא ניתן לחבר Tupleלרשימה ,משום שהם אינם טיפוסים מאותו הסוג.
בנוסף לחיבור ,ניתן לעשות Slicingעל :Tuple
ובדומה לרשימה ,השמת Tupleלא תיצור עותק שלו אלא תעביר מצביע .ליצירת עותק יש להשתמש ב.Slicing-
– Tuple Assignmentsכאשר מבצעים השמה בין שני -Tupleים Python ,מבצעת השמה בין כל שני איברים מתאימים ב-
-Tupleים .לדוגמה:
בדוגמה האחרונה נוצרו שני -Tupleים – באחד שלושה משתנים ,ובשני שלושה ערכים Python .עשתה השמה בין aל,1-
בין bל 2 -ובין cל .3 -בצורה כזו ,נוצרו שלושה משתנים עם שלושה ערכים התחלתיים בשורה אחת .כמובן ,לא ניתן
לבצע השמה בין שני -Tupleים שמכילים "סתם" איברים שלא ניתן להשם ביניהם:
אחד הטריקים שניתן לבצע בעזרת Tuple Assignmentsהוא החלפת ערכי שני משתנים בשורה אחת:
>>> x, y = y, x
השורה האחרונה פשוט החליפה בין הערכים של xו ,y-ללא צורך במשתנה זמני.
השימוש העיקרי ב-Tuple-ים ב Python-הוא עבור אחסון מידע שאין צורך לשנותו (או שיש צורך לוודא שהוא לא ישתנה).
Tupleהוא טיפוס ,ניתן להחזיר כמו כן ,בהמשך החוברת נראה שפונקציה יכולה להחזיר רק איבר אחד .משום ש-
מפונקציה Tupleהמכיל מספר איברים ,וע"י כך להחזיר יותר מאיבר אחד מפונקציה.
מילונים
מילון ( )Dictionaryב Python -הוא טיפוס שמטרתו היא המרה בין מפתחות לבין ערכים (ב C++ -קיימת המחלקה map
לכך) .מילון למעשה מחזיק ערכים ,מפתחות ואת המיפוי ביניהם .כאשר המשתמש פונה למילון ,הוא מציין מפתח,
ומקבל עבורו ערך .היתרון בכך הוא שבמקום מספרי אינדקסים (שלא ממש אומרים משהו למישהו) ,ניתן להשתמש
בכל ערך שרק רוצים ,אפילו מחרוזות.
כעת המילון dיודע שה"ערך" של 1הוא " ."Sundayבקשת ערך עבור מפתח מסוים נעשית כמו ברשימה:
]>>> d[1
''Sunday
כמו כן ,ניתן ליצור מפתחות שאינם מספרים .למשל ,ניצור מילון שממיר בין מדינה לבירה שלה:
בעת פנייה למילון נוכל לציין מייד את שם המדינה ולקבל את הבירה שלה:
]'>>> cap['France
''Paris
]'>>> cap['Japan
Traceback (most recent call last):
? File "<stdin>", line 1, in
KeyError: Japan
בנוסף לפעולות ההמרה ,יש מספר פעולות במילון בהן רצוי להשתמש בעת העבודה עם מילון:
has_keyהיא פונקציה שמחזירה 1אם המפתח קיים במילון ,או 0אם לא .לדוגמה ,המדינה " "Japanלא קיימת במילון:
)'>>> cap.has_key('Japan
0
)(>>> cap.keys
]'['Israel', 'Italy', 'USA', 'England', 'Russia', 'France
)(>>> cap.values
]'['Jerusalem', 'Rome', 'Washington', 'London', 'Moscow', 'Paris
פרק _:4בקרת זרימה
if
Cמלבד ifהיא כמובן פקודת ההתניה ( ,)Conditioningכמו ברוב שפות התכנות .מבנה הפקודה דומה לזה שבשפת
העובדה שאין חובה בסוגריים .דוגמה די פשוטה ל:if-
num = 5
if num > 3:
print num * 2
בשורה הראשונה יצרנו משתנה בשם numשערכו .5השורה השניה היא שורת ה if -עצמה ,ומבנה ההתניה דומה לזה
שב( C-מיד נראה מספר הבדלים) .בסוף השורה השניה יש נקודותים .תו ה ':'-ב Python-מורה על פתיחת בלוק חדש,
בדיוק כמו הסוגריים-המסולסלות ב.C-
ואיך Pythonיודעת מתי בלוק נגמר? את זה היא עושה באמצעות תו ה .TAB -בדוגמה למעלה ,השורה השלישית מוזחת
ימינה ב TAB -אחד ,ולא סתם בשביל אינדנטציה (כמו ב .)C -האינדנטציה ( ,Indentationהפעולה בה בלוק שתלוי בבלוק
קודם ייכתב "פנימה" יותר בקוד ,במקרה הזה ימינה ב TAB -אחד) ב Python-היא חלק מהמבנה שלה ,ולכן אי-אפשר
לכתוב בלי להוסיף TABלפני כל שורה בבלוק.
דבר נוסף ,חשוב לשים את תו ה ,)’\t ‘( TAB -ולא שום אלתור אחר ,כמו 4או 5רווחים Python .מחפש את תו ה,TAB -
וצריך להיזהר מלשכוח לשים אותו – אפשר לשבת שעות מול שגיאה שנראית לכאורה בקוד ולגלות בסוף ששכחת
TABלמספר רווחים ,או עושים דברים יותר משונים .לכן עדיף לשים .TABכמו כן ,ישנם עורכי טקסט שממירים
.)vi ,EditPlus ,Notepadיש לציין שכותבי ה להשתמש בעורכים שאפשר לסמוך עליהם שלא יתעללו בקוד (כמו
Interpreterבנו אותו בצורה יחסית אמינה ,שמסוגלת להתמודד גם עם רווחים בחלק מהמקרים .בכל אופן -כדאי לא
לבדוק את היכולת הזו וללכת על בטוח.
or ,andו ,not -בנוסף בנוסף לתנאים רגילים ,אפשר כמובן ליצור תנאים לוגיים .ב Python-קיימות מילות המפתח
לאופרטורים הלוגיים שלקוחים מ .C-השימוש הוא די פשוט:
num = 17
if (num > 5) or (num == 15):
”print “something
השימוש הוא זהה עבור not .andיכול לבוא לפני תנאי כדי להפוך אותו:
while
.if פקודת הלולאה whileמאפשרת חזרה על פקודות על עוד תנאי מסוים מתקיים .התנאי יכול להיכתב כמו תנאי ב-
דוגמה:
i = 0
while i < 10:
print i
i += 1
בפקודת whileב Python -קיים גם משפט .elseמשפט זה מתבצע במקרה ובו התנאי שניתן לביצוע הלולאה לא התקיים
אפילו פעם אחת ,ולא הייתה שום כניסה לגוף הלולאה:
>>> i = 40
>>> while i > 50:
... i -= 1
... print i
... else:
... '!print 'i is smaller than 50
...
!i is smaller than 50
for
לפני שנסקור את פקודת ,forנגדיר מהו רצף – רצף הוא עצם שמכיל בתוכו איברים ,בסדר מסוים ,כאשר העצם מכיל
פונקציות לקבלת כל-אחד מהאיברים (או פונקציות לקבלת איבר ראשון ואיבר עוקב לאיבר קיים).
פקודת הלולאה forשונה מזו שב for .C-ב Python-לא מבצעת לולאה על תחום ערכים (כמו ב )Pascal -או מאחדת בתוכה
משפט-אתחול ,תנאי ופקודה לביצוע בכל איטרציה (כמו ב.)C-
forב Python -מקבלת רצף (כלומר אוסף של איברים) ,ובכל איטרציה מתייחסת רק לאיבר אחד ברצף .ההתייחסות
לאיברים נעשית לפי הסדר בו הם מאוחסנים ברצף ,כאשר הסדר נקבע לפי טיפוס הנתונים הנתון (אף אחד לא מבטיח
סדר מסוים ,אלא אם כן זוהי אחת מהגדרותיו של טיפוס הנתונים).
בדוגמה ,הלולאה יצרה משתנה בשם .dayבכל איטרציה day ,מקבל את האיבר הבא של .daysהפלט של הריצה יהיה:
Sun
Mon
Tue
Wed
Thu
Fri
Sat
dayימשיך להתקיים ,וערכו יהיה הערך האחרון שקיבל במהלך ריצתחשוב לציין שבסיום ריצת הלולאה ,המשתנה
הלולאה.
אם מריצים לולאת forעם רשימה ריקה ,כלום לא יקרה והמשתנה ( dayאו כל משתנה אחר שייכתב שם) לא ייווצר .יש
לשים לב שאם מריצים כמה לולאות ,אחת אחרי השניה ,עם אותו משתנה (נגיד ,)iובאחת הלולאות יש רשימה ריקה,
אין הדבר אומר שהמשתנה iיושמד .זה רק אומר שהוא לא ישתנה עקב הלולאה הזו .אם הלולאה הזו היא הלולאה
הראשונה i ,באמת לא ייווצר:
כאמור ,ניתן לעבור לא רק על רשימות ,אלא גם על מילונים ומחרוזות .להלן שתי דוגמאות להמחשת העבודה עם
מחרוזות ומילונים:
a
n
o
t
h
e
r
s
t
r
i
n
g
הערה לגבי מילונים – בהגדרת המילון לא נאמר שהסדר בו האיברים מופיעים בו הוא הסדר בו הם יאוחסנו או הסדר בו
הם יוחזרו בלולאת .forלכן ,אין להניח הנחות על סדר האיברים בטיפוס מסוים ,אלא אם נאמר אחרת בהדגרת הטיפוס.
forעל רשימה מסוימת ,והרשימה לא הנחה שכן ניתן להניח (וגם זאת בזהירות רבה מאוד) היא שאם הרצנו לולאת
השתנתה ,ריצת forנוספת על אותה הרשימה תתבצע באותו הסדר.
range, xrange
טוב ,אז יש לולאת forשיודעת לעבור על כל האיברים ברשימה .אבל מה אם כן רוצים לעשות לולאת forכמו ב ,C-אבל
לא רוצים להשתמש ב.while-
פתרון אחד (לא מומלץ) הוא ליצור רשימה שמכילה את כל המספרים שנרצה לעבור עליהם ,מ 0 -עד .Xברור שפתרון
זה לא טוב ,אם Xמשתנה מריצה לריצה ,או אם הוא מאוד גדול.
rangeו .xrange -שתי הפונקציות עושות את אותו Pythonפותרת עבורנו את הבעיה באמצעות הפונקציות המובנות
הדבר ,אבל בצורה שונה range .יוצרת רשימה חדשה אם ערך התחלתי ,ערך סופי וקפיצה ( ,Stepההפרש בין כ"א
מהאיברים).
מבנה הפונקציה :range
כלומר range ,יוצרת רשימה חדשה עבורנו .הרשימה יכולה למעשה להכיל כל סדרה חשבונית שהיא.
כמו כן ,ניתן לקחת את הרשימה שנוצרה ולהצביע אליה עם משתנה ,ואז נקבל רשימה חדשה בממש מעט קוד:
)k = range(1024
break, continue
משפט breakנועד ליציאה מלולאות forאו break .whileיוצא רק מבלוק ה for-או בלוק ה while-בו הוא נמצא ,ולא מסוגל
לצאת החוצה יותר מבלוק אחד.
משפט continueמורה להפסיק מיד את האיטרציה הנוכחית של הלולאה ולהתחיל את האיטרציה הבאה .כמו ,breakגם
continueיכול לצאת רק מבלוק הלולאה הקרוב אליו.
דוגמאות:
הפקודה יכולה לקבל פרמטר אחד (כמו בדוגמה האחרונה) או מספר פרמטרים מופרדים בפסיקים:
כפי שניתן לראות print ,מוסיפה אוטומטית רווחים בין הפרמטרים שנשלחים להדפסה .כמו כן ,ניתן לתת כפרמטר כל
סוג משתנה ,כל עוד ניתן להמיר אותו למחרוזת כדי להדפיס אותו.
בנוסף ,הפקודה תמיד מדפיסה תו סיום שורה בסופה ,אלא אם כן שמים פסיק בסוף השורה:
השימוש בלולאת forבדוגמה האחרונה היה כדי ששתי הפקודות יבוצעו אחת אחרי השניה ,כי אם נכתוב את הפקודות
אחרת אחרי השניה ב ,Interpreter -ה Interpreter -יירד שורה באופן אוטומאטי לאחר כל ביצוע פקודה ,כדי לחזור לסמן
של הכנסת הפקודה הבאה (>>>).
קלט מהמקלדת
.raw_input כאשר תוכנית מעוניינת לקבל קלט מהמשתמש (דרך המקלדת בד"כ) ,ניתן להשתמש בפונקציה המובנית
הפונקציה מקבלת כפרמטר מחרוזת אותה היא מדפיסה למסך ,ואז היא ממתינה לשורת קלט מהמשתמש .הקלט
יסתיים כאשר המשתמש יקיש על .Enterדוגמה לשימוש ב:raw_input-
קבצים
הטיפול בקבצים ב Python -פשוט בהרבה מזה שב .C -פונקציות הטיפול בקבצים מובנות ,ונקראות openו .close -פתיחת
קובץ נעשית באופן הבא:
כלומר ,הפונקציה openמחזירה Handleלקובץ ,כאשר הפרמטרים לפונקציה הם שם הקובץ וסוג הגישה (‘ ’wלכתיבה’r‘ ,
לקריאה ,וכו' כמו ב .)C-לאחר מכן ניתן לכתוב לקובץ באמצעות הפונקציה :write
)(>>> file.close
ניתן גם לפתוח קובץ לקריאה ולקרוא ממנו את כל התוכן שלו למשתנה אחד:
הגדרת פונקציות
בדומה ל ,C -אין הבדל בין פונקציות ( )Functionsלבין פרוצדורות ( – )Proceduresיש פונקציות שמחזירות ערך ויש
פונקציות שלא .בשונה מ ,C -פונקציה יכולה להחזיר ערך ,לא להחזיר כלום ,או להחזיר מספר טיפוסים שונים במקרים
שונים ,וזאת מבלי לשנות את ההגדרה שלה (ה Prototype -שלה).
כמו כן ,חוקי ה Case Sensitivity-זהים לאלו של משתנים – יש הבדל בין אותיות גדולות וקטנות (לדוגמה ,פונקציה בשם f
איננה זהה לפונקציה בשם .)F
הגדרת פונקציה פשוטה (בלי פרמטרים):
.)returnאם ניקח את ערך ההחזרה של הפונקציה הזו לא מקבלת שום פרמטר ,וגם לא מחזירה כלום (אין בה משפט
הפונקציה ונשים אותו בתוך משתנה ,המשתנה יכיל "כלום":
)(>>> h = func
‟„I am a function
>>> h
>>>
passבפונקציות
כמו בלולאות pass ,עובד יפה מאוד גם בפונקציות .פשוט רושמים passבמקום בלוק הפונקציה:
def doing_nothing():
pass
פרמטרים
Default העברת הפרמטרים לפונקציות ב Python-מאחדת למעשה את הנוחות של משתנים ב Python-עם אפשרות ה-
Valueשל .C++העברת פרמטרים תיעשה בסוגריים של הפונקציה:
לפונקציה זו העברנו שלושה פרמטרים ,b ,a :ו .c -כמו שניתן לראות ,אין צורך בטיפוס ,כי ב Python-משתנה יכול להיות
מכל טיפוס שהוא .כמובן ,זה לא אומר שניתן להעביר כל סוג משתנה שהוא לפונקציה ,הרי היא מצפה לסוג משתנה
מסוים .אם לא נוהגים בחופש זה בזהירות ,ניתן לגרום לכל תוכנית פשוטה לקרוס ממש מהר.
הפרמטרים שמועברים לפונקציה מועברים אליה ,By Valueכלומר נוצר עותק של המשתנה עבור הפונקציה ,והמשתנים
מצביעים לעותק זה .כמובן שעבור רצפים (רשימות וכו') אין משמעות לעותק הנ"ל ,כיוון שהוא מצביע לאותו אובייקט.
בעת היציאה מהפונקציה ,יושמדו העותקים האלה (אלא אם כן הם יוחזרו ע"י הפונקציה ,ואז יכול להיווצר עותק עבור
ערך ההחזרה ,או שיוחזר העותק המקורי של הפונקציה – תלוי במימוש).
ניתן לציין ערכי Defaultלפרמטרים .החוקים לזה דומים לאלה שב :C++ -המשתנים בעלי ערך Defaultחייבים להופיע
Defaultיופיע פרמטר בלי ערך .)Defaultכמו כן ,בעת כפרמטרים האחרונים (אי-אפשר שאחרי פרמטר בעל ערך
הקריאה לפונקציה ,אי-אפשר להשאיר "פרמטרים ריקים" (כלומר ,לשים פסיק כדי לדלג על משתנה ,בניגוד ל,BASIC -
בה מותר לעשות דבר כזה) ,וחובה להעביר את כל הפרמטרים לפונקציה.
כמובן ,דוגמה:
)>>> func_with_defaults(1,,9
File “<stdin”>, line 1
)func(1,,9
SyntaxError: invalid syntax.
הדבר היחיד שחסר לנו ,כדי להשלים את כל התכונות של פונקציות ב C -ו C++ -הוא ה( Ellipsis -כאשר שמים ...בסוף
)( .)printfדבר זה ממומש בPython- שורת הארגומנטים לפונקציה כדי להעביר מספר לא ידוע של פרמטרים ,כמו ב-
בצורה הרבה יפה מאשר ב :C -כאשר רוצים שפונקציה תקבל מספר לא ידוע של פרמטרים ,פשוט מוסיפים עוד פרמטר
Pythonלקחת את כל הפרמטרים שיתווספו אחרי אחד בסופה .לפני שם הפרמטר שמים כוכבית ,וזה אומר ל-
הפרמטרים הרגילים ולהפוך אותם ל .Tuple-אחרי זה ,העבודה מול Tupleהיא כבר נוחה ופשוטה.
בעיה קטנטנה שמתעוררת כאן היא כאשר יש לנו שתי פונקציות ,ושתיהן מקבלות " "Ellipsisכזה בסופן .מה יקרה כאשר
קראו לפונקציה אחת ,והיא רוצה להעביר את כל רשימת הפרמטרים לפונקציה השניה ,אבל לא כ ,Tuple -אלא כרשימה
אמיתית ,כאילו קראו לה עם רשימת הפרמטרים?
רק כדי להמחיש את הבעיה ,הנה שתי הפונקציות:
מה שקרה כאן הוא שבעת הקריאה ל Python ,yanti -המירה את הפרמטרים העודפים ל ,Tuple -אליו מצביע הפרמטר .y
כאשר yantiקראה ל ,parazi -היא העבירה (כפרמטר עודף אחד!) את כל ה ,Tuple -כי ה Tuple -הוא הרי טיפוס ,משתנה
אחד ,בדיוק כמו מספר שלם או מחרוזת.
Tupleשלה ,אותו היא יוצרת עבור paraziקיבלה את ה Tuple -כפרמטר אחד ,לקחה את הפרמטר והכניסה אותו ל-
הפרמטרים העודפים.
בקיצור ,בעוד ש parazi -ציפתה לקבל Tupleאחד ,היא קיבלה Tupleבתוך – Tupleסלט של -Tupleים ,וזה רק עם 2
פונקציות.
ברור שיש פה פתרון ,והוא אפילו ממש פשוט :בעת הקריאה ל parazi -צריך לשים כוכבית לפני .yהכוכבית אומרת ל -
Pythonלקחת את ה Tuple-הקיים כ Tuple-של הפרמטרים העודפים ,ולא ליצור Tupleחדש .הנה הפונקציות המתוקנות:
תיעוד
תיעוד (או באנגלית )Documentationהוא פעולה שאיננה כתיבת קוד .תיעוד הוא כתיבת הערות לתוכניות שלנו כדי
שאנחנו ,או אנשים אחרים ,נוכל לקרוא הערות על הקוד ולהבין אותו ,במקרה שהוא לא כל-כך מובן.
יש שני סוגים גדולים של תיעוד ב:Python-
סתם תיעוד שזורקים באמצע הקוד ,כדי שיהיה יותר ברור. .1
מחרוזת תיעוד קבועה בתחילת הפונקציה. .2
הסוג הראשון נעשה בצורה פשוטה מאוד – כמו שב C++ -יש את רצף התווים " "//שאומר שמעכשיו ועד סוף השורה יש
דברים שלא צריך לקמפל (שכנראה יהיו הערות והארות) ,כך גם ב Python-יש את התו " "#שאומר שאין להתייחס למה
שכתוב מאחרי תו זה ואילך:
הסוג השני של תיעוד הוא סוג מיוחד ,ואליו Pythonמתייחסת בצורה שונה – בתחילת פונקציה ,שורה אחת אחרי שורת
ה( def-בלי שום רווחים מסתוריים) ,ניתן לשים מחרוזת (כמובן ,עם TABלפניה) .המחרוזת הזאת היא מחרוזת התיעוד של
הפונקציה .כאשר מישהו אחר (או אנחנו) ירצה יום אחד לדעת מהי הפונקציה הזו ,הוא יוכל לקבל את המחרוזת בקלות
רבה .העובדה שהתיעוד נמצא בתוך הקוד עצמו הוא דבר מאוד חזק – זה אומר שאם יש לך את הקוד ,יש לך את
התיעוד .אין צורך לחפש קובץ תיעוד שנעלם ,או יותר גרוע ,איזו חוברת שקבורה במגירה של מישהו אחר .מושג מחרוזות
התיעוד בתחילת פונקציות שאול משפת התכנות ,LISPוקרוי ( DocStringsאו )Documentation Strings
אז את מחרוזת התיעוד מקבלים ע"י כתיבת שם הפונקציה ,נקודה ,ו.__doc__ -
אבל ברוב הפעמים נרצה לכלול יותר משורה אחת בתיעוד ,שתכיל את מבנה הפונקציה ,מה היא מחזירה ,פרמטרים,
-’\nים כאשר רוצים לרדת שורה .אם תיאור מפורט ,וכו' .כדי לעשות את זה ,כותבים את מחרוזת התיעוד ,ומוסיפים ‘
רוצים לרדת שורה בתוך הקוד עצמו ,ניתן לעשות את זה ע"י כתיבת \ בסוף השורה ,והמשך מחרוזת התיעוד בשורה
הבאה.
בלי שום קשר ,התו \ מורה ל Python-שהשורה הבאה היא המשך השורה הקודמת .כמובן ,השורה הבאה ,שהיא המשך
השורה הקודמת ,חייבת להיות בעלת אינדנטציה זהה לשורה שקדמה לה ,אותה היא ממשיכה:
כדי להדפיס את מחרוזת התיעוד כמו שצריך (ולא את תוכן המחרוזת עצמה) ,נשתמש ב:print -
משתנים בפונקציות
לקינוח פרק זה ,רק נכסה נושא אחד – מה קורה כאשר מכריזים על משתנים בתוך מקומות שונים בפונקציה.
המקרה הפשוט ביותר ,כאשר כותבים פונקציה ,ופתאום מכריזים בה על משתנה:
def func():
”print “Here we go
i = 9
while i > 0:
print i * 5
בפונקציה הזאת ,הוכרז משתנה בשם .iהמשתנה iיהיה קיים עד שהפונקציה תגיע לסופה ,ואז יושמד .אם נקרא
לפונקציות אחרות מתוך הפונקציה ,funcהן לא יכירו את המשתנה .iיותר מכך ,אם פונקציה אחרת תכריז על משתנה
באותו השם ,iלכ"א מהפונקציות יהיה משתנה iמשלה:
>>> def alice():
... k = 3
...
>>> def bob():
... k = 1
... print k
... )(alice
... print k
...
)(>>> bob
1
1
בנוסף לכך ,יכול להיות מקרה בו פונקציה יוצרת משתנה ,אבל המשתנה לא נוצר בתוך הבלוק של הפונקציה ,אלא
באחד מתת-הבלוקים שלה ,בתוך תנאי ifאו לולאת forאו .whileבמצב כזה ,המשתנה שנוצר יהיה תקף וקיים גם אחרי
היציאה מתת-הבלוק ,בלי שום קשר לזה שהוא נוצר בתוך הבלוק (בשונה מאוד מ Scopes -ב C-וב:)C++-
כאשר נשתמש בפונקציה ,נוכל לקבל ממנה מיד את שני הערכים לתוך שני משתנים:
שלוש הפונקציות האלה הן פונקציות מובנות ב ,Python -שכל מטרתן היא לקחת רשימה (או ,)Tupleלהריץ פונקציה על
האיברים שלה (כ"א משלוש הפונקציות מריצה את הפונקציה בדרך שונה ,עם איבר או איברים שונים) ולהפיק פלט
מתאים.
כל זה נעשה ע"י קריאה לפונקציה אחת על הרשימה ,דבר שחוסך כתיבה מחדש של לולאה טריוויאלית בכל פעם
מחדש (ולפעמים קצת יותר מלולאה טריוויאלית).
map
פונקצית קסם ראשונה.
mapמקבלת רשימה ופונקציה .הפונקציה חייבת לקבל פרמטר אחד בלבד map .מריצה את הפונקציה עם כ"א מאיברי
הרשימה (כל איבר בתורו ,לפי הסדר בו הם מופיעים ברשימה).
mapמחזירה רשימה חדשה ,ובה כל איבר הוא התוצאה של הפונקציה עם האיבר המתאים לו ברשימה המקורית.
בעברית map :לוקחת את האיבר הראשון ,מריצה עליו את הפונקציה ,ושמה את התוצאה ברשימה החדשה .אח"כ היא
לוקחת את האיבר השני ,מריצה עליו את הפונקציה ,ושמה את התוצאה באיבר הבא ברשימה החדשה .כך היא עושה
לכל האיברים.
reduce
פונקצית קסם שניה.
reduceמקבלת רשימה ופונקציה .הפונקציה חייבת לקבל שני פרמטרים reduce .לוקחת את שני האיברים הראשונים
ברשימה ומריצה את הפונקציה כאשר האיבר הראשון הוא הפרמטר הראשון והאיבר השני הוא הפרמטר השני של
הפונקציה .לאחר מכן reduce ,לוקחת את התוצאה של הפונקציה ומריצה את הפונקציה עם התוצאה כפרמטר הראשון
והאיבר הבא מהרשימה כפרמטר השני .כך היא ממשיכה עד סוף הרשימה.
אם ברשימה יש רק איבר אחד reduce ,תחזיר את האיבר היחיד ברשימה (מבלי להריץ את הפונקציה) .אם הרשימה
ריקה reduce ,תקרוס ותדפיס הודעת שגיאה.
filter
פונקצית קסם שלישית.
filterתיקח כ"א מאיברי הרשימה ותריץ את filterמקבלת רשימה ופונקציה .הפונקציה חייבת לקבל פרמטר אחד.
הפונקציה עם האיבר הזה .אם התוצאה של ריצת הפונקציה היא ( TRUEאיננה אפס ,איננה מחרוזת ריקה ,ולא הופכת
לאפס אם עושים לה Castingל ,)Integer-האיבר (האיבר מהרשימה שהועברה ל ,filter -לא ערך ההחזרה של הפונקציה)
יתווסף לרשימת התוצאה.
filterלמעשה מאפשרת לנו לסנן ערכים מרשימה נתונה ,בשורה אחת בלבד.
בדוגמה הזו הודפסו כל המספרים בין 0ל 19 -ששארית החלוקה שלהם ב 2 -איננה אפס .בקיצור ,כל המספרים האי-
זוגיים.
ניתן כמובן להפוך את התנאי ולהדפיס את כל המספרים הזוגיים:
lambda
אז מה lambdaעושה בכלל ולמה היא קשורה לפרק הזה?
reduce ,mapאו filterהיינו צריכים לכתוב פונקציה כמו שאפשר לראות בדוגמאות למעלה ,עבור כ"א מההרצות של
חדשה כדי שנוכל להעביר פונקציה לכ"א מהפונקציות .אבל כתיבת פונקציה חדשה כל פעם זה סתם העמסה על
הקוד ,ולפעמים גם יכול להיות מסובך למצוא את הפונקציה (אם שמנו אותה במקום אחר).
lambdaמאפשרת לנו לחסוך עוד יותר בכמות הקוד – במקום לכתוב פונקציה חדשה בכל פעם lambda ,יוצרת עבורנו
פונקציה ללא-שם ,כבר בתוך שורת הקוד של reduce ,mapאו .filter
בת'כלס ,כאשר יוצרים פונקציה ,השם שנותנים לפונקציה הוא מצביע לפונקציה עצמה .זאת גם הסיבה שכאשר כותבים
שם של פונקציה ,בלי סוגריים Python ,כותבת לנו את שם הפונקציה .באופן הזה lambda ,יוצרת עבורנו פונקציה חדשה,
ומחזירה את המצביע לפונקציה החדשה .לפונקציה החדשה אין שם ,וכאשר תסתיים הרצת reduce ,mapאו ,filterגם
הפונקציה חסרת-השם תימחק.
דוגמה קטנה כדי להבין יותר טוב מה קורה:
קצת על המבנה של :lambdaכתיבת פונקצית lambdaלמעשה כולל רק את הפרמטרים לפונקציה ואת ערך ההחזרה
שלה ,כי למעשה אין צורך ביותר מכך (פונקציות lambdaהן ל"שימוש חד-פעמי"(.
והנה דוגמה לשימוש ב map -ו lambda -ביחד .הדוגמה עושה את מה שעושה הדוגמה הראשונה – מקבלת רשימת
מספרים ומחזירה רשימה של האיברים המקוריים כפול :2
– xומחזירה את .x*2כמובן ,אפשר לכתוב כל ביטוי בדוגמה הזו נכתבה פונקצית lambdaהמקבלת פרמטר אחד –
שתלוי ב ,x-ואפשר גם לכלול פונקציות בביטוי הזה.
def is_primary(n):
)))return reduce(lambda x, y: x and y, map(lambda x: n % x, range(2, n
פונקציה שמחזירה את סכום הספרות במספר:
def sum_of_digits(n):
))))return reduce(lambda x,y:x+y, map(int, map(None, str(n
מילה על יעילות
ישנה כמובן השאלה – מה יעיל יותר ,להשתמש בלולאה רגילה ( ,)for ,whileאו להשתמש (כשאפשר) בreduce ,map -
או ?filter
כנראה (עקב מימוש) יעיל יותר להשתמש ב reduce ,map -ו filter -במקום בלולאה רגילה בגלל שהפונקציות עצמן
ממומשות ב ,C -או בכל שפה עילית אחרת .היות והמימוש הוא בשפה נמוכה יותר מ ,Python -הריצה שלה תהיה מהירה
יותר.
מהכיוון ההפוך – כאשר מריצים לולאה רגילה ב ,Python -יש צורך באחזקת משתנה ( iלצורך הענין) ,או רשימה ( range
לסוגיה) .האחזקה הזו לוקחת גם זיכרון וגם עיבוד נוסף (שנסתר ונחסך מהמתכנת) ,ולכן היא "יקרה" יותר.
,Cאלא כדי להדגיש ששימוש השאלה הזו לא מוצגת כדי שנחשוב טוב טוב לפני שכותבים משהו ב Python-או ב-
בפונקציות פנימיות הוא לרוב מהיר יותר .כמו כן ,לא צריך להשתגע ולכתוב תוכניות שלמות עם קריאות מסובכות ל-
reduce ,mapו.filter-
טוב להשתמש ב"קיצורי דרך" ,כל עוד הם גם משפרים את התוכנית ,הופכים אותה לקריאה יותר וקלה יותר ל.Debug-
פרק _:8מודולים
מהו מודול?
מודול ,בדומה לפונקציה ,הוא יחידה המאחסנת בתוכה קוד לשימוש חוזר .ב Python-קיימות מספר דרכים ליצור מצב בו
קוד נמצא בקובץ אחר וניתן להשתמש בו בקוד אחר (או לצורך הענין ישירות ב.)Interpreter -
בפרק זה נתמקש בשלוש דרכים עיקריות בהן משתמשים לרוב כאשר רוצים להשתמש בקוד קיים מחדש.
def func1(x):
))return map(lambda i: i * 2, xrange(0, x
def func2(x):
return 2L ** x
def func3(x):
return “The number is %d” % x
def func4(x):
return [x] * x
ולאחר ההרצה:
)‟>>> execfile(„c:\\example.py
)>>> func2(32
4294967296L
בנוסף ,הפונקציה )( execfileיכולה גם להריץ סתם קוד שמצוי בקובץ אחר ,בלי שום קשר לפונקציות או כל דבר אחר
שנמצא בקובץ .לדוגמה ,הנה קובץ:
#!/usr/local/bin/python
)print “you have a dog named %s and a cat named %s!” % (dog_name, cat_name
~$ ./quick_script.py
?what‟s your cat name
bush
?what‟s your dog name
charly
!you have a dog named charly and a cat named bush
באופן כללי ,מאוד נוח לכתוב -Scriptים שרצים ב Unix -כמו תוכניות רגילות .ניתן להרחיב תוכניות כאלה עם פרמטרים
ב )argv[]( Command Line-ועוד הרבה דברים שמקלים על התכנות.
def func1(x):
))return map(lambda i: i * 2, xrange(0, x
def func2(x):
return 2L ** x
def func3(x):
return “The number is %d” % x
def func4(x):
return [x] * x
בקובץ זה 4פונקציות ,כאשר שם הקובץ בו הן מאוחסנות הוא .example.pyייבוא הקובץ לתוך התוכנית שלנו (או לצורך
הדוגמה ,ל )Interpreter-ייעשה באמצעות הפקודה .import
לפקודה importשתי צורות עיקריות ,כאשר כל-אחת מהן תשפיע בדרך מסוימת על האופן בו הפונקציות ייובאו למודול.
namespaceהגלובלי .המשמעות היא שכאשר נרצה צורה ראשונה מאפשרת ייבוא כל הפונקציות מהמודול לתוך ה-
להשתמש בפונקציה מהמודול ,פשוט נכתוב את השם שלה.
צורה שניה היא ייבוא המודול ל namespace -משלו ,וכאשר נרצה להשתמש בפונקציה מהמודול ,נצטרך לרשום את שם
המודול ושם הפונקציה .צורה זו בטוחה יותר ודואגת שלא יהיו התנגשויות בין שמות פונקציות ממודולים שונים.
כאשר יש משתנים גלובליים מיוצאים ממודול ,תמיד יש לכתוב גם את שם המודול וגם את שם המשתנה בפנייה אליו,
בלי קשר לצורת ייבוא המודול.
לדוגמה ,הנה קוד שמייבא את examply.pyע"י הכנסתה ל namespace-משלה:
.pyכמו כן ,הפונקציות מיובאות לתוך כפי שניתן לראות ,אין לכתוב את שם הקובץ כולו ,אלא להשמיט את הסיומת
namespaceששמו הוא כשם המודול .ה namespaceהנ"ל הינו בעצם אובייקט מסוג "מודול" ,כלומר אובייקט המדמה את
המודול כאשר אבריו הם השמות והאובייקטים המיוצאים ממנו.
הקוד הבא מייבא את example.pyל namespace-הגלובלי:
,exampleולכן מבנה פקודת ה import -במקרה הזה הוא יותר מורכב .בדוגמה הזו בוצע ייבוא לכל הפונקציות במודול
הסימן * .ניתן לבצע ייבוא שכולל רק חלק מהפונקציות במודול .כמו כן ,הפונקציות יובאו כך שניתן לקרוא להן כאילו
הן הוגדרו הרגע ב( Interpreter-או בקוד בו עובדים).
כאשר כותבים תוכניות גדולות ,קבצי Scriptוכד' ,מקובל לשים את פקודות ה import -בתחילת הקובץ ,בדומה לinclude -
ב.C-
דוגמה נוספת ל import-היא ייבוא של מספר פונקציות ספציפיות ממודול ,ולא את כל הפונקציות מהמודול:
ניתן לראות כי func1ו func2-יובאו מ ,example-אבל func3לא מוכרת כלל משום שצויין לייבא רק את func1ו.func2-
לדוגמה ,בפרק זה נראה שימוש במודול ,mathוהפונקציות floorו ceil -שבו floor .מקבלת מספר עשרוני ומחזירה מספר
עשרוני בו החלק של השבר הוא אפס ceil .מקבלת מספר עשרוני ומעגלת אותו כלפי מעלה:
dir
ב Python-קיימת פונקציה מובנית בשם .dirפונקציה זו מקבלת בפרמטר שם של מודול או מחלקה (מחלקות יילמדו
בהמשך) ומדפיסה את כל הפונקציות והמשתנים של המודול הנתון .פונקציה זו שימושית מאוד בעבודה עם מודולים.
לדוגמה ,הנה כל הפונקציות במודול :math
)>>> dir(math
['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos',
'cosh', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
]''log10', 'modf', 'pi', 'pow', 'sin', 'sinh', 'sqrt', 'tan', 'tanh
פרק _:9ספריות נפוצות
הגרסאות העדכניות של Pythonמסופקות עם המון (ממש המון) ספריות לשימוש של המתכנתים בה .ידע והכרה של
הספריות חשובים לא פחות מהכרה של השפה ,בגלל שכמו ש Python-חוסכת זמן בתכנות ומאפשרת כתיבה של
תוכניות חכמות וקצרות בהרבה ,כך גם הספריות שמסופקות איתה – הן כוללות הרבה מחלקות (את נושא המחלקות
נלמד בהמשך) ופונקציות לשימושים חוזרים ,וחוסכות זמן בבניה של כלים שכבר קיימים ומוכנים לשימוש.
פרק זה מכסה 4ספריות אותן נוח ללמוד בהתחלת העבודה עם מודולים חיצוניים ,כי הן כוללות הרבה פונקציות שכבר
קיימות בשפות אחרות ,ויותר נוח לראות כיצד מתבצעת ההקבלה ל .Python-אבל ,בגרסאות העדכניות של Pythonיש
Regular עשרות ספריות שונות ומשונות ,ובהן ניתן למצוא הרבה מימושים של דברים שקיימים בשפות אחרות (כמו
Expressionsמ Perl-או מודול ל ,)Random-או פונקציות לקישור למערכת ההפעלה (כמו מודול ה Socket -שמאפשר ליצור
-socketים לתקשורת באינטרנט) ,והרבה מעבר לכך.
שוב ,הפרק לא מכסה את כל הפונקציות ,אלא רק פונקציות מעניינות ,ושוב ,במטרה לתת מבוא והסברים לדברים
שעלולים להיות לא מובנים ,ולא כדי לתרגם את התיעוד לעברית.
מומלץ לרפרף על התיעוד של הספריות הקיימות (למשל בתיעוד של ActivePythonל )Windows -כדי לראות מה כבר
קיים.
ספריית os
ספרייה זו מכילה פונקציות לתקשורת עם מערכת ההפעלה .המודול לא תלוי במערכת ההפעלה עליה מורצת תוכנית
ה .Python-קיימות הספריות ntו posix -לתקשורת עם מערכות הפעלה Windows-NTו-UNIX -ים למיניהם ,אבל osמכילה
פונקציות ומשתנים שיעבדו על כל מערכת.
כדי לכלול את המודול נכתוב:
>>> os.name
‟„nt
המשתנה יכיל את סוג מערכת ההפעלה ,ולא שם מלא כמו " "Windows 95וכד' .כאשר Pythonמורצת על מערכת ,Java
os.nameיכיל את המחרוזת ‘.’java
.)temp המשתנה environבמודול הוא מילון המכיל את משתני הסביבה של המערכת (כמו המיקום של ספריית ה-
משתני הסביבה משתנים ממערכת למערכת ,אך ניתן לראות את כל המשתנים הללו ע"י קריאה ל keys() -של המילון:
)(>>> os.environ.keys
[„WINBOOTDIR', 'PATH', 'BLASTER', 'PATHEXT', 'TEMP', 'COMSPEC', 'PROMPT', 'WINDIR',
]‟'TMP
הפונקציה )( systemבמודול מאפשרת להריץ פקודות של ה Command Line -ולקבל את הפלט שלהן בערך ההחזרה של
הפונקציה .שימוש נחמד יכול להריץ את הפקודה :dir
Directory of z:\x
הפונקציה למעשה מחזירה ערך ,בדוגמה זהו ,0ובנוסף לכך מודפס למשך כל מה שהפקודה שלחה להדפסה למסך.
זאת הסיבה שהשורה האחרונה היא – 0זו לא השורה האחרונה ,אלא ערך ההחזרה של הרצת הפקודה.
הפונקציה )( mkdirו rmdir()-יוצרות ומוחקות ספריות ,אבל ההבדל בין שימוש ב sysetm() -כדי לשגר פקודת מערכת לבין
השימוש בכ"א מהפונקציות הללו הוא שהפונקציות מתאימות לכל מערכת-הפעלה ,והשימוש ב system() -מצריך יצירת
פקודה שונה לכל מערכת.
מודול osמכיל עוד פונקציות לשינוי שמות קבצים וספריות ,פתיחת -pipeים בין תהליכים רצים ,טיפול בקבצים (אלו הן
הפונקציות המובנות )( close() ,openוכו' ,והשימוש בהן לא מצריך importל ,)os-הרצת תוכניות ,וכו'.
ספריית sys
ספריית sysמכילה את כל הפונקציות שקשורות למערכת ה Python-ולהרצת תוכנית ה .Python-המודול כולל בתוכו
פונקציות לטיפול בקלט ופלט (לסוגיו השונים) ,מידע על גירסת ה ,Interpreter -משתנים שמשפיעים על התצוגה ,מידע
על המודולים הטעונים ,סדר הבתים (אינדיאניות) ,גודל ה ,int-ועוד.
כמה משתנים חשובים שיש במודול הם – versionמכיל את גירסת ה Interpreter -עליה מורצת התוכנית– platform ,
מכיל את סוג מערכת ההפעלה עליה רצה התוכנית (בניגוד ל ,os.name -מכיל רק את סוג מערכת ההפעלה ,למשל
‘ – path ,)’win32מכיל את כל הספריות בהן ייעשה חיפוש בעת טעינת מודולים ,ו – maxint-מכיל את גבול משתנה ה.int-
כמו כן ,הספרייה מכילה שלושה משתנים – stdout ,stdinו .stderr -אלו הם אובייקטי הקבצים של הקלט הסטנדרטי
(לרוב המקלדת) ,הפלט הסטנדרטי (לרוב המסך) ופלט השגיאות הסטנדרטי (המסך או קובץ) .ניתן לכתוב ולקרוא
מקבצים אלה (כל קובץ וההרשאות שלו ,כי ברור שאי-אפשר לקרוא מ stdout -וכו') לשימושים מיוחדים .הפונקציות print
ו raw_input-משתמשות באובייקטים אלה.
כאשר מריצים -scriptים מה Command Line -ניתן לתת להם ארגומנטים ,ממש כמו לכל תוכנית רגילה .ב C -לפונקציה
)( mainהיו שני פרמטרים – argcו ,argv -בהם הועברו ארגומנטים אלה .ב Python-קיימת רשימה בשם argvבתוך .sys
הרשימה מכילה את הארגומנטים ,לפי הסדר בו הם הועברו ,כאשר הארגומנט הראשון הוא לרוב שם הקובץ המורץ .אם
ה script-שרץ כרגע (או לצורך העניין ה )Interpreter-לא הורץ משורת הפקודה argv ,היא רשימה ריקה.
ספריית string
ספרייה זו מכילה פונקציות לפעולות על מחרוזות .בנוסף לפעולות שכבר מובנות בתוך השפה ,ספרייה זו מספקת כלים
נוספים לעיבוד מחרוזות.
הפונקציות הפחות שימושיות בספרייה זו הן ,atoi ,atofודומותיהן ,משום שניתן לבצע את הפעולות שהן מבצעות ע"י
שימוש בפונקציות המובנות intו – float-שזה גם יותר נוח וגם יותר קריא.
קיימות בספרייה פונקציות לשינוי ה Capitalization -של מחרוזות ,כלומר כל נושא האותיות הקטנות והגדולות באנגלית.
הפונקציה capitalizeמקבלת מחרוזת ומחזירה את אותה המחרוזת ,כאשר האות הראשונה במילה הראשונה מתחילה
באות גדולהף והשאר קטנות.
lowerעושה אותו הדבר ,רק הפונקציה upperמקבלת מחרוזת ומחזירה מחרוזת בה כל האותיות גדולות .הפונקציה
מחזירה מחרוזת בה כל האותיות קטנות.
lowercaseמכילה את כל uppercaseמכילה את כל האותיות הגדולות. כמו כן ,במודול קיימות הרשימות הבאות:
האותיות הקטנות digits .מכילה את כל הספרות ( 0עד hexdigits .)9מכילה את כל הספרות בבסיס 0 ( 16עד .)F
octdigitsמכילה את כל הספרות בבסיס 0( 8עד whitespace .)7מכילה את כל התווים שנחשבים כרווח (תו רווח ,טאב,
מעבר שורה וכו') punctuation .מכילה את כל תווי הניקוד.
stripמקבלת מחרוזת ומסירה ממנה את תווי ה whitespace -שנמצאים בקצוות המחרוזת .למשל ,הנה המחרוזת הבאה
אחרי :strip
joinמקבלת מחרוזת ורשימה ומחזירה מחרוזת שמורכבת מהאיברים ברשימה ,כאשר בין כ"א מהם מצויה המחרוזת
הנתונה .הפונקציה למעשה הפוכה ל:split-
הפונקציה indexמקבלת מחרוזת ותת-מחרוזת ,ומחזירה את המקום הראשון בו תת-המחרוזת מופיעה בתוך המחרוזת.
.)Exceptionsהפונקציה findעושה בדיוק אם לא נמצא מקום כזה ,הפונקציה זורקת שגיאה (יילמד בהמשך בפרק על
אותו הדבר ,אבל אם היא לא מוצאת את תת-המחרוזת היא מחזירה .-1
ספריית math
ספרייה זו מכילה מספר פונקציות שימושיות וקבועים לשימושים מתמטיים ,כמו חישובים עם או ,℮או משחקים משונים
עם מספרי נקודה-עשרונית.
piו e-הם שני קבועים המייצגים את ואת ℮בדיוק של 11ספרות אחרי הנקודה.
הפונקציה ceilמקבלת מספר עשרוני ומעגלת אותו כלפי מעלה floor .מקבלת מספר ומעגלת אותו כלפי מטה (מקצצת
את החלק העשרוני).
acos ,asinו atan -הן הפונקציות הפונקציות cos ,sinו tan -הן כמובן שלוש הפונקציות הטריגונומטריות האהובות ,ו-
ההופכיות להן.
שאר הפונקציות מ math -די טריוויאליות ,וניתן פשוט לרפרף עליהן ע"י הסתכלות במחרוזת התיעוד ( __ )__docשל כ"א
מהן.