需要帮助理解*args+;减少Python中的使用
在试图找出n个数字之间最小公倍数的方法时,我遇到了以下代码:需要帮助理解*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(
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