Я работаю над задачей, которую получил от друга, в этой задаче мне нужно сгенерировать время в следующем формате: 00:00:00, 00:00:01, 00:00:02 и т.д... Но чтобы правильно следовать инструкциям этой задачи, мне нужно использовать функции генератора для достижения этого результата. Итак, прежде всего мне нужно создать три функции-генератора, которые генерируют числа от 0 до 59 для секунд и минут и от 0 до 23 для часов. так что я попытался это сделать, и я думаю, что я сделал все правильно, но я столкнулся с проблемой, скажем, что мы говорим о gen_func, который генерирует часы на данный момент (я буду называть его gen_hr), когда я пытаюсь использовать yield работает, но выводит на экран только число 0, которое должно быть только началом того, что я действительно хочу, я пытаюсь обновить локальную переменную (она локальна для функции генератора gen_hr), но она не обновляется , каждый раз, когда я пытаюсь напечатать следующее полученное значение, он печатает 0. ВОТ КОД:
def gen_hours():
hr = 0
while hr < 24:
if hr < 10:
yield f"0{hr}"
hr += 1
else:
yield hr
hr += 1
И ВОТ ВЫВОД:
for i in range(10):
print(next(gen_hours()))
>>> 00
>>> 00
>>> 00
>>> 00
>>> 00
>>> 00
>>> 00
>>> 00
>>> 00
>>> 00
ВОТ РЕЗУЛЬТАТ, КОТОРЫЙ Я ОЖИДАЛ:
>>> 01
>>> 02
>>> 03
>>> 04
>>> 05
>>> 06
>>> 07
>>> 08
>>> 09
>>> 10
Было бы замечательно, если бы вы помогли мне понять, что не так с моим кодом.
То, что вы, вероятно, имел в виду должны сделать, это просто for hour in gen_hours(): print(hour)
1) Почему вы ожидаете 01
, если вы сначала возвращаете ноль? 2) Вы знаете, что можете использовать {:02d}
для заполнения? 3) Почему бы не использовать strftime
?
@OneCricketeer Для «1» я все еще новичок в генераторах, поэтому я разместил вопрос ... «2»: я не хотел использовать форматирование str «3»: проблема, которую я делаю, требует от меня сделай это сам, используя функции генератора и выражения... Спасибо за комментарий!
Хороший вопрос, вы бы получили 01
только десять раз, если бы сначала увеличили. Вы по-прежнему можете использовать генератор случайных целых чисел с объектами time/timedelta.
вы должны сначала создать генератор, а затем вызвать на нем next
:
gen = gen_hours()
for i in range(10):
print(next(gen))
другой способ добиться этого с помощью islice
:
from itertools import islice
for h in islice(gen_hours(), 10):
print(h)
ваш код создает новый генератор на каждой итерации цикла и вызывает next
, чтобы всегда получать первый элемент.
Вы зацикливаетесь на объекте
range
. Внутри тела этого цикла вы делаетеprint(next(gen_hours()))
который создает новый объект генератора и вызываетеnext
на нем. Первым элементом в генераторе всегда является"00"
, поэтому вы получаете"00"
10 раз. Генератор, который вы создаете, сбрасывается после возвращенияnext
.