Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正在查看prime sieve程序,但不确定为什么它总是出现关于切片长度的错误_Python_Python 2.7_Primes_Sieve - Fatal编程技术网

Python 正在查看prime sieve程序,但不确定为什么它总是出现关于切片长度的错误

Python 正在查看prime sieve程序,但不确定为什么它总是出现关于切片长度的错误,python,python-2.7,primes,sieve,Python,Python 2.7,Primes,Sieve,问题发生在第5行,我知道实现[False]*((n-I*I-1)/(2*I)+1)是可行的,但我不确定原因。您试图用一个元素替换切片覆盖的所有元素: def primes(n): sieve = [True] * n for i in xrange(3,int(n**0.5)+1,2): if sieve[i]: sieve[i*i::2*i]=[False] print [2] + [i for i in xrange(3,n,2

问题发生在第5行,我知道实现
[False]*((n-I*I-1)/(2*I)+1)
是可行的,但我不确定原因。

您试图用一个元素替换切片覆盖的所有元素:

def primes(n):
    sieve = [True] * n
    for i in xrange(3,int(n**0.5)+1,2):
        if sieve[i]:
            sieve[i*i::2*i]=[False]
    print [2] + [i for i in xrange(3,n,2) if sieve[i]]

 primes(int(raw_input("Please enter an upper limit ")))
这将从列表中删除元素,但Python仅允许在不使用跨步的情况下用更少或更多的元素替换切片(如果该部分是连续的,则允许这样做)。无论哪种方式,您都希望用右侧相同数量的元素替换所有这些元素,以便可以将筛中的这些位置设置为
False

为此,您需要调整右侧的列表,以便有足够的元素替换每个切片的元素:

sieve[i*i::2*i] = [False]
该公式计算切片在基于0的索引系统中覆盖的元素数
n-1
是最高的索引,减去起始索引,得到一些受影响的元素,除以步幅,再加上1,因为步幅包括第一个元素

Python的
xrange()
对象(
range()
在Python 3中)使

Else对于步骤>0,如果n个值在范围内,则最后一个值为
lo+(n-1)*阶跃,必须为
sieve[i*i::2*i] = [False] * (((n - 1 - i*i) // (2 * i)) + 1)