Остановка цикла генератора в секунду до последней итерации - PullRequest
1 голос
/ 07 ноября 2019

У меня есть генератор cut_slices и я использую for loop . Но мне нужно проделать определенную работу с первыми и последними выходными элементами вне цикла. С первым легко, просто используйте next() перед циклом. Но что с last ?


fu_a = self.cut_slices(unit, unit_size) #generator (simple for loop with some calculations and yield)

header = self.make_header(p=0, first_byte=unit[0], rtp_type=rtp_type, flag='s')
self.send_packet(header + next(fu_a))

for i in fu_a: #if there is an analogue of a[:-1] for generator object?
    header = self.make_header(p=0, first_byte=unit[0], rtp_type=rtp_type,
                              flag='m')
    self.send_packet(header + i)

header = self.make_header(p=0, first_byte=unit[0], rtp_type=rtp_type, flag='e')
self.send_packet(header + next(fu_a))

PS Я понимаю, что есть и другие способы достижения того же результата, просто хочу разобраться.

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

В приведенном ниже коде запустите нужную функцию для цикла aa в цикле for и не обращайте внимания на последний вызов функции. После окончания цикла у вас будет переменная aa

In [1]: a = (i for i in range(10))
In [2]: first = next(a)
In [3]: first
Out[3]: 0
In [4]: for aa in a:
   ...:     print(aa)
   ...:
1
2
3
4
5
6
7
8
9
In [5]: aa
Out[5]: 9

После прочтения средней статьи на похожую тему я нашел лучший способ получить последнее значение:

In [29]: def get_last_val(A):
    ...:     v = next(A)
    ...:     for a in A:
    ...:         yield False, v
    ...:         v = a
    ...:     yield True, v

In [30]: a = (i for i in range(10))

In [31]: a = get_last_val(a)

In [32]: for aa in a:
    ...:     print(aa)
    ...:
(False, 0)
(False, 1) 
(False, 2)
(False, 3)
(False, 4)
(False, 5)
(False, 6)
(False, 7)
(False, 8)
(True, 9)

Если первое возвращаемое значение равно True, это будет последнее значение в итерации.

0 голосов
/ 07 ноября 2019

Если это не вызывает проблем с памятью, просто составьте список всего, что возвращается генератором, и нарежьте его.

fu_a = self.cut_slices(unit, unit_size) #generator (simple for loop with some calculations and yield)

header = self.make_header(p=0, first_byte=unit[0], rtp_type=rtp_type, flag='s')
self.send_packet(header + next(fu_a))

*middle_fu, last_fu = list(fu_a)

for i in middle_fu:
    header = self.make_header(p=0, first_byte=unit[0], rtp_type=rtp_type,
                              flag='m')
    self.send_packet(header + i)

header = self.make_header(p=0, first_byte=unit[0], rtp_type=rtp_type, flag='e')
self.send_packet(header + last_fu)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...