לדלג לתוכן

בונים אפליקציית ניהול הוצאות בפייתון - הפרויקט שהופך אתכם ממתחילים למתכנתים

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

בואו נפרק את זה לשלבים.

למה זה פרויקט טוב להתחיל איתו

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

שלב ראשון - איך שומרים את הנתונים

כאן יש לכם שתי אפשרויות עיקריות, וכדאי להכיר את שתיהן.

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

import csv

def add_expense(date, amount, category, description):
    with open("expenses.csv", "a", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerow([date, amount, category, description])

SQLite הוא השלב הבא. זו מסד נתונים אמיתי, קובץ יחיד, בלי שום התקנה נוספת, כי המודול sqlite3 מובנה בפייתון. היתרון הגדול הוא שאלוקח יכולים לשאול שאילתות - "כמה הוצאתי החודש על אוכל" - בלי לכתוב לולאות ידניות שסורקות את כל הקובץ. אם אתם רוצים להרגיש טעימה של איך עובדים עם נתונים בעולם האמיתי, זה השלב לעשות את זה עם SQLite.

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

שלב שני - קטגוריות ותיעוד

הוצאה בלי קטגוריה היא כמעט חסרת ערך. "הוצאתי 500 שקל" לא אומר כלום - "הוצאתי 500 שקל על אוכל בחוץ" כבר סיפור שלם. תכננו מראש רשימה קבועה של קטגוריות - אוכל, תחבורה, דיור, בילויים, אחר - ואל תתנו למשתמש להקליד קטגוריה חופשית. זה נראה כמו הגבלה מיותרת, אבל בפועל זה ההבדל בין דוח שאפשר לנתח לבין בלגן של "אוכל", "Food" ו"מזון" שלושתם בקובץ אחד.

שלב שלישי - argparse וממשק אמיתי

זה השלב שהופך את הפרויקט מסקריפט לתוכנית אמיתית. במקום שהמשתמש יריץ את הקובץ וייענה לשאלות בטרמינל, אתם בונים ממשק שורת פקודה עם המודול argparse:

import argparse

parser = argparse.ArgumentParser(description="ניהול הוצאות")
subparsers = parser.add_subparsers(dest="command")

add_parser = subparsers.add_parser("add")
add_parser.add_argument("amount", type=float)
add_parser.add_argument("category")

args = parser.parse_args()

עכשיו אפשר להריץ python expenses.py add 45.5 אוכל ישירות מהטרמינל, בדיוק כמו כלים אמיתיים שאתם מכירים כמו git או npm. זה נראה קטן אבל זו קפיצה גדולה בהבנה - אתם בונים כלי, לא סקריפט.

שלב רביעי - דוחות וסיכומים

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

totals = {}
for row in expenses:
    totals[row["category"]] = totals.get(row["category"], 0) + row["amount"]

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

מלכודות נפוצות

הטעות הכי שכיחה היא לשכוח שהערך שמגיע מהמשתמש הוא תמיד מחרוזת, גם אם זה נראה כמו מספר. אם לא תמירו אותו במפורש ל-float, תגלו שהחיבור של הוצאות פשוט מדביק מספרים אחד לשני במקום לחבר אותם. טעות נוספת היא לא לטפל בקובץ שלא קיים עדיין - בהרצה הראשונה אין קובץ expenses.csv, והתוכנית צריכה לדעת ליצור אותו במקום לקרוס.

מה מקבלים בסוף

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

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

הצטרפו לקהילה בדיסקורד