1

我有一个功能

 def f():
      while True:
           blah

我想改变 f 使得调用者可以控制 f 中的 while 循环运行的次数,而不改变 f 中的大部分代码(特别是不在 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)会循环五次。

于 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五次,然后退出。

这是一个坏主意的主要原因是它意味着检查对象的状态会修改它,这是人们不会想到的奇怪行为。我无法想象一个好的用例。

于 2013-05-23T22:05:54.100 回答
2

你不能完全按照你的描述去做。在 python 中传递的不是一个表达式,而是一个。一个对象。一个不可变对象通常评估为Trueor 或 to 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 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 回答
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 回答