אני מבין ש 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
aviadamar
set עושה פעולה של איטרציה על הערכים שנכנסים אליה, כלומר היא מבצעת עליהם לולאה שעוברת על כל האיברים של המשתנה שנכנס (למשל for).
במקרה הזה מזומן לתוכה generator הוא iterable (מחברת על גנרייטורים), כלומר set תעבור על “כל ערך בו” וזה אומר שהיא תרוץ עליו עד סופו כי זה בעצם מייצג את “כל איבריו”
לייק 1
adiel1988
נשמע הגיוני, תוכלו להפנות אותי לדוקומנטציה?
חיפשתי הסבר לתופעה ש set מפעיל את הגנרטור ולא מצאתי…
aviadamar
אין התייחסות של לset על גנרייטור אבל גנרייטור הוא iter זה כמו שתעבור על רשימה תסתכל על זה בצורה כזו.
אם אתה זוכר אפשר להשים גנרייטור גם למשתנה
G = generator()
adiel1988
ידוע שגנרטור זה איטרטור, כמו open file.
אבל כדי להריץ גנרטור השתמשנו בלולאת for או בnext.
זה לא הכי ברור השימוש של set ביחס לגנרטור.
aviadamar
אבל זה בדיוק מה רשמתי, פונקציה שמקבלת איטרייטור, יש בה לולאה שרצה על מה שנכנס אליה
במקרה הזה זה הגנרייטור.
מציע לההתסכל על פונקציה פשוטה שנקראת all ויש את היישום שלה בדוקומנטציה. תראה את המבנה ותבין בהמדך לזה מה קורה שנכנס גנרייטור למשל