Python:do r=random_stuff()而不满足_条件(r)
我经常不得不随机生成具有某些约束的内容。在许多情况下,在生成过程中忽略约束,检查是否满足约束,然后重新执行该过程会更快。由于缺少Python:do r=random_stuff()而不满足_条件(r),python,design-patterns,do-while,Python,Design Patterns,Do While,我经常不得不随机生成具有某些约束的内容。在许多情况下,在生成过程中忽略约束,检查是否满足约束,然后重新执行该过程会更快。由于缺少do关键字,我通常会写 r = random_stuff() while not meets_condition(r): r = random_stuff() 这有点难看,因为我有两次相同的代码行。我真正想要的是一个像 r = random_stuff() until meets_condition(r) 与2.5中介绍的三元运算符类似: a = b if
do
关键字,我通常会写
r = random_stuff()
while not meets_condition(r):
r = random_stuff()
这有点难看,因为我有两次相同的代码行。我真正想要的是一个像
r = random_stuff() until meets_condition(r)
与2.5中介绍的三元运算符类似:
a = b if condition else c
只需在执行语句左侧之前计算此处的条件。有人对一种设计模式(应该在Python 2.7中工作)有什么建议吗?这种设计模式可以弥补,同时-构造出内在的非语言丑陋
while True:
r = random_stuff()
if meets_condition(r):
break
或
你的想法还不错,但在
之前不要使用新的关键字,而是像这样
a = (<expression> while <condition>)
如果您可以确定您的random_stuff()
只返回特定类型的值,例如数字、字符串等,那么您可以将其他一些值作为哨兵。特别是,当None
永远不会发生时,采用此选项,以获得永无止境的生成器
for r in iter(random_stuff, None):
if meets_condition(r): break
然后调用random\u stuff()
,直到它满足条件
也许更好
r = next(r for r in iter(random_stuff, None) if meets_condition(r))
这会给你第一个匹配的
while not meets_condition(random_stuff()): pass
如果你真的需要random\u stuff()
,那么它可以作为副作用存储在其他地方(例如,生成random\u stuff
类的\uuuuuuuuuuuuuu
方法)?你可以这样做
我太懒了,无法处理处于find_状态的kw args。你得到你付出的:D
def find_condition(cond_mk, cond_ck, *args):
"""
.. function:: find_condition(cond_mk, cond_ck) -> cond
Create conditions by calling cond_mk until one is found that passes
the condition check, cond_ck. Once cond_ck returns True, iteration
over cond_mk stops and the last value processed is returned.
** WARNING **
This function could loop infinitely.
``cond_mk`` - callable that creates a condition. It's return value is
passed to cond_ck for verification.
``cond_ck`` - callable that checks the return value of cond_mk.
``args`` - any arguments to pass to cond_mk should be supplied here.
"""
v = cond_mk(*args)
while not cond_ck(v):
v = cond_mk(*args)
return v
# Test it out..
import random
random.seed()
print find_condition(random.randint, lambda x: x > 95, 1, 100)
好吧,受@jaime的启发,我写了以下装饰师:
def retry(condition):
def deco_retry(f):
def f_retry(*args, **kwargs):
success = False
while not success:
result = f(*args, **kwargs)
success = condition(result)
return result
return f_retry
return deco_retry
现在,进行以下工作:
def condition(calue):
return value < .5
@retry(condition)
def random_stuff():
return random.random()
print random_stuff()
def条件(计算):
返回值<.5
@重试(条件)
def random_stuff():
返回random.random()
打印随机内容()
此外,内联:
@retry(lambda x: x < .5)
def random_stuff():
return random.random()
print random_stuff()
@重试(lambda x:x<.5)
def random_stuff():
返回random.random()
打印随机内容()
但是,重试现在绑定到random\u stuff()
方法,该方法现在只能用于修饰它的条件。此外,它对实例方法不起作用(如@retry(self.condition)
)。有什么想法可以绕过它吗?不错,但它没有给我random\u stuff()。
def condition(calue):
return value < .5
@retry(condition)
def random_stuff():
return random.random()
print random_stuff()
@retry(lambda x: x < .5)
def random_stuff():
return random.random()
print random_stuff()