Нужна помощь с итераторами

Всем привет! Появилась необходимость включить итератор в свой код, вот только столкнулся с проблемой. Для начала покажу код, потом постараюсь описать что я от него хочу

#Здесь я делаю итератор из файлов в директории
exel_file = []
for name in glob.glob('converted_dir/*.xlsx'):
    wb = load_workbook(name)
    list = wb['TDSheet']
    exel_file.append(list)
iter_exel_file = iter(exel_file)


#Функция, которая должна получать поочередно значения из файлов, как раз таки это я и хочу реализовать с помощью итератора
def model_name_fun():
    result = []
    for sheet in iter_exel_file:
        for i in range(19, 70):
            model_name = sheet.cell(row=i, column=2).value
            if model_name is not None:
                result.append(model_name)
    return result


#Запрос по Google API, который в моем понимании должен передавать значение так же поочередно, а именно: получил значения из первого файла - передал, получил и так далее
values = service.spreadsheets().values().batchUpdate(
    spreadsheetId=spreadsheet_id,
    body={
        "valueInputOption": "USER_ENTERED",
        "data": [{
            "range": (name_position), 
            "majorDimension": "COLUMNS", 
            "values": [model_name_fun()]
        },]
    }).execute()

Я понимаю что при итерации необходимо использовать next, но не могу понять где. Прошу вас помочь советом.

P.S. Вероятнее всего, model_name_fun() и запрос values должны быть заключены в одну функцию, а для них уже подставлять значения из итератора, но я так же не могу понять как это сделать(


Ответы (1 шт):

Автор решения: vadim vaduxa

Примерно так, yield создает итератор

def get_sheets():
    for name in glob.glob('converted_dir/*.xlsx'):
        wb = load_workbook(name)
        yield wb['TDSheet']

def model_name_fun():
    for sheet in get_sheets():
        for i in range(19, 70):
            model_name = sheet.cell(row=i, column=2).value
            if model_name is not None:
                yield model_name


for model_name in model_name_fun():
    values = service.spreadsheets().values().batchUpdate(
        spreadsheetId=spreadsheet_id,
        body={
            "valueInputOption": "USER_ENTERED",
            "data": [{
                "range": (name_position),
                "majorDimension": "COLUMNS",
                "values": [model_name]
            },]
        }).execute()
→ Ссылка