|
|
发表于 2017-2-8 11:35:52
|
显示全部楼层
首先,你要知道range()函数不含右端点的值,这个可以查看help(range)的说明
- In [1]: range?
- Init signature: range(self, /, *args, **kwargs)
- Docstring:
- range(stop) -> range object
- range(start, stop[, step]) -> range object
- Return an object that produces a sequence of integers from start (inclusive)
- to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1.
- start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3.
- These are exactly the valid indices for a list of 4 elements.
- When step is given, it specifies the increment (or decrement).
- Type: type
- In [2]: x = range(0,10)
- In [3]: list(x)
- Out[3]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
复制代码
上面这个简单的例子就可以看出来,所以不会出现n对自身取模的情况
但是为什么例子里用了range(2, n-1),这个涉及到一点简单的数论知识和相关的算法
其实,任意2个相邻的自然数i, i+1都是互质的(i=1,2,3,……),因此事实上我们根本不需要去判断n%(n-1)
我们甚至不需要遍历所有比n小的数来判断一个数是否为素数,只需要判断到math.sqrt(n)或者n**0.5即可,而且不必以1为步长进行检测,只要试验所有小于n**0.5的素数能否整除n即可。
就算法的角度而言,这个例子给出的代码显然是低效的,但作为简单的例子也不是不可以。至于n=1的情况,这段代码明显没有单独考虑边界条件。这涉及到代码的健壮性(robustness),因为在范围输入控制时,程序没有限制用户可以输入那些值,不过扯开去就没底了。作为一个简单例子的代码片段,这已经可以了。
|
|