שלושה שיפורים בפייתון 3.6 ששווה להכיר

04/02/2018

פוסט זה כולל טיפ קצר לעבודה יעילה עם Python. אם אתם רוצים ללמוד פייתון יותר לעומק אני ממליץ על קורס Python כאן באתר.
הקורס כולל עשרות שיעורי וידאו והמון תרגול מעשי וילמד אתכם Python בצורה מקצועית מההתחלה ועד הנושאים המתקדמים.

שידרגתם לפייתון3 ולא בטוחים מה יצא לכם מזה? הנה שלושה שיפורים שאני ממש שמחתי לגלות. ותודה למאיר על ההערה מהפוסט הקודם שבזכותה התחלתי את החיפוש הזה.

1. קו תחתון בכתיבת מספרים

פרל ורובי תמכו בכתיב הזה מאז ומעולם, ולא ברור למה לקח לפייתון כל כך הרבה זמן לאמץ את השיטה. מסתבר שלבני אדם לא תמיד קל לזהות כמה אפסים יש במספר כמו 2000000. מצד שני די קל לנו לזהות ש 2,000,000 הוא שני מיליון. פסיק בפרל סימן רשימה ולכן הוחלט שם שקו תחתון יחליף אותו ברישום מספרים ארוכים. כך פרל:

my $x = 2_000_000;

רובי:

x = 2_000_000

והחל מגירסא 3.6 גם פייתון:

x = 2_000_000

2. שיערוך ביטויים בתוך מחרוזת

עוד פיצ'ר שהיה קיים בפרל מאז ומעולם, הופיע ברובי בגירסא משודרגת ובאיחור אופנתי הגיע גם לפייתון. ב perl יכולנו לשערך משתנים בתוך מחרוזות די בקלות:

my $name = 'ynon';
say "Hello $name";

מצד שני מי שרצה לשערך ביטויים יותר מורכבים היה צריך לעבוד קשה וללמוד להשתמש ב References:

my $x = 10;
my $y = 20;
say "$x + $y = @{[$x + $y]}";

רובי התחילה עם גירסא שעובדת טוב גם במקרים הפשוטים וגם בביטויים מורכבים. פשוט כותבים בתוך המחרוזת #{...} וכל מה שבתוך הביטוי משוערך כקוד רובי:

x = 10
y = 20
puts "#{x} + #{y} = #{x + y}"

ופייתון בגירסא 3.6 אימצה את הגישה של רובי ורק שינתה קצת את הסימנים. אפשר להתחיל מחרוזת באות f ואז כל קוד בתוך סוגריים מסולסלים ישוערך:

x = 10
y = 20
print(f"{x} + {y} = {x + y}")

3. קידוד קלט ופלט ב Popen

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

import subprocess, sys

p = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)

for line in p.stdout:
    if line.startswith('d'):
        sys.stdout.write(line)

הבעיה שפייתון מתיחס לשורות שנקראות מהפקודה ls בתור Byte Strings ולכן הפקודה startswith מצפה לקבל גם היא byte string ו sys.stdout.write בכלל לא מוכנה להקשיב.

הדרך לשכנע את פייתון לתרגם את הקלט לטקסט היא להעביר את הפרמטר universal_newlines לבנאי של Popen:

import subprocess, sys

p = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, universal_newlines=True)

for line in p.stdout:
    if line.startswith('d'):
        sys.stdout.write(line)

אבל זה לא נותן לנו לשלוט בקלות על ה Encodings וגם לא לגמרי ברור מה הקשר בין שני הדברים. בכל מקרה פייתון 3.6 כבר הוסיף פרמטר encoding כך שאפשר לכתוב:

import subprocess, sys

p = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, encoding='utf-8')

for line in p.stdout:
    if line.startswith('d'):
        sys.stdout.write(line)

ומקבלים קוד ברור יותר ועם יותר אפשרויות הרחבה.