Python 调试索引器:平凡的和生成问题

Python 调试索引器:平凡的和生成问题,python,debugging,Python,Debugging,我不知道是什么导致了这里的索引错误,也不完全是在寻找一个快速修复方法。但是,如果我的代码拒绝了您/非常无效,请告诉我。目标是生成由两个四位数的乘积生成的回文 代码: for x in range(10000): for y in range(10000): product = str(x*y) lengthprod = len(str(product)) for digit in range(lengthprod+1):

我不知道是什么导致了这里的索引错误,也不完全是在寻找一个快速修复方法。但是,如果我的代码拒绝了您/非常无效,请告诉我。目标是生成由两个四位数的乘积生成的回文

代码:

for x in range(10000):
    for y in range(10000):
        product = str(x*y)
        lengthprod = len(str(product))
        for digit in range(lengthprod+1):
            if (product[digit]==product[lengthprod-digit]):
                print x,"x",y,"=",product
回溯:

Traceback (most recent call last):
  File "<pyshell#31>", line 6, in <module>
    if (product[digit]==product[lengthprod-digit]):
IndexError: string index out of range

您迭代值0…lengthprod,但产品的法定下标为0…lengthprod-1


最后一个索引超出范围。它引用的元素超出字符串末尾一个字节。

您迭代值0…lengthprod,但product的法定下标为0…lengthprod-1

最后一个索引超出范围。它引用的元素超出字符串末尾一个字节。

两个更改:

1:range0,lengthprod+1应该是range0,lengthprod

请参阅有关范围的文档

2:产品[lengthprod数字]应为产品[lengthprod数字-1]

关闭一个错误,因为lengthprod是基于长度1的,而digit是基于索引0的

注意,这只会提供有效的单位数回文,但会使您通过索引超出范围错误。

两个更改:

1:range0,lengthprod+1应该是range0,lengthprod

请参阅有关范围的文档

2:产品[lengthprod数字]应为产品[lengthprod数字-1]

关闭一个错误,因为lengthprod是基于长度1的,而digit是基于索引0的

注意,这只会给你有效的一位数回文,但会让你通过索引超出范围的错误。

你的代码拒绝了我! 对不起,我通常不会这么粗鲁,但既然是你自找的

对于这样的长循环,请使用xrange而不是range。 从1开始,而不是从0开始,除非您不介意所有重复的琐碎结果。 由于乘法可以进行转换,您可能希望在三角形上循环,而不是在正方形上循环,以避免重复。 您的变量名产品将函数从数字核心阴影化。 问题是你对两个四位数的乘积感兴趣,但是你的代码对数字中的位数没有这样的限制。如果您想输入四位数字,只需启动xrangestart,从1000开始停止。 既然您声明的目标是生成回文,那就用正确的工具:生成器来试试吧

def pairs(n):
  for x in xrange(n):
    for y in xrange(n):
      yield (x,y)

pairs_generator = pairs(100)

filter(None, ['{x}*{y}={xy}'.format(x=x,y=y,xy=x*y) if str(x*y) == str(x*y)[::-1] else None for x,y in pairs_generator])
为了清晰起见,我保持了发电机的简单。我将把它作为一个练习留给你们,让你们简单地制作一个发生器来吐出回文。这将涉及到将我在列表理解中放入的逻辑移到生成器中,或者您可以使用pairs_生成器创建一个新的回文_生成器

玩得开心

你的代码让我反感! 对不起,我通常不会这么粗鲁,但既然是你自找的

对于这样的长循环,请使用xrange而不是range。 从1开始,而不是从0开始,除非您不介意所有重复的琐碎结果。 由于乘法可以进行转换,您可能希望在三角形上循环,而不是在正方形上循环,以避免重复。 您的变量名产品将函数从数字核心阴影化。 问题是你对两个四位数的乘积感兴趣,但是你的代码对数字中的位数没有这样的限制。如果您想输入四位数字,只需启动xrangestart,从1000开始停止。 既然您声明的目标是生成回文,那就用正确的工具:生成器来试试吧

