Python как сделать l oop, которое может быть «для» или «пока», в зависимости от того, присутствует ли верхний предел - PullRequest
0 голосов
/ 17 июня 2020

У меня есть случай, когда мне нужно повторить какой-то блок кода:

  • Иногда мне нужно повторить кодовый блок конечное число раз
  • Иногда мне нужно повторять блок кода бесконечно.

Мне интересно, есть ли какой-нибудь встроенный способ Python для:

  • Ограничений нет -> кодовый блок повторяется через что-то вроде while l oop
  • Предоставленный предел -> блок кода повторяется через что-то вроде for l oop

Примечание: я знаю Я могу использовать оператор if (в зависимости от наличия верхнего предела) и переключаться между for или while l oop. Я пытаюсь не повторять блок кода дважды или он разбивается на другую функцию.


Текущая реализация

Я написал ниже некорректно (см. ниже) for_while_hybrid.py с использованием Python 3.8.2.

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.

Ответы [ 2 ]

6 голосов
/ 17 июня 2020

Просто используйте count или range, в зависимости от верхней границы:

from itertools import count


def iter_for_while(bound=None):
    return count() if bound is None else range(bound)
1 голос
/ 17 июня 2020

используйте while l oop, но вы можете сказать, пока X

...