如何停止循环?

时间:2015-11-30 22:54:37

标签: python

def sum_div(x, y):
    for k in range(x,y+1):
        for z in range(x,y+1):
            sx = 0
            sy = 0
            for i in range(1, k+1):
                if k % i == 0:
                    sx += i
            for j in range(1, z+1):
                if z % j == 0:
                    sy += j
            if sx == sy and k!= z:
                 print "(", k ,",", z, ")"

x = input("Dati x : ")
y = input("Dati y : ")
sum_div(x, y)

如果z == y

的值,如何停止循环?

循环打印一对数字,范围从xy,但当它达到y值时,循环会打印一对反向数字,我不会这样做不需要它。

2 个答案:

答案 0 :(得分:3)

break命令将突破循环。所以这样的一行:

if (z == y):
    break

应该做你想做的事。

答案 1 :(得分:1)

您认为自己要求的是break命令,但您实际需要的是删除重复内容。

您的计划缺乏明确性。例如:

for i in range(1, k+1): 
    if k % i == 0:  
        sx += i
for j in range(1, z+1):
    if z % j == 0:
        sy += j

这两件事基本上是一样的,可以用list comprehension(在REPL中)更清晰地写出:

>>> def get_divisors(r: int) -> list:
...     return [i if r % i == 0 else 0 for i in range(1, r+1)]
... 
... 
>>> get_divisors(4)
>>> [1, 2, 0, 4]

>>> sum(get_divisors(4))
>>> 7

你的专栏:

while y:

...如果找到匹配,将无限循环。你应该删除它。 while y表示"当y为真"时,任何值都将评估为真。

这会将您的计划缩减为以下内容:

def get_divisors(r: int) -> list:
    return [i if r % i == 0 else 0 for i in range(1, r+1)]

def sum_div(x, y):
    for k in range(x,y+1): 
        sum_of_x_divisors = sum(get_divisors(k))  # Note this is moved here to avoid repeating work.
        for z in range(x,y+1):
            sum_of_y_divisors = sum(get_divisors(z))
            if sum_of_x_divisors == sum_of_y_divisors and k!= z:
                print("({},{})".format(k, z))

根据代码的逻辑,在REPL中测试它似乎是正确的:

>>> sum_div(9,15)
(14,15)
(15,14)
>>> sum_div(21, 35)
(21,31)
(31,21)
(33,35)
(35,33)

但对于sum_div(9,15),您只需要(14,15)(15,14)中的一个,这是可能的。但是,这与打破循环无关,但是当kz彼此不相等时,您尝试执行的操作有两个有效值。第二个测试用例证明了这一点,其中(33,35)是重复值,但如果你在(21,31)上打破for循环,则不会得到第二组值。

我们可以解决这个问题的一种方法是在工作完成时重新排序:

def sum_div(x, y):
    result_set = set()  # Sets cannot have duplicate values
    for k in range(x,y+1): 
        sum_of_x_divisors = sum(get_divisors(k))
        for z in range(x,y+1):
            sum_of_y_divisors = sum(get_divisors(z))
            if sum_of_x_divisors == sum_of_y_divisors and k!= z:
                result_set.add(tuple(sorted((k,z))))  # compile the result set by sorting it and casting to a tuple, so duplicates are implicitly removed.
    for k, z in result_set:  # Print result set after it's been compiled
        print("({},{})".format(k, z))

我们看到了正确的结果:

>>> sum_div(9,15)
(14,15)
>>> sum_div(21,35)
(21,31)
(33,35)

或者,您在评论中提供的测试用例。请注意缺少重复:

>>> sum_div(10,25)
(16,25)
(14,15)
(15,23)
(10,17)
(14,23)

一些要点:

  • 分解正在执行相同操作的功能,以便您可以更轻松地对其进行推理。
  • 以人类可读的格式命名变量,以便我们,您的代码的读者(包括您)了解正在发生的事情。
  • 不要使用循环,除非你实际上循环了某些东西。 forwhile等只有在您计划查看事项清单时才需要使用。
  • 在提问时,请务必始终包含测试输入,预期输出以及您实际获得的内容。
  • 目前print字符串的最佳做法是使用.format() function,以便清楚显示您要打印的内容。