生成器工厂函数循环终止问题

本人最近在学习生成器,遇到一段利用itertools.takewhile构造等差数列生成器工厂函数的代码实例,代码如下:

import itertools
def aritprog_gen(begin, step, end=None):
    first = type(begin + step)(begin)
    ap_gen = itertools.count(first, step)
    if end is not None:
        ap_gen = itertools.takewhile(lambda n: n < end, ap_gen)
    return ap_gen

问题:这个生成器工厂函数在end非空时如何停止产值?

详细描述:请问当end是非空数值时,若程序运行到即将生成次序不小于end+1的临界点,此时if语句上面的ap_gen正常产值。而继续运行到下面,takewhile因为不满足lambda n: n < end停止产值,那停止产值是一个takewhile对象,赋值给ap_gen就可以停止迭代产值了?

请明白的前辈帮忙指点一下迷津,感激不尽!!!

阅读 2k
1 个回答
a = aritprog_gen(1, 2, 4)
>>> next(a)
1
>>> next(a)
3
>>> next(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> a
<itertools.takewhile object at 0x0000022195ADB9C8>

https://docs.python.org/3/lib...
官网解释takewhile 就是返回一个迭代器,所以跟普通迭代器一样没值就抛StopIteration异常啦,下面是普通迭代器

>>> a = iter(range(1,4,2))
>>> next(a)
1
>>> next(a)
3
>>> next(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> next(a, False)
False
>>> a
<range_iterator object at 0x000001D22C9B4F90>

不是一直个ap_gen赋值,把函数aritprog_gen改了,a还是itertools.takewhile的对象

>>> import itertools
>>> def aritprog_gen(begin, step, end=None):
...     first = type(begin + step)(begin)
...     ap_gen = itertools.count(first, step)
...     if end is not None:
...         ap_gen = itertools.takewhile(lambda n: n < end, ap_gen)
...     return ap_gen
...
>>> a = aritprog_gen(1, 2, 4)
>>> def aritprog_gen(begin, step, end=None):
...  return None
...
>>> next(a)
1
>>> a.__next__()
3
>>> a.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> next(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题