range(start, stop[, step]) -> range object
range()
需要的第一個參數是小於第二當step
是正的,並且step
默認爲1時range()
被調用以2個參數。因此,範圍對象產生一個空序列和for循環的身體從來沒有進入:
>>> list(range(1000, 1))
[]
然而,通過指定step
負值,你可以得到你需要,例如序列:
>>> list(range(10, 1))
[]
>>> list(range(10, 1, -1))
[10, 9, 8, 7, 6, 5, 4, 3, 2]
所以你的情況,你會做到這一點:
for i in range(999, 99, -1):
for j in range(999, 99, -1):
# etc...
那麼這將遍歷起始於最大的全3位數字。
也使用return
是不正確的,它會導致函數終止而不打印任何東西。這裏是一個更正的版本:
def plin1():
for i in range(999, 99, -1):
for j in range(999, 99, -1):
if str(i*j) == str(i*j)[::-1]:
return i*j
print(i,'*',j,'=',i*j)
現在函數只有當它找到迴文時才返回值。如果沒有迴文,該函數將返回None
。
但是,請注意,這不會產生兩個3位數的乘積的最大回文。這個函數返回580085,它是995 * 583.但是最大的一個是993 * 913 = 906609.你需要找出哪個是所有產品中最大的迴文,而不僅僅是找到的第一個迴文。這裏是一個發電機表達將產生所需的結果:
max((i*j,i,j) for i in range(100, 1000) for j in range(100, 1000)
if str(i*j) == str(i*j)[::-1])
其產生元組(906609, 993, 913)
。
可能會進行優化以減少計算次數。
謝謝您的信息。固定範圍後,仍然不要爲什麼輸出總是1000000(百萬),請問你爲什麼告訴我? –
@hamzabouabid:原因是該函數由於return語句的放置而立即返回。查看建議更正的更新答案。 – mhawke
@hamzabouabid:還注意到'range()'包含結果中的第一個參數並排除了第二個參數。因此,您需要範圍從999到99來覆蓋所有3位數字,並且您不需要處理低於100的數字。 – mhawke