שבוע 9 – יום 1: סביבת עבודה

הקדמה

אהלן לכולם וברוכים הבאים לחלק השני של הקורס, אני נרגש שהגעתם עד כאן :slight_smile:

במהלך השבוע ישוחררו הנחיות כלליות, חומרים ותרגילים שניגע בהם בשבוע הנוכחי.
בשבועיים הקרובים (“שבוע 9”) נלמד את החומרים הבאים:

  1. סביבת עבודה (IDE, יכולות ניפוי שגיאות)
  2. עבודה בפרויקט – טיפול בקובצי פייתון מרובים, הרצת “פרויקט”.
  3. רמיזה על טיפוסים (Type Annotations).
  4. קשטנים (Decorators).

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

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

יום 1 – סביבת עבודה

אחת התוכנות הנפוצות ביותר בקרב מפתחים היא ה־IDE – “סביבת הפיתוח המשולבת” (Integrated Development Environment). זה בסך הכל שם מפונפן לתוכנה שבה מפתחים את הקוד שלנו, והיא מספקת לנו כלים נוחים לעשות זאת.

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

בקורס הזה נסקור שתי סביבות פיתוח: Visual Studio Code ו־PyCharm. אתם רשאים לבחור אחת מהן, ותדרשו לכתוב את הקוד שלכם בעזרתן בשבועות הקרובים. בכל מקרה, אמליץ לכם להתנסות ולשחק בשתיהן.


אפשרות 1: Visual Studio Code

היכרות:
סביבת פיתוח חדשה יחסית (2015; בת 5) שמפותחת ומתוחזקת על ידי Microsoft.
כל־כולה קוד פתוח, מה שמאפשר לקהילה לתרום לה יכולות חדשות.
היא מתעדכנת כמעט כל חודש, ויש לה קהילה רחבה שמפתחת עבורה תוספים באופן תדיר.

יתרונות:

  1. סביבת העבודה נכתבה בקוד פתוח ומפותחת על ידי הקהילה. השימוש בה חינמי, גם לצורך מטרות מסחריות.
  2. היא תומכת בשפות רבות, לא רק בפייתון, כך שאם הפרויקט משלב יותר משפה אחת נוח להשתמש בה.
  3. תמיכה די טובה ב־Jupyter Notebooks.
  4. מהירה ופחות bloated ביחס ל־PyCharm.

התקנה ומדריך: כאן.
בונוס: קראו על התוספים Live Share, IntelliCode, Code Spell Checker, Peacock, Rainbow Brackets. מומלץ גם להתקין את התוסף Code Runner כדי להריץ בנוחות קוד.
בונוס 2: התקינו את התוסף Pylance, תוסף חדש מבית מיקרוסופט שאמור לשפר את התמיכה בפייתון.

מצאתם תוספים מגניבים? ראיתם פיצ’ר או מדריך נחמד? נתקלתם בבעיה? פתחו אשכול חדש ושתפו.

אפשרות 2: PyCharm

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

יתרונות:

  1. סביבת העבודה נבנתה ומיועדת לפייתון מא’ ועד ת’.
  2. יכולת ניתוח הקוד ש־PyCharm הגיעה אליה מרשימה, וה־IDE יודע לעלות ולהעיר על בעיות ולהציע השלמות בצורה טובה יותר מאשר IDEs אחרים.

התקנה ומדריך: כאן.

מצאתם תוספים מגניבים? ראיתם פיצ’ר או מדריך נחמד? נתקלתם בבעיה? פתחו אשכול חדש ושתפו.


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


ניפוי שגיאות

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

קראו על יכולות ניפוי השגיאות של Visual Studio כאן.
קראו על יכולות ניפוי השגיאות של PyCharm כאן.

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

להעמקה, בספר Think Python תמצאו מספר פרקים על ניפוי שגיאות.


תרגיל: סדרת פיבואפצ’י

מטרת הפונקציה fibo היא לקבל מספר (n), ולהחזיר את כל המספרים בסדרת פיבונאצ’י שקטנים ממש מ־n.
קיבלתם את המימוש הבא לפונקציה:

def fibo(n):
    f = 0
    g = 1

    while f < n:
        h = f + g
        yield h
        g = h
        f = g


print(" ".join(str(f) for f in fibo(1000)))

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

תרגיל (אפשרות 1): מנסנס כוחב כתן