def pairs(n):
  for x in xrange(n):
    for y in xrange(n):
      yield (x,y)

pairs_generator = pairs(100)

filter(None, ['{x}*{y}={xy}'.format(x=x,y=y,xy=x*y) if str(x*y) == str(x*y)[::-1] else None for x,y in pairs_generator])
为了清晰起见,我保持了发电机的简单。我将把它作为一个练习留给你们,让你们简单地制作一个发生器来吐出回文。这将涉及到将我在列表理解中放入的逻辑移到生成器中,或者您可以使用pairs_生成器创建一个新的回文_生成器


玩得开心

将一个数字转换成字符串通常是一个缓慢的操作,因为在一般整数、浮点、科学记数法中有很多可能性,可能是一些奇异的东西,比如分数或虚数,更不用说处理前导零或过宽数或四舍五入到小数点后两位了。因此,检查正整数是否为回文的更好方法通常是通过重复使用输入模10提取最后一个数字,将该数字添加到累加器中,累加器在每一步乘以10,然后在循环之前将输入数字除以10,以数字方式反转数字。我不会说Python,所以下面是我的Scheme程序来反转一个数字:

(define (rev n)
  (let loop ((n n) (r 0))
    (if (zero? n) r
      (loop (quotient n 10)
            (+ (* r 10) (modulo n 10))))))
然后,您可以通过检查输入的数字是否等于其反转来检查该数字是否为回文

编辑:在Python中:

def rev(n):
    r = 0
    while n > 0:
        r = r * 10 + n % 10
        n = n // 10
    return r

将一个数字转换成一个字符串通常是一个缓慢的操作,因为在一般的整数、浮点、科学记数法中有很多可能性,可能是像分数或虚数之类的奇异的东西,更不用说它了 例如处理前导零或过宽数字或四舍五入到小数点后两位。因此,检查正整数是否为回文的更好方法通常是通过重复使用输入模10提取最后一个数字,将该数字添加到累加器中,累加器在每一步乘以10,然后在循环之前将输入数字除以10,以数字方式反转数字。我不会说Python,所以下面是我的Scheme程序来反转一个数字:

(define (rev n)
  (let loop ((n n) (r 0))
    (if (zero? n) r
      (loop (quotient n 10)
            (+ (* r 10) (modulo n 10))))))
然后,您可以通过检查输入的数字是否等于其反转来检查该数字是否为回文

编辑:在Python中:

def rev(n):
    r = 0
    while n > 0:
        r = r * 10 + n % 10
        n = n // 10
    return r

为什么是rangelengthprod+1而不是rangelengthprod?不,这是来自Euler项目,只是为了练习,只是为了练习我向你保证大卫:为什么是rangelengthprod+1而不是rangelengthprod?不,是来自Euler项目,只是为了练习,只是为了练习我向你保证大卫:只是确认:你是指lengthprod,对吗?很抱歉给您带来不便,但我不明白什么是法定认购权,lengthprod,抱歉。我基本上更正了我的答案,请再次检查。我用索引替换了单词下标,并澄清了我所说的越界。谢谢,它似乎忽略了最后一个for循环中的if语句,它只是乘以1000!x1000!,你能告诉我为什么吗?只是确认一下:你是说lengthprod,对吗?很抱歉给您带来不便,但我不明白什么是法定认购权,lengthprod,抱歉。我基本上更正了我的答案,请再次检查。我用索引替换了单词下标,并澄清了我所说的越界。谢谢,它似乎忽略了最后一个for循环中的if语句,它只是乘以1000!x1000!,你能告诉我为什么吗?哇,为什么我只有一位数的回文?编辑:事实上,没关系,我会考虑的。谢谢你对这个错误的帮助!哇,为什么我只有一位数的回文?编辑:事实上,没关系,我会考虑的。谢谢你对这个错误的帮助!凉的凉的