Skip to main content
 首页 » 编程设计

具有外部中断条件的 Python 生成器

2025年05月04日6lidabo

我需要迭代 n (= 5, f.i.) 个整数的升序序列 x,找到函数 f(*x) 返回 True 的所有序列。

假设如果 f_n(*y) 对于特定的 y 为假,那么对于任何 z 且 z_i >= y_i 的 f_n(*z) id 为假。所以 f_n 在其所有参数中都是单调的。

这种生成器函数可以用下面的方式来确定所有平方和<100的整数递增序列

for sequence in generate_sequences(5): 
   if sum_squares_is_at_least(sequence, 100): 
       # some code to trigger the breaking of the generator loop 
   else: 
       print sequence 

澄清: 这里的问题是我们需要单独迭代 n 个元素。最初,我们将 [1,1,1,1,1] 迭代到 [1,1,1,1,x],然后我们必须继续 [1,1,1,2,2] 到 [1, 1,1,2,y],最终以 [a,b,c,d,e] 结尾。看起来生成器应该看起来像这样,但需要一些代码来在必要时跳出 for 和/或 while 循环(由外部确定):

def generate_sequences(length, minimum = 1): 
    if length == []: 
        yield [] 
 
    else:  
        element = minimum 
        while True: 
 
            for sequence in generate_sequences(length - 1, element): 
                yield element + [sequence] 
 
            element += 1 

例子: 对于 n = 3,且平方和不大于 20,将生成以下序列: [1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4], [1, 2, 2], [1, 2, 3], [1 , 3, 3], [2, 2, 2], [2, 2, 3]

请注意,在一般情况下,我不能使用 4 是每个元素的上限的信息。这也会严重影响更大示例的运行时间。

请您参考如下方法:

你在找itertools.takewhile吗?

>>> from itertools import takewhile 
>>> def gen():  #infinite generator 
...    i=0 
...    while True: 
...       yield range(i,i+5) 
...       i = i+1 
...  
>>> [ x for x in takewhile( lambda x:sum(x)<20, gen() ) ] 
[[0, 1, 2, 3, 4], [1, 2, 3, 4, 5]] 
>>>