🐙

[Python] 回数制限かつ条件付きループあれこれ

2022/05/16に公開

はじめに

Pythonで条件を満たすまでループさせるのだけど回数制限も必要なループを書く場合のアイディア。
簡単にかけるのだけど、もっと良いものがないかと結構モヤモヤするので、整理のためにちょっとまとめてみる。

コード

回数制限かつ条件付きループ

f1の方は、すっきりと書けるけど、ループの条件にconditionがかかわっているのが分かりづらいかも。

python
import random
import itertools
import functools

def getCondition():
  return True if random.random() > 0.5 else False

def f1(times):
  for i in range(times):
    condition = getCondition()
    if condition:
      break
  print(i, condition)
  
f1(10)

f2の方は、ループの条件が分かりやすいが、変数の初期化とインクリメントが必要。

def f2(times):
  i = 0
  condition = getCondition()
  while not condition and i < times:
    condition = getCondition()
    i += 1
  print(i, condition)

f2(10)

デコレータ

何かに役に立つかも。

def repeat(times):

  def _repeat(func):

    @functools.wraps(func)
    def wrapper(*args, **kwargs):
      for i in range(times):
        result = func(*args, **kwargs)
        if result:
          return [i, result]
      return [i, result]

    return wrapper

  return _repeat
  
ret = repeat(3)(getCondition)()
print(ret)

Discussion