在python中编码Bug

时间:2018-02-23 03:37:20

标签: python

因此,此代码使用范围并检查每个值以查看它是否为素数。

问题在于,如果起始值不是1,则会出现"IndexError: list index out of range"的错误,但使用起始值1可以正常工作。我该怎么办?

start = 2
stop = 20

range_pn = list(range(start, stop + 1))
list_pn = []
num_order = 0
pn_checklist = []

while num_order < stop:
    rand_num = range_pn[num_order]
    divisor = rand_num
    while divisor > 0:
        num_check = (rand_num) % (divisor)
        if num_check == 0:
            pn_checklist.append(rand_num)
        divisor -= 1
    if pn_checklist.count(max(pn_checklist)) <= 2:
        list_pn.append(rand_num)
    num_order += 1

print(list_pn)

2 个答案:

答案 0 :(得分:2)

当Loop的运行速度超过range_pn的长度时。

  

以下代码行:

range_pn = list(range(start, stop + 1))
print(range_pn)
     

产生输出:

[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

列表的长度为:

print(len(range_pn))

Output:
19

答案 1 :(得分:1)

当您从2开始到20时,range_pn的长度为19,即19个项目出现在列表中。

range_pn = list(range(start, stop + 1))

当您正在检查num_order < stop条件时,这意味着您必须迭代循环20时间因为num_order的值设置为0而值stop20。 您是按索引从列表中提取项目,因此当索引为19时它会给出IndexError,因为列表包含19项,即从索引0到索引18

rand_num = range_pn[num_order]

根据我改变条件来解决IndexError问题。

示例:while num_order+start < stop:

以下方法是找出数字 prime 与否。

将输入数字从“2”除以number/2,因为如果数字不是素数,那么应该可以在2number/2之间用数字整除。

def is_number_prime(number):
    """
    number must be positive integer greater than 1
    """
    for divisor in range(2, number//2+1):
        if number%divisor == 0:
            return False
    return True