Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:do r=random_stuff()而不满足_条件(r)_Python_Design Patterns_Do While - Fatal编程技术网

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()