当我调用该函数时,它什么也没有显示?

问题描述:

回文数字读取方式相同。由两个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)

可能会进行优化以减少计算次数。

+0

谢谢您的信息。固定范围后,仍然不要为什么输出总是1000000(百万),请问你为什么告诉我? –

+0

@hamzabouabid:原因是该函数由于return语句的放置而立即返回。查看建议更正的更新答案。 – mhawke

+0

@hamzabouabid:还注意到'range()'包含结果中的第一个参数并排除了第二个参数。因此,您需要范围从999到99来覆盖所有3位数字,并且您不需要处理低于100的数字。 – mhawke

range有两个参数i,j生成范围从ij。如果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按排序顺序获取元组的两项。

+0

有没有一种方法可以生成从j到i的范围,如果j> i我是说我希望检查从最后开始。 –

+0

@hamzabouabid当然,请参阅编辑过的帖子,了解您可能会这样做的一种建议。 –