有这么一个问题,如何优雅的实现一个函数,当参数 limit 为 0 的时候,使用无限迭代,当 limit 大于 0的时候,有限迭代:

直接揭秘结果:

from loguru import logger
from itertools import count


def func(limit: int = 0):
    for i in limit and range(limit) or count():
        yield i


for i in func():
    logger.debug(i)

如果你对这个 limit and range(limit) or count() 语法不理解,可以先看看官方文档:布尔运算 --- and, or, not

图片.png

我们来一点点解析这个语法:

当 limit 为 0 的时候,我们来看看是个什么情况吧:

In [8]: limit=0

In [9]: limit and range(limit)
Out[9]: 0

可以看到,当 limit 不成立的时候,limit and range(limit) 的结果就是 limit

In [12]: from itertools import count

In [13]: 0 or count()
Out[13]: count(0)

当 limit 成立的时候,limit and range(limit) 就是后者

In [14]: limit=10

In [15]: limit and range(limit)
Out[15]: range(0, 10)
In [16]: range(0, 10) or count()
Out[16]: range(0, 10)

universe_king
3.4k 声望680 粉丝