Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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 为什么这个循环有;“范围”内的i为2;?它有什么作用?_Python - Fatal编程技术网

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