for循环之求质数问题

身份:小白

在python学习过程中,学到求100以内质数的时候,碰到一个小问题,求大神指点一下下

a = []
b = []
for i in range(2, 101):
    a.append(i)
    for j in range(2, i):
        if i % j == 0:
            b.append(i)
            break

在我把“20以内所有元素生成列表a,20以内除1与其本身之外还有其他因数的元素生成列表b”后,接下来:

for循环a列表,如果元素也在b中,就在a列表中移除该元素,打印a列表,最后的结果却是错的:

for i in a:
    if i in b:
        a.remove(i)
print(a)

# 结果:[2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]

而for循环b列表,如果元素也在a中,就在a列表中移除该元素,打印a列表,最后的结果才正确:

for i in b:
    if i in a:
        a.remove(i)
print(a)

# 结果:[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

这是为什么呢?想了半天没想明白,是不是进入哪个误区了啊?/(ㄒoㄒ)/~~

首先,你要理解遍历的概念,比如 [1,2,3,4,5]

遍历的时候,他正常来说是 1,2,3,4,5,但这个其实是不准确的,完整的理解是 [0],即第一个元素,[1],[2],[3],[4]

当遍历列表是,你删除了一个元素,则后续元素向前移动了

arr = [1,2,3,4,5]
for i in arr:
    arr.remove(i)
    
print(arr)

arr[0],被删除,再次遍历时,寻找arr[1],而列表已变成 [2,3,4,5],这个时候删除 arr[1],变成[2,4,5],再删除 arr[2],最后arr里还有两个元素,[2,4]

所以,你可以理解了?

这么写比较简洁:

a = []
for i in range(2, 101):
    flag=0
    for j in range(2, i):
        if i % j == 0:
            flag=1
            break
    if flag==0:
        a.append(i)
print(a)

#Function:for循环求质数

a = []
b = []

#求100以内的非质数
for i in range(2,101):
    a.append(i)
    for j in range(2,i):
        if (i%j == 0 and i != j):   #判断是否是质数
             b.append(i)
             break

#将非质数从1-100中移除
for tmp in b:
    if a.count(tmp) > 0:    #检查元素是否在列表中
        a.remove(tmp)

print(a)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

这个是按照题主的思路可以实现功能的代码