ההתנהגות המיוחדת של and ו-or בפייתון
בפייתון, and ו-or מבצעות את הלוגיקה הבוליאנית הרגילה שלהם, אולם הם לא
מחזירים ערכים בוליאנים מייצגים כגון 0 ו-1. במקום זאת הם מחזירים
אחד מבין הערכים המושווים.
And
>>> 'a' and 'b'
'b'
>>> '' and 'b'
''
>>> 'a' and 'b' and 'c'
'c'
העבירו את העכבר על שורות
הקוד המסומנות כדי לקבל הסברים
כאשר משתמשים ב- and, פייתון מחשב את ערכיהם של הביטויים משמאל
לימין. 0, '', [], (), {} ו-None הם בעלי ערך שקרי בהקשר בוליאני; כל השאר הוא
בעל ערך אמת. אם שני הביטויים אמיתיים באופן זה, and מחזיר את הערך האחרון ששוערך, כלומר הימני. במקרה
הזה, and מצא את ערכו של 'a', שהוא אמת, ולאחר מכן את ערכו של 'b' שהוא אמת גם כן – ולכן החזיר 'b'.
אם אחד הביטויים הוא בעל ערך שלילי, and מחזיר את הביטוי בעל הערך השלילי הראשון שהוא מצא.
במקרה זה – ''.
גם במקרה זה כל הערכים נכונים, ולכן מוחזר האחרון –
'c'.
Or
>>> 'a' or 'b'
'a'
>>> '' or 'b'
'b'
>>> '' or [] or {}
{}
>>> def sidefx():
... print "in sidefx()"
... return 1
>>> 'a' or sidefx()
'a'
העבירו את העכבר על שורות
הקוד המסומנות כדי לקבל הסברים
כאשר משתמשים ב-or, פייתון מחשב את ערכי הביטויים גם כן משמאל לימין,
כמו ב-and. אם ערכו של אחד מהביטויים נכון – הביטוי מוחזר מיד.
במקרה זה 'a' מוחזר מיד עם הימצאו.
or חישב את ערכו של '' (שקר) ואז את ערכו של 'b' (אמת), והחזיר את 'b'.
אם ערכי כל הביטויים שקריים, or מחזיר את הביטוי האחרון. במקרה זה
- {}.
or (וכך גם and) מחשב את ערכם של ביטויים (משערך אותם) רק כל עוד
הוא טרם מצא ערך אמיתי (באותו אופן, and משערך ביטויים כל עוד הוא טרם מצא ערך שקרי). אבחנה
זו חשובה שכן עלולות להיות לה תופעות לוואי. בדוגמה זו, or שיערך את 'a' – והחזיר אותו מיד כי הוא אמיתי. הביטוי הימני
בכלל לא שוערך ולכן לא התבצעה קריאה לפונקציה, כפי שניתן לראות בכך
שהיא לא כתבה את הפלט שלה למסך.
תחליף למבנה- x?y:z מ-C
מתכנתי ה-C שביניכם מכירים בוודאי את המבנה bool
? a : b, שמשתערך ל-a אם bool אמיתי, ול-b אם הוא שיקרי. פייתון לא מכירה את הביטוי
הזה, אולם בגלל התנהגותם המיוחדת של and ושל or בשפה, ניתן להשיג באמצעותם את אותו הדבר. התבוננו בדוגמה
הבאה:
>>> a = "first" >>> b =
"second"
>>> 1 and a or b
'first'
>>> 0 and a or b
'second'
העבירו את העכבר על שורות
הקוד המסומנות כדי לקבל הסברים
התחביר שכאן דומה לתחביר
המדובר ב-C. הביטוי כולו משתערך משמאל
לימין ולכן ה-and משתערך ראשון. הוא משתערך ל-'first'. ה-or משערך ביטוי זה תחילה, ומיד מחזיר אותו שכן הוא אמיתי.
לכן מוחזר 'first'.
במקרה זה ה-and משתערך ל-0, ולכן ה-or מחזיר את הביטוי השני- 'second'.
יש לשים לב לכך שאם ערכו של a הוא שיקרי, הטריק הזה לא עובד...
>>> a = "" >>> b =
"second"
>>> 1 and a or b
'second'
האם את/ה יכול/ה לגלות מדוע?
כדי להימנע מבעיה זו, ניתן להשתמש בצורה הבטוחה של הטריק כך:
>>> a = "" >>> b =
"second"
>>> (1 and [a] or [b])[0]
''
|