Python 为什么这个循环有;“范围”内的i为2;?它有什么作用?
我试图找到找到一个数的所有因子的最佳方法。我找到了这个代码,但我不明白:Python 为什么这个循环有;“范围”内的i为2;?它有什么作用?,python,Python,我试图找到找到一个数的所有因子的最佳方法。我找到了这个代码,但我不明白: import math def get_factors(n): return sum(2 for i in range(1, round(math.sqrt(n)+1)) if not n % i) 对于范围内的i,此2实现了什么?这段代码是如何计算因子数的?生成器表达式一次查找两个因子,因此每次查找一对因子时,都需要将两个因子添加到计数中 下面是同样的循环,语法更清晰: def get_factors(n):
import math
def get_factors(n):
return sum(2 for i in range(1, round(math.sqrt(n)+1)) if not n % i)
对于范围内的i,此
2实现了什么?这段代码是如何计算因子数的?生成器表达式一次查找两个因子,因此每次查找一对因子时,都需要将两个因子添加到计数中
下面是同样的循环,语法更清晰:
def get_factors(n):
total_factors = 0
limit = round(math.sqrt(n) + 1)
for i in range(1, limit):
if n % i == 0:
total_factors += 2
return total_factors
作为生成器表达式,它是如何工作的?让我们把语法解包。生成器表达式的一般形式为:
结果表达式
对于
变量
在
可编辑表达式
如果
谓词
这将返回一个生成器,该生成器将是一个iterable对象,其中包含谓词为true的给定iterable表达式
中的每个值的结果表达式
(可以基于变量
,但在本例中不是)
在这种情况下,结果表达式
是一个常数2
,因此我们在循环中每次谓词
为真时都会得到一个2
(也就是说,在布尔上下文中,非n%i
为真
,这意味着i
平均除以n
)
整个生成器表达式被传递给sum
,它接受一个iterable参数,并使用+
运算符将其减少为单个值;在这种情况下,它需要所有的2
s并将它们相加,得到一个总数
好的,那么为什么这样做?这是一个数学问题,不是编程问题
slallum在上面的评论中提到了这一点,但要理解这是如何工作的,请思考一个数字具有因子意味着什么
让我们选一个像12这样的数字。12有六个因素:1、2、3、4、6、12:
12/1=12
12 / 2 = 6
12 / 3 = 4
12 / 4 = 3
12 / 6 = 2
12 / 12 = 1
这里有一个明显的对称性:每个因子都与另一个因子配对:
/--12的平方根=约3.46
|
1 2 3 4 5 6 7 8 9 10 11 12
| | \--/ | |
| \-----------/ |
\----------------------------------/
两系列因素相互“交叉”的分界线在哪里?这是平方根。12的平方根大约是3.46,事实上,这是对称线,因子围绕对称线分组。这是合乎逻辑的,因为平方根的意思是:它是一个数字,作为一个因子,只能被计算一次
优化是只需要计算一半的因子(那些在平方根以下的因子),并且您知道在平方根以上有相应的因子。所以每次你找到一个比平方根小的因子,你就数到两个因子
正如slallum在评论中指出的那样,这表明这个实现是错误的:对于任何一个完全平方的数字,它返回的计数都是1。例如,16有5个因子:1、2、4、8和16,但是这个实现会说它有6,因为它要计算4两次。生成器表达式一次查找两个因子,因此每次查找一对因子时,它需要在计数中加上两个
下面是同样的循环,语法更清晰:
def get_factors(n):
total_factors = 0
limit = round(math.sqrt(n) + 1)
for i in range(1, limit):
if n % i == 0:
total_factors += 2
return total_factors
作为生成器表达式,它是如何工作的?让我们把语法解包。生成器表达式的一般形式为:
结果表达式
对于
变量
在
可编辑表达式
如果
谓词
这将返回一个生成器,该生成器将是一个iterable对象,其中包含谓词为true的给定iterable表达式
中的每个值的结果表达式
(可以基于变量
,但在本例中不是)
在这种情况下,结果表达式
是一个常数2
,因此我们在循环中每次谓词
为真时都会得到一个2
(也就是说,在布尔上下文中,非n%i
为真
,这意味着i
平均除以n
)
整个生成器表达式被传递给sum
,它接受一个iterable参数,并使用+
运算符将其减少为单个值;在这种情况下,它需要所有的2
s并将它们相加,得到一个总数
好的,那么为什么这样做?这是一个数学问题,不是编程问题
slallum在上面的评论中提到了这一点,但要理解这是如何工作的,请思考一个数字具有因子意味着什么
让我们选一个像12这样的数字。12有六个因素:1、2、3、4、6、12:
12/1=12
12 / 2 = 6
12 / 3 = 4
12 / 4 = 3
12 / 6 = 2
12 / 12 = 1
这里有一个明显的对称性:每个因子都与另一个因子配对:
/--12的平方根=约3.46
|
1 2 3 4 5 6 7 8 9 10 11 12
| | \--/ | |
| \-----------/ |
\----------------------------------/
两系列因素相互“交叉”的分界线在哪里?这是平方根。12的平方根大约是3.46,事实上,这是对称线,因子围绕对称线分组。这是合乎逻辑的,因为平方根的意思是:它是一个数字,作为一个因子,只能被计算一次
优化是只需要计算一半的因子(那些在平方根以下的因子),并且您知道在平方根以上有相应的因子。所以每次你找到一个比平方根小的因子,你就数到两个因子
作为slallum poi