python - Python如何制作可以是“for”或“while”的循环,具体取决于是否存在上限
问题描述
我有一个用例,我需要重复一些代码块:
- 有时我需要重复代码块有限的次数
- 有时我需要无限期地重复代码块。
我想知道,是否有一些 Python 内置方法:
- 没有提供限制——>代码块通过类似
while
循环的方式重复 - 提供的限制 --> 代码块通过类似
for
循环的方式重复
注意:我知道我可以使用一个if
语句(取决于是否存在上限),并在一个for
或while
循环之间切换。我试图不让代码块重复两次,或者它分解成另一个函数。
当前实施
我使用 Python 3.8.2编写了以下有缺陷的(见下文) 。for_while_hybrid.py
from typing import Iterator
def iter_for_while(num_yield: int = None) -> Iterator[int]:
"""Generate an incrementing counter.
This enables one to make a for loop or a while loop, depending on args.
Args:
num_yield: Number of times to yield.
If left as None, the generator makes a while loop
If an integer, the generator makes a for loop
"""
counter = 0
condition = True if num_yield is None else counter < num_yield
while condition:
yield counter
counter += 1
if num_yield is not None:
condition = counter < num_yield
upper_limit = 5
for _ in iter_for_while(upper_limit):
print("Some code block") # Run 5 times
for _ in iter_for_while():
print("Some code block") # Run infinitely
此实现有效。
缺点是,如果运行很长时间,我担心counter
会占用大量内存,或者最终会耗尽。我的电脑是 64 位的,所以sys.maxsize = 2 ** 63 - 1 = 9,223,372,036,854,775,807
.
解决方案
只需使用count
or range
,取决于上限:
from itertools import count
def iter_for_while(bound=None):
return count() if bound is None else range(bound)
推荐阅读
- powerbi - Power BI - 不同类别的 rankx
- javascript - Vue Js 中的 V-loop 传递数据
- javascript - 前缀符号的简化
- raku - 开始块中的 Raku shell 功能不会结束
- reactjs - 如何重构这个 SVG 动画以在 React 中工作?
- python - Django:查询父级时在 HTML 模板中显示子级计数
- javascript - 如何以正确的方式对 MatDialog(Angular Material)进行单元测试?
- web - 通过机器学习算法对网站中的文本和照片进行分类的最简单方法是什么?
- python - 与 CesiumJS 的实时交互
- r - 在一个函数中改变多个具有不同名称的变量...?