当我调用该函数时,它什么也没有显示?
回文数字读取方式相同。由两个2位数字产品制成的最大回文数是9009 = 91×99.当我调用该函数时,它什么也没有显示?
查找由两个3位数字产品制成的最大回文数。
这是我在Python 3.5的脚本:
def plin1():
for i in range(1000,1):
for j in range(1000,1):
if str(i*j)==str(i*j)[::-1]:
break
return i*j
print(i,'*',j,'=',i*j)
但是,当我把这个功能,打印什么。怎么了?
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)
。
可能会进行优化以减少计算次数。
range
有两个参数i
,j
生成范围从i
到j
。如果i > j
那么没有生成范围,并且在该范围内迭代时没有任何反应。
范围还需要一个“step”参数,允许您设置范围的增量。也许你打算使用它。它看起来像这样:
for i in range(1, 1000, 1):
# loop body
请注意,指定步骤1是多余的,因为1是该参数的默认值。
如果你想生成一个“做正确的事”的范围,以生成的(I,J)的较小的范围越大,你可能会写像下面这样的函数:
def dwim_range(i,j):
return range(*sorted((i,j)))
在这里,您正在对元组(i, j)
进行排序,然后使用*
运算符对其进行解压缩,以便range
按排序顺序获取元组的两项。
有没有一种方法可以生成从j到i的范围,如果j> i我是说我希望检查从最后开始。 –
@hamzabouabid当然,请参阅编辑过的帖子,了解您可能会这样做的一种建议。 –
谢谢您的信息。固定范围后,仍然不要为什么输出总是1000000(百万),请问你为什么告诉我? –
@hamzabouabid:原因是该函数由于return语句的放置而立即返回。查看建议更正的更新答案。 – mhawke
@hamzabouabid:还注意到'range()'包含结果中的第一个参数并排除了第二个参数。因此,您需要范围从999到99来覆盖所有3位数字,并且您不需要处理低于100的数字。 – mhawke