top of page

רעננו את הדף והקליקו למעבר לנושא הבא:

מודולים – ספריות תוכניות מדף מן המוכן

מודולים – ספריות תוכניות מדף מן המוכן

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

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

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

import math def circleArea(r): """ takes a radios and returns the area of a circle """ return (r**2)*math.pi

print(circleArea(10))

>>>

314.1592653589793

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

המילה המשמשת ליבוא מודולים היא import ואחריה רושמים את שם המודול, במקרה שלנו math, וזהו, כעת כל מה שצריך לעשות כדי להשתמש במתודות שיש במודול הוא לדעת על קיומן, לרשום את המילה math, אחריה נקודה, ואחריה שם המתודה, במקרה שלנו pi ויש לנו את זה. אפשר להשתמש ב pi עם רמת דיוק של שלוש עשרה ספרות אחרי הנקודה. כך גם לגבי הקבוע המתמטי e (שערכו בערך 2.71828). פעולת השורש (math.sqrt(x תחזיר את השורש של x שיוזן לתוך הפונקציה. ויש שם המון, cos, sin, log (באיזה בסיס שאנחנו חולמים), לעגל מספרים, להפוך רדיאנים למעלות (טריגו זוכרים?) ולהיפך ועוד. כיף גדול.

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


from math import pi def circleArea(r): """ takes a radios and returns the area of a circle """ return (r**2)*pi

print(circleArea(10))

>>>

314.1592653589793

אנו רואים תחביר (syntax) מעט אחר שמתחיל במילה from ולאחר מכן שם הספריה ולאחר מכן import ולאחר מכן שם המתודה הספציפית שאנו רוצים לייבא. במקרה שלנו רק pi. אבל צריך לשים לב שבמקרה כזה, כאשר אנו רוצים להשתמש באותה מתודה, אנו לא צריכים את שם הספריה והנקודה לפני (גם אי אפשר), מספיק שרושמים pi וכשנכפול אותו בריבוע הרדיוס נקבל את שטח המעגל המשוייך לאותו רדיוס r שמופיע בפונקציה. לעיתים נחמד למתכנתים להשתמש בכתיב המקוצר שבספריה בלי שם הספריה, והם מוכנים בשל כך לייבא את כל המתודות שבספריה, באמצעות הביטוי *from math import למשל עבור המודול math (הכוכבית * זה כל המתודות כולן), ברם, זה דבר איום ונורא ומכביד על הקוד ועושה בהמשך עוד דברים רעים, מתודות שיכולות להתערבב כאשר יש הרבה מודולים וחלקם עם מתודות בעלות אותו שם, בשלבים מתקדמים, לא כדאי. ספריה נוספת בתחום המתמטיקה והסטטיסטיקה שאי אפשר לשרוד בלעדיה היא numPy חביבת הסטודנטים בתחום של data science. אם נצטרך בהמשך אספר אודותיה.

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


ספריית collections

המודול/ספריה collections משך את תשומת ליבי בשל המגניבות (והשימושיות) של חלק מהמתודות שהוא כולל. אחד מהם, מאפשר לקבל מעין tuple (מעין מחלקה מהירה וקלה) יותר מגניב ויותר קריא, כאשר כל אחד מהפריטים ב- tuple מקבל שם המתאר אותו, וניתן לגשת אליו לא רק באמצעות אינדקס מספרי אלא באמצעות השם המתאר אותו. כמו כן ניתן לשכפל את הייצור בדומה למה שניתן לעשות עם class (זה למעשה מחלקה שמתנהגת כמו tuple delux) רק פשוט יותר ובלי הרבה קוד. למתודה קוראים ()namedtuple ונדגים את דרך פעולתה לפני שנמשיך להסביר -


import collections Person = collections.namedtuple('Person','name age gender height') dan=Person("Dan",25,"male",182) batia=Person("Batia",45,"female",176)

print(batia)

יצרנו מעין מחלקה הקרויה Person זה יהיה מפעל ה- tuple היוקרתי שלנו, לאחר שאנו כותבים את הפקודה collections.namedtuple אנו מתחילים לתת שמות לנתונים שנזין בעתיד, לפני כן, אנו נותנים שם ל"מחלקה" שלנו ואת זאת עושים בתוך מחרוזת 'Person' מוסיפים פסיק (,) ולאחר מכן מחרוזת אחת הכוללת את שמות כל הפרמטרים שנרצה להזין, בסדר שאנו רוצים אותם, כשהם מופרדים ברווח בלבד !

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

כאשר נבקש להדפיס את batia, נקבל ייצוג מאוד יפה, קריא ומסודר:


התוצאה

Person(name='Batia', age=45, gender='female', height=176)

אנו מיד יודעים שהיא Person ולא למשל חתול, וש- 176 מתייחס לגובה ולא למשקל, ו- 45 מתייחס לגיל. אבל זה לא הכל –

זה גם מתנהג כמו tuple רגיל ואפשר לבקש להדפיס את [dan[3 ולקבל 182, ואפשר להדפיס רק את batia.gender (כמו מתודה במחלקה) ונקבל למי שהיה לו ספק: female.

אני לא יכול להתאפק – רק עוד מתודה אחת ב- collections המתודה deque שמאפשרת לנו במקום להסתפק ברשימה (list) רגילה, ברשימה משודרגת, שאפשר להוסיף בקלות איברים משני צדדיה (נזכיר ש- append מוסיף לנו ברשימה איבר בצד ימין בלבד וזה מעצבן), נראה איך זה עובד –


import collections deq = collections.deque(["b","c","d"]) deq.appendleft("a") print(deq) >>> deque(['a', 'b', 'c', 'd']) print(list(deq)) >>> ['a', 'b', 'c', 'd']

יצרנו מעין רשימה של האותיות "b","c","d" , התחביר הוא שה- deque שיצרנו נמצא בתוך סוגריים מרובעים שבתוך סוגריים עגולים. כעת נוסיף לצד השמאלי של הרשימה את האות "a" באמצעות המתודה appendleft וזה עובד קיבלנו את האות "a" בצד שמאל, אנו גם יכולים לבקש לראות את זה כרשימה רגילה, באמצעות הפקודה ()list. באותו אופן ניתן להוציא החוצה באמצעות הפקודה ()popleft איברים מהצד השמאלי של הרשימה. נזכור שהפקודה pop (גם ברשימות) עושה שתי פעולות במחיר שורת קוד אחת – היא מחלצת איבר ושומרת אותו עבורנו, אם נרצה, בתוך משתנה לבחירתנו. וזה לא הכל, ניתן לייצר deque מסתם מחרוזת באופן מהיר (בדוגמא הבא המחרוזת "bcde" הופכת לרשימה של מחרוזות שכל אחת מהן היא אות אחת, נדגים את שני הנושאים יחד –


import collections deq = collections.deque("bcde") print(deq) >>> deque(['b', 'c', 'd', 'e']) f=deq.popleft() print(f) >>> b print(deq) >>> deque(['c', 'd', 'e'])

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

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

Related Posts

See All

איטראטור - iterator

איטראטור - iterator כדי להבין מהו איטרטור אנו צריכים להבין איזה מין אובייקט הוא iterable – טוב בפייתון יש הרבה אובייקטים המוגדרים...

Single Post: Blog_Single_Post_Widget
bottom of page