Подскажите, куда лучше впихнуть одноразовую функцию?

Рейтинг: 0Ответов: 2Опубликовано: 21.02.2023
with open('logfile.txt', 'r', encoding='utf-8') as logfile, open('output.txt', 'w', encoding='utf-8') as output_file:
    users = map(lambda x: x.split(', '), logfile.read().split('\n'))

    def minutes(user, time_in, time_out):
        hours, mins = time_in.split(':')
        time_in = int(hours) * 60 + int(mins)

        hours, mins = time_out.split(':')
        time_out = int(hours) * 60 + int(mins)

        return time_out - time_in >= 60

    for user in filter(lambda x: minutes(*x), users):
        print(user[0], file=output_file)

Задание заключается в том, чтобы записать в файл все имена пользователей, время нахождения за компьютером которых было не менее 60 минут. Функция работает всего один раз, потому вопрос - есть ли смысл выносить ее в "глобальный код"? или, быть может возможно обойтись и вовсе без функции?

Сам файл для чтения содержит:

Тимур Гуев, 14:10, 15:50
Джагмаидзе Ирбек, 00:00, 00:59
Руслан Гриценко, 12:00, 12:59
Роман Гацалов, 09:10, 17:45
Габолаев Георгий, 11:10, 12:10
Гергиева Светлана, 09:10, 21:45
Гуева Лариса, 07:05, 08:05
Засеев Ирбек, 00:00, 01:00
Гуева Лиза, 09:05, 10:05
Харисов Артур, 19:07, 20:07
Джабиев Алан, 17:56, 18:55
Янченко Роман, 00:00, 01:01

Ответы

▲ 2
with open('logfile.txt', 'r', encoding='utf-8') as f_in, open('output.txt', 'w', encoding='utf-8') as f_out:

for line in f_in:
    name, time_in, time_out = line.split(',')
    hours_in, minutes_in = time_in.split(':')
    hours_out, minutes_out = time_out.split(':')
    if (int(hours_out) * 60 + int(minutes_out)) - (int(hours_in) * 60 + int(minutes_in)) >= 60:
        f_out.write(name + '\n')

Вот вам решение без функции. Использование функций - хорошая вещь, но в данном случае если бы вы оформили всю задачу как функцию, чтобы она была применима где-то еще. Например на вход подается файл, в котором будут указаны другие данные.

▲ 0

Фантазия на тему

from datetime import datetime, timedelta
import csv


def deep_strip(obj):
    if isinstance(obj, dict):
        for k, v in obj.items():
            obj[k] = deep_strip(v)
    elif isinstance(obj, list):
        return list(map(deep_strip, obj))
    elif isinstance(obj, str):
        obj = obj.strip()
        try:
            return datetime.strptime(obj, '%H:%M')
        except (ValueError, TypeError):
            return obj
    return obj


with open('../input.txt', 'r', encoding='utf-8') as inp:
    data = list(map(deep_strip, csv.DictReader(inp, fieldnames=['name', 'start', 'end'])))

for item in data:
    duration = item['end'] - item['start']
    print(
        item['name'],
        duration,
        duration > timedelta(minutes=60)
    )

Тимур Гуев 1:40:00 True
Джагмаидзе Ирбек 0:59:00 False
Руслан Гриценко 0:59:00 False
Роман Гацалов 8:35:00 True
Габолаев Георгий 1:00:00 False
Гергиева Светлана 12:35:00 True
Гуева Лариса 1:00:00 False
Засеев Ирбек 1:00:00 False
Гуева Лиза 1:00:00 False
Харисов Артур 1:00:00 False
Джабиев Алан 0:59:00 False
Янченко Роман 1:01:00 True