当我调用该函数时它什么都没显示?

时间:2017-06-04 00:11:30

标签: python-3.x

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

但是当我调用此功能时,没有打印任何内容。怎么了?

2 个答案:

答案 0 :(得分:1)

  

range(start, stop[, step]) -> range object

range()为正时,

step要求第一个参数小于第二个参数,当使用2个参数调用step时,range()要求默认为1。因此,范围对象产生一个空序列,并且永远不会输入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)

可能会有一些优化可以减少计算次数。

答案 1 :(得分:0)

带有两个参数range的{​​p> ij生成从ij的范围。如果i > j则没有生成范围,并且在迭代该范围时没有任何反应。

范围也采用“步”参数,允许您设置范围的增量。也许你打算用它。它看起来像这样:

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按排序顺序获取元组的两个项目。