你是什麼覺得你所要求的是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
的意思是「while y is true」,其中的任何值都會評估爲true。
這將減少你的程序如下:
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)
。但是,這與打破循環無關,但當k
和z
彼此不相等時,您嘗試執行的操作有兩個有效值。第二個測試用例說明了這一點,其中(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)
一些外賣:
- 擺脫這一正在做同樣的事情功能,使您可以更輕鬆地推論它。
- 以人類可讀的格式命名變量,以便我們,您的代碼的讀者(包括您)瞭解發生了什麼。
- 不要使用循環,除非你實際上循環了一些東西。
for
,while
等只需要使用,如果你打算去檢查一系列事情。
- 在提問時,一定要包括測試輸入,預期輸出和實際回收的內容。
print
ing字符串的當前最佳做法是使用.format()
function,以清楚地表明要打印的內容。
爲什麼你的for循環範圍具體包括y,你期望'while y''做什麼? – user2357112
'如果z == y:break'? –
行蹤和你想打破哪個循環? –