1

私には機能があります

 def f():
      while True:
           blah

f のコードをほとんど変更せずに (特に f にカウンターを追加しないで)、呼び出し元が f の while ループの実行回数を制御できるように、f を変更したいと考えています。何かのようなもの

 def f(num_executions = True):
      while num_executions:
           blah()

f() は無限ループを実行しますが、f(an_expression_that_evaluates_to_true_n_times) は while ループを n 回実行します。そのような表現は何でしょうか?

更新: ループの実行回数を制御する方法はたくさんありますが、ここでの本当の問題は -

Python の式は、構成可能な回数だけ True と評価できますか?

私がいじっているいくつかのアイデア

- list = list[:-1] から式を作成する

- 関数内の関数のデフォルト パラメータの変更

4

6 に答える 6

5

while ループは必要ありません。for ループを使用します。

>>> def f(n):
...     for _ in range(n):
...         dostuff()

_通常、 for ループで変数名として使用され、プレースホルダーになります。このループは n 回ループします。したがってf(5)、5回ループします。

于 2013-05-23T22:01:58.923 に答える
3

私はこれが悪い考えであることに同意しますが、それは完全に (そして簡単に) 可能です:

class BoolChange:
    def __init__(self):
        self.count = 0

    def __bool__(self):
        self.count += 1
        return self.count <= 5

x = BoolChange()
while x:
    print("Running")

これRunningは 5 回出力してから終了します。

これが悪い考えである主な理由は、オブジェクトの状態をチェックするとオブジェクトが変更されることを意味するためです。これは、人々が予期しない奇妙な動作です。これの良い使用例は想像できません。

于 2013-05-23T22:05:54.100 に答える
2

あなたが説明したことを正確に行うことはできません。Python で渡されるのはではなく、です。オブジェクト。_ 一般に、不変オブジェクトは または のいずれTrueかに評価されますFalse。ループ中は変化しません。ミュータブル オブジェクトはその真偽値を変更できますが、一般的なループ中にオブジェクトを任意に変更することはできません (ループは一切触れません)。一般に、ここで述べたように、forステートメントを使用するか、呼び出し可能なオブジェクト (関数など) を渡す必要があります。

def f(is_true = lambda x : True):
    while is_true():
        blah()

呼び出し可能なソリューションが受け入れられる理由は、@Lattyware が示した「ブール値に隠れる」が受け入れられない理由であることに注意してください。これは、ここでの追加の計算が明示的であるためです()。また__bool__、このオブジェクトのメソッドが暗黙的に呼び出され、副作用があることが予想されることを知る必要はありません。

于 2013-05-23T22:07:06.453 に答える
0
def f(c=-1):
    while c:
        print 'blah'
        if c > 0: c -= 1
于 2013-05-23T22:03:46.397 に答える
0

これも機能します-

def foo(n=[1,2,3]):
     foo.func_defaults = tuple([foo.func_defaults[0][:-1]],)
     return n

while foo():
    blah()
于 2013-05-23T22:19:26.007 に答える
0

ジェネレーターをコルーチンとして使用するのはどうですか?

def blah():
    print 'hi'

def f():
    while True:
        blah()
        yield

x = f()
next(x) # "hi"

ここでのジェネレーターは、それが生成するものには使用されませんが、制御を生成するたびに制御を生成するため、外部で何回制御するかを制御できます。

for i in range(3):
    next(x) # blah blah blah
于 2013-05-23T22:07:31.420 に答える