פייתון – הבדלי גרסאות
תוכן שנמחק תוכן שנוסף
אין תקציר עריכה תגיות: עריכה ממכשיר נייד עריכה מיישום נייד עריכה מאפליקציית iOS קישורים לדפי פירושונים |
הסרת קישורים עודפים |
||
שורה 8:
| מתכנן = [[גואידו ואן רוסום|גואידוֹ ואן רוֹסוּם]]{{הערה|[http://he.forvo.com/word/guido_van_rossum/ הגייה] באתר [[Forvo]]}}
| מפתח = קרן התוכנה של פייתון{{הערה|[http://www.python.org/psf/ Python Software Foundation (PSF)], באתר פייתון}}
| גרסה אחרונה = 3.9.0 ב־[[5 באוקטובר]] [[2020]] {{ש}} 2.7.18 ב־[[20 באפריל]]
| תאריך גרסה אחרונה =
| טיפוסיות = דינמית ([[טיפוסיות ברווז]]), חזקה, מובלעת
| מימושים = [[מפרש (תוכנה)|מפרשים]]: CPython, [[IronPython]], Jython, Numba, PyPy, MicroPython
שורה 20:
'''פייתון''' (ב[[אנגלית]]: '''Python''') היא [[שפת תכנות דינמית]] מהנפוצות ביותר. פייתון תוכננה תוך שימת דגש על קריאוּת הקוד, וכוללת מבנים המיועדים לאפשר ביטוי של תוכניות מורכבות בדרך קצרה וברורה. אחד המאפיינים הבולטים בתחביר השפה הוא השימוש ב[[הזחה]] להגדרת בלוקים של קוד (ללא שימוש בסוגריים או ב[[מילה שמורה|מילים שמורות]] לצורך כך, כמו ברוב השפות הנפוצות).
פייתון היא שפה מרובת־[[פרדיגמת תכנות|פרדיגמות]], המאפשרת [[תכנות מונחה-עצמים|תכנות מונחה־עצמים]], [[תכנות פרוצדורלי]], ובמידה מסוימת גם [[תכנות פונקציונלי]]. לשפה [[ספרייה (תכנות)|ספרייה]] סטנדרטית גדולה וענפה, והיא תומכת באופן מובנה בהרחבה שלה אל שפות אחרות (בתלות במפרש: [[שפת C|C]]{{כ}}, [[C++|++C]],{{כ}} [[Java]]{{כ}} ו־[[C Sharp|#C]]).
לשפה שתי גרסאות ראשיות, פייתון 2 ופייתון 3. פייתון 2 איננה בפיתוח יותר (למעט תיקון באגים), והתמיכה בה הסתיימה
שם השפה "פייתון" נבחר כ[[מחווה (אמנות)|מחווה]] לקבוצה הקומית "[[מונטי פייתון]]"{{הערה|{{קישור כללי|כתובת=https://docs.python.org/3/tutorial/appetite.html|כותרת=Whetting Your Appetite|אתר=python.org}}}}.
שורה 34:
בין הכללים על פיהם מתוכננת השפה:
* "צריכה להיות דרך אחת, ועדיף אחת בלבד, לבצע זאת" (כתגובה לתפיסה של התכנות בשפת [[פרל]]: "יש יותר מדרך אחת לבצע זאת").
* "כולנו אנשים בוגרים כאן"
==מאפייני השפה==
===המימוש: מהדר ומפרש===
תוכניות פייתון נכתבות בקובצי טקסט,
על מנת להריץ קוד פייתון יש לבחור מימוש
# בשלב הראשון, קוד פייתון מהודר לשפת ביניים נמוכה, מבוססת מחסנית ([[Bytecode]]). תוצאת ההידור הזה נשמרת בקבצים עם הסיומת pyc.
שורה 56:
פייתון היא שפה שתומכת בשימוש במספר [[פרדיגמת תכנות|פרדיגמות תכנות]] שונות. ניתן לכתוב קוד [[תכנות מונחה עצמים|מונחה עצמים]], [[תכנות פרוצדורלי|פרוצדורלי]] ובמידה מסוימת [[תכנות פונקציונלי]]. [[תכנות גנרי]] נתמך בשפה באופן טריוויאלי, בדומה לכל שפה בעלת [[טיפוסיות]] דינמית.
פייתון מאפשרת ואף מעודדת התבוננות־פנימה ([[Reflection (תכנות)|Reflection]]), ותומכת ב[[עיבוד מקבילי#תכנות מקבילי|תכנות מקבילי]] ו[[תכנות מוכוון-אירועים|תכנות מוכוון־אירועים]] באמצעות מודולים מתאימים בספרייה הסטנדרטית.
===ניהול הזיכרון ויצירת אובייקטים===
פינוי הזיכרון מבוצע בצורה אוטומטית, על ידי מנגנון [[איסוף זבל (מדעי המחשב)|איסוף זבל]], בעיקר תוך שימוש במניית התייחסויות, ולא דורש התייחסות מפורשת מצד המתכנת.
[[אובייקט (מדעי המחשב)|אובייקט]]ים מוקצים על גבי הערימה, כאשר הם נוצרים על ידי קריאה למחלקה, למשל <tt> (x=str(15 </tt>{{כ}}, או על ידי הצבה של ליטרלים בשפה
המשתנים עצמם, "הרפרנסים", הם [[מחרוזת (מדעי המחשב)|מחרוזות]] פשוטות המשמשות כמפתחות במילון שמגדיר את תחום ההכרה (scope) הנוכחי.
===המשמעות התחבירית של ההזחה===
בשפות רבות אין משמעות תכנותית להזחה כשלעצמה: כל בלוק מוקף בתווי בקרה מיוחדים המסמנים את תחילתו וסופו של הבלוק, אף ללא כל הזחה (סוגריים מסולסלים ב־[[C (שפת תכנות)|C]] או [[Perl]], ו־begin ו־end ב[[פסקל (שפת תכנות)|פסקל]] וב־[[VB]]). בפייתון, המבנה של בלוקים של קוד בתוכנית נקבע על ידי ההזחה שלהם: עצם הזחת הבלוק מגדירה אותו כבלוק תכנותי שונה, באופן שמזכיר את שיטת העבודה
=== מאפיינים תחביריים נוספים ===
*
* תנאים בפקודות תנאי ולולאות נכתבים ללא סוגריים, ומזוהים על ידי המהדר בעזרת מילים שמורות ותו ':' המופיע לאחריהם.
* פקודות מופרדות לרוב על ידי מעבר שורה. שימוש בתו ';' ([[נקודה ופסיק]]) להפרדה בין פקודות הוא אופציונלי, וכמעט שלא בשימוש בפועל.
==מערכת הטיפוסים==
[[מערכת טיפוסים|מערכת הטיפוסים]] בפייתון היא בעלת המאפיינים הבאים:
* '''חזקה''': לא ניתן להפעיל על משתנה פעולה שלא מוגדרת על הטיפוס אליו הוא שייך. לדוגמה, ניסיון לבצע פעולת חזקה בין שתי מחרוזות
* '''דינמית''': האובייקטים, ולא המשתנים בשפה, הם השייכים לטיפוס. כל משתנה בשפה יכול להצביע על אובייקט מכל טיפוס. כאשר מגדירים פונקציה, אין הגבלה על סוג הטיפוס שיועבר בכל קריאה אליה. ייתכן שבקריאה אחת יועבר מספר שלם, ובקריאה אחרת תועבר מחרוזת. הטיפוסיות היא "טיפוסיות ברווז" (Duck Typing), דהיינו נקבעת על פי הפעולות אותן ניתן לבצע על המשתנה. אם יש צורך לוודא כי משתנה שהתקבל כפרמטר בפונקציה, לדוגמה, הוא מטיפוס "מספר שלם", יש לבצע בדיקה מפורשת (בדרך כלל בעזרת פקודת assert או if).
* '''מובלעת''': אין הכרזה על קיום משתנים. שם של משתנה מוגדר אם הוא מופיע בצידה השמאלי של פעולת השמה, כפרמטר לפונקציה, כמשתנה לולאה, כפרמטר לתפיסה של חריגה או בפקודת del. מאפיין זה מאפשר גמישות רבה בכתיבת הקוד, וכתיבת קוד קצר יותר, אך מנגד מקשה על זיהוי ואיתור שגיאות בזמן ההידור, ומקשה על איתור טעויות הקלדה.
* '''סמנטיקת התייחסות (Reference)''': משתנים הם שמות של מצביעים (References) אל אובייקטים, ולא שמות של האובייקטים עצמם. כאשר מתבצעת פעולת השמה בין משתנים בצורה x=y, לא מועתק תוכן האובייקט אליו מצביע y. במקום זה, המשתנה x מוגדר כך שיצביע אל אותו אובייקט אליו מצביע y. פרמטרים לפונקציות מועברים על ידי העתקה של המצביעים אליהם. טכנית זו "קריאה על ידי ערך" (Call by Value) אך רבים (ובהם ממציא השפה) מכנים זאת "קריאה על ידי התייחסות לאובייקט" (Call by Object Reference). קריאה לפונקציה בצורה (foo(x, שבתוכה מבצעים x=5, לא תגרום למשתנה x להתייחס לאובייקט אחר מזה שהוא התייחס אליו קודם.
* '''טווח הכרה סטטי''' (או '''לקסיקלי'''): שם של משתנה מוגדר רק בקטעי קוד המוכלים בקטע שבו בוצעה אליו פעולת כריכה. למשל, משתנה בשם x המוגדר בתוך פונקציה אחת לא יהיה קשור בשום דרך למשתנה x המוגדר בפונקציה אחרת.
===טיפוסים מובנים בשפה===
השפה תומכת במגוון גדול יחסית של [[טיפוס נתונים|טיפוסי נתונים]] בסיסיים. בין המרכזים שבהם ניתן למנות:
* טיפוס הנתונים int מאחסן [[מספר שלם]]. בגרסה 3.0 אוחד טיפוס זה אל תוך long (בגרסאות x.{{כ}}2 מספרים מטיפוס long מסומנים באות L בקצה), ואין לו הגבלת גודל (מעבר למה שמאפשר [[זיכרון וירטואלי|הזיכרון הווירטואלי]] של המחשב)
* טיפוס הנתונים [[נקודה צפה]] (float) מאפשר אחסון ערך מקורב של [[מספר ממשי]] באמצעות ייצוג נקודה צפה. טיפוס זה זהה לטיפוס double בשפת C (ולמעשה ברוב המקרים ממומש על ידיו). בנוסף, ניתן לייבא את המודול decimal המאפשר ייצוג של שברים עשרוניים, ונוח יותר לעבודה במקרים בהם הייצוג הזה מדויק יותר (כגון [[חשבונאות]]).
* [[מספר מרוכב]] גם הוא נתמך בפייתון (נכתב בצורה 3+4j). טיפוס זה נוסף לשפה בשל השימוש הרב שעושים בו [[מדען|מדענים]] ו[[מהנדס
* ישנה תמיכה מובנית ב[[מחרוזת (מדעי המחשב)|מחרוזות]]
אובייקטים מטיפוסי מספרים ומחרוזות הם בלתי ניתנים לשינוי (Immutable), כלומר שינוי ערכו של משתנה מטיפוס כזה הוא בעצם הסרת ההתייחסות אליו והפנייתה לערך חדש.
בשפה מוגדרים שני טיפוסים סדרתיים: tuple ו־list.
* הטיפוס tuple הוא ייצוג ממוחשב של [[N-יה סדורה|N־יה סדורה]]: רצף קבוע של ערכים מטיפוסים אחרים (כלשהם), המיוצג על פי רוב בתוך סוגריים. לדוגמה (1, 2, 3). טיפוס זה מקל על דימוי של החזרת מספר ערכים מפונקציה בודדת, או ביצוע פעולת החלפה בין משתנים (כך ניתן להחליף בין המשתנים a, b באמצעות הפקודה "a, b = b, a"). גם אובייקט מטיפוס זה איננו ניתן לשינוי, דבר המאפשר שימוש בו כמפתח עבור מילון (ראה בהמשך), בשל היכולת להשתמש בו ב[[טבלת גיבוב]]. (למעשה, בשל העובדה שפייתון היא בעלת טיפוסיות דינמית, ובשל השימוש בסמנטיקת רפרנס, זהו מערך לכל דבר).
* המקבילה ל[[מערך (מבנה נתונים)|מערך]] בפייתון הוא מבנה הנתונים "רשימה" (list). זהו שם מטעה במקצת; על אף שמו, טיפוס זה הוא למעשה מערך שגודלו משתנה, באופן שקוף למתכנת, וניתן לגשת אל כל איבר בו על ידי אינדקס. רשימה תוגדר בין סוגריים מרובעים, לדוגמה ['x','y','z']. בניגוד ל־tuple, שתוכנו אינו ניתן לשינוי, ברשימה ניתן לשנות כל אחד מהאיברים, וכן להרחיב אותה או להסיר ממנה איברים. בשל כך, לא ניתן להשתמש ברשימות כמפתחות למילון. בשביל אופציות אחרות של מערך שאינן אפשריות ברשימה, ניתן לייבא מודול מתאים.
* ה[[מילון (מבנה נתונים)|מילון]] (dict), הנקרא לעיתים "מערך אסוציאטיבי" או "hash", הוא טיפוס המאפשר מיפוי ממפתחות לערכים. כל מילון כולל קבוצה של זוגות כאלה, וגישה אל איבר על פי המפתח שלו מחזירה את הערך המתאים.
שורה 100:
החל מהגרסאות האחרונות של השפה אוחדו המחלקות והטיפוסים, וכולם שייכים למטא־מחלקה "type" (כולל המחלקה type עצמה).
=== אנוטציות ובדיקת
כאמור, פייתון היא שפה דינמית ולא מתבצעת בדיקת טיפוסים בזמן הידור. עם זאת, פייתון מאפשרת להוסיף אנוטציות
להלן דוגמה לקוד פייתון עם סימון טיפוסים (הסימון <- הוא עבור טיפוס ההחזרה. טיפוסי משתנים מסומנים בעזרת הערות):
שורה 118:
===תנאי===
כמו בכל שפת תכנות אימפרטיבית (מבוססת פקודות), ישנה אפשרות לביצוע מותנה של פקודות על ידי [[פקודת if]], בה מחושב ערכו של [[ביטוי (מדעי המחשב)|ביטוי]] מסוים ומתבצע רצף פקודות אם ערך זה הוא "אמיתי", אחרת מתבצע רצף פקודות המפורט לאחר המילה "else", אם קיים כזה. אין בפייתון מבנה switch כמו בשפות אחרות, אך ניתן להשתמש במילה elif המהווה קיצור עבור else if. ערך "אמיתי" איננו רק הערך True של הטיפוס bool, אלא כל ערך שהמחלקה שלו מגדירה אותו כאמיתי
דוגמה לתחביר של [[פקודת תנאי]], הבודקת אם משתנה x הוא זוגי על ידי בדיקת שארית בחלוקה ל־2, ומדפיסה הודעה מתאימה:
שורה 128:
</syntaxhighlight>
בפקודה זו ניתן לראות את היתרון הגדול שמעניקה ההזחה: לא תיתכן תופעה של else "מידלדל"
פייתון לא תומכת בבורר מרובה כניסות (בדומה ל־switch בשפת C ודומותיה), אך קיימת מילה שמורה elif המאפשרת לבדוק רצף של תנאים, באופן דומה למנגנון זה:
שורה 141:
print("I don't know what x is")
</syntaxhighlight>
ללא המילה elif היה צורך לבצע קינון עמוק במקרה זה
<syntaxhighlight lang="python">
if x % 2 == 0:
שורה 154:
print("I don't know what x is")
</syntaxhighlight>
בניגוד לשפות רבות אחרות, לפקודה else שימושים בהקשרים אחרים
====ביטוי תנאי====
שורה 190:
==== לולאת for ====
מבנה נוסף ועיקרי בשפה הוא '''לולאת for'''. בלולאה זו מוגדר משתנה, ומתקבלת רשימה (או כל טיפוס שניתן לעבור עליו לפי סדר
דוגמה לשימוש בלולאת for להדפסת ריבועי המספרים בין 0 ל־5, לא כולל 5:
שורה 222:
</syntaxhighlight>
בפייתון כל שגיאה מעלה (raise) חריגה, וכל שגיאה ניתן ללכוד
===מנהלי הקשר וניהול משאבים===
שורה 238:
הפונקציות והשיטות בשפה הן אובייקטים לכל דבר. ישנם 7 סוגים של עצמים ברי־קריאה (callable) בפייתון:
* פונקציות מובנות ושיטות מובנות. אלה נכתבו בשפת האם של המפרש והוטמעו אל תוך השפה.
* פונקציות המוגדרות על ידי המשתמש, נכתבות באמצעות שימוש במילה השמורה def (קיצור של define
* שיטות המוגדרות על ידי המשתמש, נכתבות בדומה לפונקציות, אך מוגדרות בתוך מחלקה. כל השיטות בפייתון הן סטטיות, אך כאשר קוראים לשיטה מתוך אובייקט, בצורה ()x.foo, האובייקט מועבר בתור הארגומנט הראשון. (מקובל לקרוא לו self, המקביל ל־this בשפות ממשפחת ++C, אך זו איננה מילת מפתח ולא מילה שמורה).
* ביטויי למדא
* מחלקות
* כל אובייקט שהוגדרה עבורו השיטה __call__, הוא אובייקט בר־קריאה (פעולה זו מקבילה להעמסה של אופרטור () בשפת ++C).
=== פונקציות מוגדרות על ידי המשתמש ===
[[קובץ:Fibonnacci-Python.png|שמאל|ממוזער|350px|מימוש של פונקציית [[סדרת פיבונאצ'י|פיבונאצ'י]] במפרש אינטראקטיבי של פייתון, המזהים צבועים לפי תפקידיהם
בדומה למרבית שפות התכנות הפרוצדורליות, ניתן להגדיר בפייתון פונקציה
פונקציה מסיימת את החישוב שבה ומחזירה ערך באחת משתי דרכים: או על ידי המילה השמורה return או על ידי הגעה לסוף הבלוק המגדיר אותה. במקרה האחרון, או כאשר פקודת return מופיעה ללא ביטוי אחריה, מוחזר מהפונקציה הערך None מהטיפוס NoneType. פונקציה עשויה להסתיים גם על ידי זריקת חריגה, אך במקרה כזה היא איננה מחזירה ערך.
שורה 362:
</div>
|-
| {{ללא קוד ויקי|<<, >>, {{!}}, &, ^, ~}} || פעולות לוגיות: הזזה של ביטים ימינה ושמאלה, [[או (לוגיקה)|או]], [[וגם (לוגיקה)]], [[XOR]], [[לא (לוגיקה)|משלים]] || עבור מספרים שלמים (בייצוג [[משלים ל-2|משלים ל־2]]):{{ש}}1 >> 2 == 4
|-
| @ || [[כפל מטריצות|הכפלת מטריצות]] || החל מגרסה 3.5. הסימן משמש גם לשימוש בדקורטורים
שורה 368:
|}
כל אופרטור מתמטי/לוגי ניתן לשלב יחד עם פעולת השמה, בדומה לשפת C
== תכנות מונחה־עצמים ==
השפה תומכת ב[[תכנות מונחה-עצמים|תכנות מונחה־-עצמים]], אך איננה כופה את המתכנת להשתמש בו. כך ניתן לכתוב תוכניות קצרות ופשוטות, וגם מערכות תוכנה מורכבות.
כל ישות בשפה היא אובייקט, ובפרט כל מחלקה היא בעצם אובייקט של המחלקה type. ישנה אפשרות להורשה מרובה, וכל מחלקה יורשת ישירות או בעקיפין מן המחלקה object.
שורה 401:
===שדות ושיטות===
השפה מאפשרת הגדרת שדות נתונים
שיטות שייכות באופן בלעדי למחלקה, כלומר הן תמיד סטטיות. בהצהרה של שיטה, אם מתבצעת קריאה לשיטה דרך אובייקט ספציפי, הוא מועבר בתור הפרמטר הראשון של השיטה (שמקובל לקרוא לו self), באופן מובלע. ניתן לבצע קריאה כזאת גם באופן מפורש:
שורה 418:
שתי הקריאות ל־A.foo שקולות במקרה זה, וידפיסו את אותה תוצאה: "foo is called for Example".
בניגוד לשפות מונחות־עצמים אחרות, ניתן להוסיף לכל אובייקט (ומחלקה, שגם היא אובייקט) שדות נתונים בכל זמן נתון, גם לאחר סיום הגדרת המחלקה, כלומר גם בזמן ריצה, או באופן מותנה. למעשה, כל האמור הוא התעסקות עם מרחב השם (namespace) בלבד
===בניה והריסה===
שורה 436:
* NumPy – חבילת הרחבה [[מתמטיקה|מתמטית]] הכוללת [[פונקציה|פונקציות מתמטיות]] רבות, [[וקטור (אלגברה)|וקטור]]ים ו[[כפל מטריצות]], [[אלגברה ליניארית]], [[טרנספורם פורייה]] ועוד.
* SciPy – חבילת הרחבה ל[[מדעים מדויקים]].
* MatPlotLib – חבילת הרחבה המאפשרת יצירת [[תרשים|תרשימים]] ו[[גרף (נתונים)|גרפים]] בדומה
כדי להשתמש בחבילות אלו יש להתקינן (באמצעות הפקודה PIP install בצירוף שם החבילה או באמצעות python -m pip install test בזמן שtest מסמל את שם החבילה) ואז להוסיף בראש קובץ הקוד את השורות הבאות:
שורה 446:
==שימוש בתעשייה==
השפה משמשת למספר מטרות. אחד השימושים המקובלים הוא לכתיבת תוכנות שייעודן הוא זמני
שימוש נוסף בפייתון הוא לפיתוח [[אלגוריתם|אלגוריתמים]] בתחומי [[מדעים מדויקים|המדעים המדויקים]] וה[[הנדסה]], בדומה לשימוש
פייתון היא אחת משלוש השפות העיקריות בהן עובדת [[גוגל (חברה)|חברת גוגל]]. בין השאר, הגרסה הראשונה של [[זחלן רשת|זחלן הרשת]] של [[גוגל (מנוע חיפוש)|מנוע החיפוש גוגל]] נכתבה בפייתון{{הערה|1=[http://web.archive.org/web/19971210065425/backrub.stanford.edu/backrub.html Stanford BackRub Web Project]{{כותרת קישור נוצרה על ידי בוט}}}}, כל מערכת הפיתוח של גוגל (ניהול גרסאות ובניית מהדורות) מתבצעת בטכנולוגיה מבוססת פייתון וחלק מאתריה הגדולים כגון [[יוטיוב]] כתובים בצורה כמעט גורפת בפייתון. בנוסף, באפריל [[2008]] הזמינה גוגל גולשים לכתוב אפליקציות פייתון ולהתקינן על מערכת שרתיה{{הערה|1=[http://linmagazine.co.il/enterprise/2008/04/08/google-app-engine Google App Engine: גוגל תארח אפליקציות רשת בשפת פייתון], לינמגזין<!-- Bot generated title -->}}.
[[אנקונדה (מנהל חבילות תוכנה)|אנקונדה]] היא הפצה של שפות התכנות פייתון לתכנות מדעי ([[מדע הנתונים|מדעי הנתונים]], יישומי [[למידת מכונה]], עיבוד נתונים בקנה מידה גדול, ניתוח ניבויי וכו').
עוד שימושים נוספים בפייתון הם
==ראו גם==
שורה 467 ⟵ 468:
* [https://data.cyber.org.il/python/python_book.pdf מדריך מלא לשפת פייתון באתר של מטה הסייבר הצה"לי]
* [http://vlib.eitan.ac.il/python אתר עברי ללימוד פייתון] (האתר איננו מעודכן לגרסאות העדכניות של השפה)
* [http://www.python.org.il/ Python-IL]
* [http://pydev.org PyDev]
== הערות שוליים ==
|