我有一个功能
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]
- 修改函数中函数的默认参数
答案 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对象评估为True
或False
。它在循环期间不会改变。可变对象可以改变其真值,但是在一般循环(不以任何方式触摸它)期间不能进行任意对象更改。一般来说,正如这里所说,你真的需要使用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()