מספרים פראיים - מחברת 3

היי (:
תקועה על התרגיל הזה כבר יותר מדי זמן…
אסתיר כדי למנוע ספויילרים ממי שלא פתר:

תקציר

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

אפשר להשתמש גם בפונקציות רגילות :slight_smile:

יישששש איזה הקלה :blush: :blush:

2 לייקים

תופס פה טרמפ על השאלה - פתרתי באותו אופן - פונקציה משנית שמוצאת מחלקים, ופונקציה ראשית שמוסיפה אותם לרשימה עד שיש את כולם. הבעיה היא שהשתמשתי רק בפונקציות רגילות. כשניסיתי לבקש מהפוקנציה המשנית לעבוד עם yield במקום return, קיבלתי הודעת שגיאה TypeError: unsupported operand type(s) for /: ‘int’ and ‘generator’
ואני ממש לא מבין למה זה קורה, במיוחד כי היא נראית דומה מאוד לדוגמאות במחברת, שמשתמשות באינטג’רים. ניסיתי לקרוא במחברת כדי להבין אם אני מפספס משהו שקשור למיוטביליטי, אבל אני לא מצליח למצוא משהו כזה.

מה השגיאה שהדבקת פה אומרת, במילים פשוטות?

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

image

מה זה “פעולות כאלו”? ולא כתוב רק integer :slight_smile:
נסה לתרגם את השגיאה במלואה

הפעולה שהשתמשתי בה היא מודולו (כדי למצוא מחלקים ללא שארית). אולי מדובר בפעולה שג’נרייטור לא תומך בה מאיזו סיבה. גיגול של הודעת השגיאה הביא אותי בעיקר לתשובות בסטאק אוברפלואו שהן מתקדמות מדי יחסית לידע שלי כרגע. בתיעוד של מודולו כתוב שלפעמים היא לא מתמודדת כל כך טוב עם מספרים מורכבים (לא שנראה לי שאלו אמורים להיות מספרים מורכבים) אז אפשר לנסות להמיר אותם לערך מוחלט עם ()abs, אז ניסיתי וגם זה לא עבד. ניסיתי לקרוא את התיעוד של yield, אבל לא הצלחתי להבין מה גורם לה לזרוק TypeError. חשבתי שאולי זה “:/” זה איזו פעולה שלא למדנו או סוג מיוחד של floor division, אבל נראה שזה לא המצב. אני לא יודע מה עוד ניתן לחפש.

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

לייק 1

אוקיי. אז הודעת השגיאה היא TypeError: unsupported operand type(s) for /: ‘int’ and ‘generator’
בעיית טיפוס: פעולה שאינה נתמכת לאינטג’ר וג’נרייטור. (זה התרגום הכי טוב שעלה לי בראש).

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

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

אנחנו מדברים על פעולת החילוק?

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

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

בטוח שאתה לא משתמש בשום מקום בחילוק? איפה הוא מציג את השגיאה?

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

אבל הבעיה היא בשורה הזו, זה מה שפייתון אומר וזו כנראה האמת :slight_smile:
עכשיו אתה צריך להבין שבתוך number יש לך int, ובתוך new_number יש לך generator.
נסה לעקוב אחרי התוכנה ולהבין איך זה קרה

לייק 1

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

2 לייקים