Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
需要帮助理解*args+;减少Python中的使用_Python - Fatal编程技术网

需要帮助理解*args+;减少Python中的使用

需要帮助理解*args+;减少Python中的使用,python,Python,在试图找出n个数字之间最小公倍数的方法时,我遇到了以下代码: def gcd(a, b): """Return greatest common divisor using Euclid's Algorithm.""" while b: a, b = b, a % b return a def lcm(a, b): """Return lowest common multiple.""" return a * b // gcd(

在试图找出n个数字之间最小公倍数的方法时,我遇到了以下代码:

def gcd(a, b):
    """Return greatest common divisor using Euclid's Algorithm."""
    while b:      
        a, b = b, a % b
    return a

def lcm(a, b):
    """Return lowest common multiple."""
    return a * b // gcd(a, b)

def lcmm(*args):
    """Return lcm of args."""   
    return reduce(lcm, args)
在最后一个函数:lcmm之前,一切都是有意义的

当我尝试时:

>>> lcmm(range(1,5))
[1, 2, 3, 4]
鉴于

>>> lcmm(*range(1,5))
12
这是期望的输出

为了让事情变得更混乱

>>> reduce(lcm, range(1,5))
12
我已经读了一些关于*args用法和reduce的文章,但在这种情况下,我很难理解组合用法

谢谢

lcmm(*range(1,5))
中,您正在使用
*
解包iterable
范围(1,5)
,因此实际上您正在调用
lcmm(1,2,3,4)
。换句话说,有五个参数没有名字,但它们是有序的,它们在这些位置被传递。在函数
def lcmm(*args):
中,
*
将位置参数捕获到
args中。这意味着
args
获取值
(1,2,3,4)
。这就解释了为什么当
args=(1,2,3,4)
时,你会得到与
reduce(lcm,range(1,5))
相同的结果

当您调用
lcmm(范围(1,5))
时,意味着您将
[1,2,3,4]
作为参数传递。这是唯一的位置参数,因此在
def lcmm(*args):
中,
*args
的值仍然捕获所有位置参数。但是因为只有一个位置参数,
args
的值变为
([1,2,3,4],)
。这是一个包含一个值的元组,即
[1,2,3,4]
。当
lcm
计算返回值时,这会给您一个不同的结果。

lcmm(*range(1,5))
中,您正在使用
*
解包iterable
范围(1,5)
,因此您实际上正在调用
lcmm(1,2,3,4)
。换句话说,有五个参数没有名字,但它们是有序的,它们在这些位置被传递。在函数
def lcmm(*args):
中,
*
将位置参数捕获到
args中。这意味着
args
获取值
(1,2,3,4)
。这就解释了为什么当
args=(1,2,3,4)
时,你会得到与
reduce(lcm,range(1,5))
相同的结果

当您调用
lcmm(范围(1,5))
时,意味着您将
[1,2,3,4]
作为参数传递。这是唯一的位置参数,因此在
def lcmm(*args):
中,
*args
的值仍然捕获所有位置参数。但是因为只有一个位置参数,
args
的值变为
([1,2,3,4],)
。这是一个包含一个值的元组,即
[1,2,3,4]
。当
lcm
计算返回值时,这会给您一个不同的结果。

lcmm(*range(1,5))
中,您正在使用
*
解包iterable
范围(1,5)
,因此您实际上正在调用
lcmm(1,2,3,4)
。换句话说,有五个参数没有名字,但它们是有序的,它们在这些位置被传递。在函数
def lcmm(*args):
中,
*
将位置参数捕获到
args中。这意味着
args
获取值
(1,2,3,4)
。这就解释了为什么当
args=(1,2,3,4)
时,你会得到与
reduce(lcm,range(1,5))
相同的结果

当您调用
lcmm(范围(1,5))
时,意味着您将
[1,2,3,4]
作为参数传递。这是唯一的位置参数,因此在
def lcmm(*args):
中,
*args
的值仍然捕获所有位置参数。但是因为只有一个位置参数,
args
的值变为
([1,2,3,4],)
。这是一个包含一个值的元组,即
[1,2,3,4]
。当
lcm
计算返回值时,这会给您一个不同的结果。

lcmm(*range(1,5))
中,您正在使用
*
解包iterable
范围(1,5)
,因此您实际上正在调用
lcmm(1,2,3,4)
。换句话说,有五个参数没有名字,但它们是有序的,它们在这些位置被传递。在函数
def lcmm(*args):
中,
*
将位置参数捕获到
args中。这意味着
args
获取值
(1,2,3,4)
。这就解释了为什么当
args=(1,2,3,4)
时,你会得到与
reduce(lcm,range(1,5))
相同的结果


当您调用
lcmm(范围(1,5))
时,意味着您将
[1,2,3,4]
作为参数传递。这是唯一的位置参数,因此在
def lcmm(*args):
中,
*args
的值仍然捕获所有位置参数。但是因为只有一个位置参数,
args
的值变为
([1,2,3,4],)
。这是一个包含一个值的元组,即
[1,2,3,4]
。当
lcm
计算返回值时,这会给您一个不同的结果。

reduce
接受一个函数和一个要应用该函数的项目列表,因此您可以像这样使用它:
reduce(lcm,范围(1,5))

def lcmm(*args)
中的
*args
表示
lcmm
接受任意数量的单个参数,它们将作为一个名为
args
的元组在函数体中提供

因此您可以像
lcmm(1,2,3,4)
那样调用它,
args
将是元组
(1,2,3,4)

range
函数返回一个列表,以便将
range(1,5)
的结果传递到
l
foo(a, b, c)
bar = (a, b, c)
foo(*bar)
def foo(*args):
    a, b, c = args
    # stuff
def foo(a, b, c):
    # stuff