הערת הבודק האוטומטי - list() / list comprehension

אני קצת משתגעת פה ואשמח לגאולה.
בתרגיל ימצי קיבלתי הערות על 2-3 list comprehension שעשיתי - התבקשתי לשנות אותן ל-list().
בתור הבחורה הצייתנית שאני, זה בדיוק מה שעשיתי, ולאחר שהעלתי את התרגיל מחדש קורנת מאושר, חשכו עיניי - התבקשתי לעשות את הדבר ההפוך - להפוך את הרשימות שהמרתי כל כך יפה בחזרה ל-list comprehension. אני מרגישה תקועה בלולאה אינסופית!
אני אובדת עצות בשלב הזה, ואודה לעזרה לפני שהבודק ואני נפתח בקרב אורטל קומבט שככל הנראה יגמר ברע. :slight_smile:

תודה מראש!

קישור? :slight_smile:

סליחה על הבורות, אבל מה הכוונה? :monkey_face:

קישור לתרגיל שהגשת במערכת התרגילים, כדי שאוכל לראות מה הבודק אומר :slight_smile:

הו, לא ידעתי שאפשרי! מקווה שהבנתי, אם לא סלח לי על הפדיחה:
https://solve.pythonic.guru/view/109894

לייק 1

כתבת:
[x for x in iterable]

ואז שינית ל:
list([x for x in iterable])

הבודק התכוון ל:
list(iterable)

כך שיניתי את הרשימות בניסוח כללי:

b = list(number for number in range(1, 10))

זה לא תקני? הרי זה לא list([]), אלא list()?

כלומר, לצורך העניין אם הייתי רוצה ליצור רשימה של 1-10, לא סביר להשתמש ב-list comprehension?

ותודה כמובן על המענה!

תקין, בהחלט, פשוט מעט עבודה מיותרת.
את הופכת את range ל־generator בעזרת generator expression ואז את ממירה אותו לרשימה.
עדיף פשוט מלכתחילה להמיר לרשימה :slight_smile:

אפשר המחשה בבקשה למען הראש המסוחרר שלי? :smiling_face_with_three_hearts:

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

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

b = list(number for number in range(1, 10))
b = [number for number in range(1, 10)]

חיפוש בגוגל מביא אותי לכתיבה השנייה לצורך העניין :slight_smile:

עריכה:
העמקה נוספת בגוגל הביאה אותי ל-list(range(1, 10)! אוקיי! אך מה לגבי השאר?

ברור, בואי נגיע לזה יחד.

הפונקציה range מחזירה לנו iterator שבו יש הרבה ערכים.
יכולה לממש עבורי generator שמקבל start ו־end ומחזיר כל פעם איבר אחד? (כמו range)

הבנתי! ממש תודה על הסבלנות. ילדה צייתנית אך עובדת שעות נוספות כשאין צורך. :slight_smile:
ההערות היחידות שנשארו לי בתרגיל הן של ה-request, הבנתי שמהן ניתן להתעלם?
(קיים תנאי שבודק אם הכתובת מתחילה ב-http)

ניסית דרכים אחרות לפתור את ההערה? :slight_smile:

אני יכולה להשתמש באותה הדרך שבחרתי להוציא את המידע מהדף בויקיפדיה, פשוט בחרתי בדרך של להוריד את הקובץ למחשב מטעמי נוחות. האם זו הכוונה? :relaxed:

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

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

import urllib.request

req = urllib.request.Request('http://www.example.com')
with urllib.request.urlopen(req) as response:
    the_page = response.read()

זה כמובן לא עבד לי, כמו גם לבדוק אם ה-url מתחיל ב-http ולהעלות שגיאה אם לא:

    if url.lower().startswith('http'):
        req = urllib.request.Request(url)
    else:
        raise ValueError("Invalid URL")
    
    with urllib.request.urlopen(req) as response:
            the_page = response.read()

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

עדכון:
פתרתי את הבעיה באמצעות החלפה למודול אחר,
אבל עדיין תוהה אם אפשר לפתור את זה עם urlib.request :pray: :blush:

לייק 1

מעניין, אבל אני רואה שבמערכת זה באמת ממשיך לתת את השגיאה למרות שווידאת קלט.
הוא באמת קצת מעצבן, אעיף את השגיאה הזו מהמערכת.
בכ"מ טוב שלמדת להשתמש ב־requests, הוא מודול מוצלח יותר למטרות האלו :slight_smile:

2 לייקים

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

לייק 1

בגלל סיבות קצת מוזרות. הבעיה שהוצגה לך אומרת שמישהו בטעות יכול להכניס file:// בתחילת הקישור, ו־urlopen יפתח את זה.
זה אומר שמשתמש עלול להיות מסוגל לקרוא דברים ממערכת הקבצים המקומית שממנה מופעל הסקריפט, אז אם מדובר בשרת שרץ מרחוק משתמש (אולי) יוכל לקרוא/לכתוב לקבצים בשרת, וזה מסוכן מאוד.
ל־requests אין את הפיצ’ר הזה – היא קוראת רק מ־http/https וככה יוצא שהיא בטוחה יותר

5 לייקים