Python 在最后一次迭代的第二秒内停止发电机的循环
我让生成器Python 在最后一次迭代的第二秒内停止发电机的循环,python,loops,generator,Python,Loops,Generator,我让生成器切割切片并使用进行循环。但是我需要对第一个和最后一个在循环之外产生元素做一些具体的工作。使用first很简单,只需在循环之前使用next()。但是最后一个怎么办 另外,我知道还有其他方法可以达到同样的效果,我只是想弄清楚。如果它不会导致内存问题,只需列出生成器返回的所有内容,并对其进行切片即可 fu_a = self.cut_slices(unit, unit_size) #generator (simple for loop with some calculations and y
切割切片
并使用进行循环。但是我需要对第一个和最后一个在循环之外产生元素做一些具体的工作。使用first很简单,只需在循环之前使用next()
。但是最后一个怎么办
另外,我知道还有其他方法可以达到同样的效果,我只是想弄清楚。如果它不会导致内存问题,只需列出生成器返回的所有内容,并对其进行切片即可
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)
在下面的代码中,在for循环中的aa上运行您想要的函数,并忽略最后的函数调用。循环结束后,变量将变为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
在阅读了一篇关于类似主题的媒体文章后,我找到了一个更好的方法来获取最后的val:
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,则该值将是迭代中的最后一个值。如果将每个元素放入一个变量中,使该变量始终只生成最后一个元素,则循环结束后,…您可以跟踪每次迭代的最后一项,以便在下一次迭代之前,用当前项更新最后一项。检查从Python迭代器获取最后一项的最干净方法
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)