שלום אורח התחבר

הבלוג של ינון פרק

טיפים קצרים וחדשות למתכנתים

הזינו את כתובת המייל וקבלו את הפוסט היומי בכל בוקר אליכם לתיבה:

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

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

נתחיל עם any. בפייתון אתם יכולים לרוץ על סידרה עם לולאת for כדי לחפש אלמנטים שמתאימים למבנה מסוים, למשל הקוד הבא בודק האם במילון מסוים יש מפתח שהערך שלו הוא 2:

c = { 'one': 1, 'two': 2, 'three': 3, 'four': 4 }

found = False
for k, v in c.items():
    if v == 2:
        found = True
        break

if found:
    print("Found a 2 in the dictionary")

אבל הרבה יותר מדויק לכתוב את אותו הקוד עם הפונקציה any. פונקציה זו מקבלת סידרה ובודקת אם אחד האלמנטים הוא True. באמצעות Generator Comprehension נוכל להפוך כל מילון לסידרה של בוליאנים וכך לקבל את הגירסא הקריאה יותר:

c = { 'one': 1, 'two': 2, 'three': 3, 'four': 4 }

if any(v == 2 for k, v in c.items()):
    print("Found a 2 in the dictionary")

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

c = { 'one': 1, 'two': 2, 'three': 3, 'four': 4 }
d = { 'two': 2, 'four': 4 }

if all(v % 2 == 0 for k, v in c.items()):
    print("All values in c are even numbers")

if all(v % 2 == 0 for k, v in d.items()):
    print("All values in d are even numbers")

שימו לב לשימוש ב Generator Comprehension ולא ב List Comprehension, כלומר סוגריים עגולים ולא מרובעים. הבחירה ב Generator Comprehension היא שגורמת לקוד להתנהג כמו לולאת for, כלומר שהערכים ייבדקו אחד-אחד ולא ייטענו כולם לזיכרון. זה חסכוני יותר בזיכרון ובמקרה של any גם ירוץ מהר יותר אם התשובה היא True.

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

המשך קריאה...

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

בואו נראה מתי זה טוב ואיך בונים את זה בפייתון.

המשך קריאה...

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

המשך קריאה...

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

תשע שנים אחרי ועדיין לא עבר לו, וגם אני כבר מזמן מכור.

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

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

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

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

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

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

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

https://www.tocode.co.il/bundles/git

נתראה שם, ינון

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

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

המשך קריאה...

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

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

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

import unittest

class MyTestCase(unittest.TestCase):
    def test_something(self):
        self.assertEqual(True, True)


if __name__ == '__main__':
    unittest.main()

הרצה של הקובץ מציגה את הפלט:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

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

import unittest

class MyTestCase(unittest.TestCase):
    def test_something(self):
        self.assertEqual(True, False)


if __name__ == '__main__':
    unittest.main()

שימו לב ששיניתי את המילה True ל False בשורת ה assertEqual וכעת הפלט נראה כך:

F
======================================================================
FAIL: test_something (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "simpletest.py", line 5, in test_something
    self.assertEqual(True, False)
AssertionError: True != False

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (failures=1)

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

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

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

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://www.tocode.co.il/blog')
print(driver.title)

driver.close()

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

import unittest
from selenium import webdriver

class MyTestCase(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()

    def tearDown(self):
        self.driver.close()

    def test_something(self):
        self.driver.get('https://www.tocode.co.il/')
        course_links = self.driver.find_elements_by_css_selector('.nm-block a[href^="/bundles/"]')

        self.assertEqual(4, len(course_links))


if __name__ == '__main__':
    unittest.main()

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

https://zoom.us/meeting/register/3abdb0d0b6f403b7c5b9141539e44ee6

פלאסק היא סביבה לפיתוח Web בשפת Python. זוהי Micro Framework המבוססת על פלאגינים ולכן ליבת הספריה מאוד רזה, מה שאומר שקל מאוד ללמוד איך להתחיל להשתמש בה. באותה נשימה אגיד גם שקל לעשות טעויות. החברה הגדולה ביותר שמצאתי שמשתמשת בפלאסק היא Pinterest שם פלאסק היא הבסיס לשרת ה API של החברה, שרת המטפל במיליארדי בקשות ביום.

בפוסט זה אתאר בקצרה את פלאסק דרך כתיבת מספר תוכניות ונראה מה צריך כדי לבנות Backend API איתו.

המשך קריאה...

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

ופייתון היא שפה שמאוד קל להתחיל לכתוב בה (אחרי שמתגברים על השטות עם הרווחים כמובן). היא לקחה השראה מכל כך הרבה שפות שלא משנה מאיפה אתם מגיעים בפייתון תרגישו בבית.

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

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

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

סילבוס מלא, פרטים נוספים וכפתור הצטרפות נמצאים כולם בקישור:

https://www.tocode.co.il/bundles/advanced-python3

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