תקנו את הקוד הבא כך שינגן את שיר הערש “Twinkle Star”.
השתמשו במנפה השגיאות של סביבת הפיתוח שלכם כדי להבין איפה הבעיה.
תוכלו לבחור בין התרגיל הזה לבין התרגיל הבא (עשו רק 1 מהם).

import math
import sounddevice

import numpy


d = 24000
r = 1100
a = [0, 7, 9, 1]
b = [5, 4, 2, 4]
c = [7, 5, 4, 7]


def f(x):
    """You shouldn't change this function."""
    s = [240 * 2 ** (j / 12.0) for j in (a + b + c) * 2]
    n = s[x // 1000]
    m = (x % 500 > 9) or (x / 1000 % 4 > 2)
    v = 6 * n * (x / r) * m
    k = math.sin(v)
    return k


def f2(d):
    l = []
    for x in range(d):
        h = f(x)
        l.append(int(h * 64000 / 2))
    return numpy.array(l, dtype='float32')


sounddevice.play(f2(d), r)
status = sounddevice.wait()

תרגיל (אפשרות 2): ועל ים לקו שמונה מלכות

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

import itertools


BOARD_SIZE = 8


def get_rows(board):
    yield from board


def get_columns(board):
    yield from zip(*board)


def get_diagonals(board):
    size = len(board)

    # left to right, top to bottom digonals
    for col in range(size):
        diagonal = ((offset, col + offset) for offset in range(size - col))
        flipped = ((y, x) for x, y in diagonal)
        if diagonal != flipped:
            yield [board[x][y] for x, y in flipped]
        yield [board[x][y] for x, y in diagonal]

    # left to right, bottom to top digonals
    for col in range(size):
        diagonal = ((col - n, n) for n in range(col + 1))
        flipped = ((size - x - 1, size - y - 1) for x, y in diagonal)
        yield [board[x][y] for x, y in diagonal]
        yield [board[x][y] for x, y in flipped]


def is_solution_valid(board):
    check_functions = (get_rows, get_columns, get_diagonals)
    for get_line_from_board in check_functions:
        for line in get_line_from_board(board):
            if line.count(True) > 1:
                return False
    return True


def possible_positions(max_size):
    yield from itertools.product(range(max_size), repeat=max_size)


def update_board(board, queen_columns):
    board_size = len(board)
    queen_placements = frozenset(zip(range(8), queen_columns))
    for row in range(board_size):
        for col in range(board_size):
            board[row][col] = (row, col) in queen_placements


def get_solutions(board):
    for queen_columns in possible_positions(max_size=len(board)):
        update_board(board, queen_columns)
        if is_solution_valid(board):
            yield board


def create_board(size):
    row = [False] * size
    board = [row] * size
    return board


def print_board(board):
    for row in board:
        print(' '.join(str('Q' if col else '.').center(3) for col in row))


print("Started!")
for solution_board in get_solutions(create_board(BOARD_SIZE)):
    print_board(solution_board)
    print('-' * 80)

תרגיל: Advent of Code 12

השתמשו בסביבת העבודה שלכם על מנת לפתור את תרגיל מספר 12 ב־Advent of Code.
פתרו רק את חצי היום הראשון (רק את התרגיל שמוצג למשתמשים לא רשומים, או שטרם פתרו את התרגיל).

21 לייקים

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

היי ים

איפה מגישים את התרגילים?

2 לייקים

בינתיים דרך Jupyter notebook (תעתיק לשם את הקוד ותגיש כמו שהיית עושה עד היום)

היי,
תוסף מגניב לvscode

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

אפשר להגדיר שהתוסף ירוץ כל כמה שניות (ההגדרות הן על בסיס מאית השניה)

מוזמנים לצפות בסרטון - https://www.youtube.com/watch?v=W--_EOzdTHk
ההסבר על התוסף נמצא החל מ-7:10

5 לייקים

Jupyter Notebook ב-Vscode

תלחצו ctrl + p ותריצו את הפקודה הבאה:

>Create New Blank Jupyter Notebook

החלון שיפתח יהיה קובץ קוד בסיומת ipynb (כלומר פורמט Jupyter Notebook)
ככה תוכלו לעבוד על Vscode ולשמור בפורמט ג’ופיטר!

יעבוד רק למי שהוריד את התוסף Python (סביר להניח שכבר כולנו)

4 לייקים

לא הבנתי את תרגיל 3, יש מצב להסבר קצת יותר מפורט?

לייק 1

קצת באיחור, שיהיה לכולנו שבוע נהדר!
אני התחלתי כרגע לעבוד עם PyCharm (אוניבריסטה), והתחלתי להנסות עם VSCode.
אעדכן כשאתקל בתוספים מגניבים!

לייק 1

מה שבעצם מבקשים מאיתנו לעשות כאן זה ליצור קוד שמחשב את היחס של כל “ירח” לכל שאר הירחים, במסגרת של זוגות של ירחים. זה קצת מבלבל כי המיקום משפיע על המהירות והמהירות משפיעה על המיקום. אז יש מיקום ראשוני לכל הירחים, ומהירות ראשונית ששווה לאפס. המיקום היחסי של כל ירח משפיע על המהירות של כל ירח אחר בכל אחד מהצירים. צריך לבחון כל ירח מול שלושת הירחים האחרים בשלוש זוגות. אז אם ניקח רק את ציר הX של הירחים ונסתכל רק על הירח הראשון, הוא יוצר שלוש זוגות של מיקומים עם שלושת הירחים האחרים. בכל זוג כזה הירחים משפיעים זה על זה באופן יחסי כאשר זה שהמיקום שלו יותר גדול מושך את המהירות של זה שהמיקום שלו יותר קטן כלפי “מעלה” בדרגה אחת וזה שהמיקום שלו יותר קטן מושך את המהירות של זה שהמיקום שלו יותר גדול כלפי “מטה” בדרגה אחת (אם המיקום שלהם זהה בערכו הם לא משפיעים אחד על השני). ההשפעות המצטברות של כל הזוגות האלו נסכמות ונותנות לנו את המהירות החדשה של כל אחד מהירחים בכל אחד מהצירים. בצילום המסך ניתן לראות שאחרי החישוב הראשון מהירות X של הירח הראשון הפכה מ0 ל 3, כי המיקומים של כל שאר הירחים יותר גדולים משלו. כלומר, הוא יוצר שלוש זוגות עם הירחים האחרים ובכל שלושת החישובים האלה מאחר והמיקום שלו (1-) קטן יותר משל הירח השני בזוג צריך להוסיף למהירות שלו (לא למיקום שלו) +1 (ובאופן דומה לכל אחד מהירחים האחרים צריך להוריד 1 מהמהירות בציר הX). אז הוא עולה מאפס לשלוש. את החישוב הזה צריך לבצע לכל הצירים של כל הירחים. ברגע שיש לנו את זה אז אפשר לחשב בקלות את המיקום החדש (ההסבר שם לגבי חישוב המיקום החדש הוא יותר קל וברור אז לא אכנס אליו כאן). מערך המיקומים החדש כמובן יוצר מערך חישובים חדש שמאפשר ליצור את חישוב המהירות החדש, שיוצר את חישוב המיקומים החדש וחוזר חלילה.

image

11 לייקים

סתם משהו שימושי שמצאתי ונראה שלא כולם מכירים :slight_smile:
סידור אוטומטי של הimports!
זה מגיע כחלק מובנה בpython extension.
פשוט השתמשו בלחצן ימני ואי שם בתפריט הענק שנפתח יש sort imports שיגרום לבודק האוטומטי להזיל ריר על האימפורטים שלכם :upside_down_face:

(הערה- שימו לב שזה לא מסדר לפי ABC מספר מודולים שמייבאים בתוך from ספציפי)

ועוד משהו חמוד בנושא הimports , למי שעדיין אין pylance שימו לב שהוא יודע לעשות import אוטומטי לדברים שאתם מחליטים להשתמש בהם בקוד, לתפארת הPEP והבודק. פשוט צריך לבחור מהרשימה שצצה שאתם מתחילים לכתוב… גיליתי את זה היטב בתרגילי הtyping של יום 3 חחח, שימושי!

10 לייקים

גם ב-PyCharm יש - פשוט לוחצים Alt + Ctrl + O וזה מסדר הכל (או לחפש ב-CTRL + SHIFT + A את Optimize Imports)
ואלו ההגדרות שהבודק האוטומטי אוהב (אפילו מסדר את from X import A, C, B)

8 לייקים

תודה ! סופר שימושי (;

תודה אודליה, כבר הוספתי לעצמי להגדרות

מישהו מכיר דרך להסיר את האסוציאציה של pycharm מקבצי py?

אם אתה רוצה להחליף לתוכנה אחרת - בוינדוס תעשה חיפוש ב-start לזה:
image
ובחלון שנפתח תוכל למצוא את py ולבחור תוכנה

אם אתה רוצה להסיר בכלל - גוגל הוא חבר, אבל אתה יכול לנסות את הדרכים האלו: