python表达式,计算结果为n次

时间:2013-05-23 21:57:58

标签: python

我有一个功能

 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吗?

我正在玩弄一些想法

- 制作一个表达式列表=列表[: - 1]

- 修改函数中函数的默认参数

6 个答案:

答案 0 :(得分:5)

不需要while循环。使用for循环:

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

_在for循环中用作变量名,通常是占位符。这个循环循环n次。所以f(5)会循环五次。

答案 1 :(得分: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五次,然后退出。

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

答案 2 :(得分:2)

你无法完全按照你的描述去做。在python中传递的不是表达式,而是对象。一般来说,Immutable对象评估为TrueFalse。它在循环期间不会改变。可变对象可以改变其真值,但是在一般循环(不以任何方式触摸它)期间不能进行任意对象更改。一般来说,正如这里所说,你真的需要使用for语句,或者传入一个可调用的对象(比如一个函数):

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

请注意,可调用解决方案可接受的原因,而“隐藏在布尔”@Lattyware所示的不是,这里的附加共同声明是明确的 - ()告诉读者几乎任何事情都可能发生在这里,取决于传递的对象,您不需要知道此对象中的__bool__方法被静默调用并且期望具有副作用。

答案 3 :(得分:0)

def f(c=-1):
    while c:
        print 'blah'
        if c > 0: c -= 1

答案 4 :(得分:0)

如何使用a generator as a coroutine

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

答案 5 :(得分:0)

这也可以 -

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

while foo():
    blah()