סריקת קבצים בתיקייה

אני מבין ש scandir זה איטרטור שניתן לרוץ בעזרתו על קבצים באותה תיקייה.
רק לא הבנתי איך הגנרטור מופעל יותר מפעם אחת (ללא לולאת for או next) ונוצר set .
אשמח להסבר

import os


def get_filenames(path):
    for file in os.scandir(path):
        yield file.name


def common_filenames(path1, path2):
    path1_files = set(get_filenames(path1))
    path2_files = set(get_filenames(path2))
    return path1_files & path2_files


common_filenames('images', 'resources/week5_images')
לייק 1

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

לייק 1

set עושה פעולה של איטרציה על הערכים שנכנסים אליה, כלומר היא מבצעת עליהם לולאה שעוברת על כל האיברים של המשתנה שנכנס (למשל for).

במקרה הזה מזומן לתוכה generator הוא iterable (מחברת על גנרייטורים), כלומר set תעבור על “כל ערך בו” וזה אומר שהיא תרוץ עליו עד סופו כי זה בעצם מייצג את “כל איבריו”

לייק 1

נשמע הגיוני, תוכלו להפנות אותי לדוקומנטציה?
חיפשתי הסבר לתופעה ש set מפעיל את הגנרטור ולא מצאתי…

אין התייחסות של לset על גנרייטור אבל גנרייטור הוא iter זה כמו שתעבור על רשימה תסתכל על זה בצורה כזו.

אם אתה זוכר אפשר להשים גנרייטור גם למשתנה
G = generator()

ידוע שגנרטור זה איטרטור, כמו open file.
אבל כדי להריץ גנרטור השתמשנו בלולאת for או בnext.
זה לא הכי ברור השימוש של set ביחס לגנרטור.

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

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

לייק 1

הבנתי… תודה רבה!
2020

לייק 1