Python 函数参数中的 * 和 ** 分别是什么

举报
宇宙之一粟 发表于 2022/04/15 00:24:35 2022/04/15
【摘要】 接受任意数量参数的函数位置参数: 参数的传递顺序必须与函数定义中声明的参数顺序完全相同。它的工作方式类似于变量赋值。第一个参数是函数定义中第一个参数的值。第二个参数是函数定义中第二个参数的值,以此类推。>>> def hello_to_you(first_name,last_name): print(f"Hello, {first_name} {last_name}") >>>...

接受任意数量参数的函数

位置参数: 参数的传递顺序必须与函数定义中声明的参数顺序完全相同。它的工作方式类似于变量赋值。第一个参数是函数定义中第一个参数的值。第二个参数是函数定义中第二个参数的值,以此类推。

>>> def hello_to_you(first_name,last_name):
    print(f"Hello, {first_name} {last_name}")

    
>>> hello_to_you("Elon", "Musk")
Hello, Elon Musk
>>> 

Python 中可以通过使用 * 开头的参数来接受一个任意数量的位置参数的函数,比如计算一个任意数量的数字的平均数:

>>> def avg(num, *rest):
	return (num + sum(rest)) / (1 + len(rest))

>>> avg(1, 2, 3, 4, 5)
3.0
>>> avg(2, 3)
2.5
>>> avg(2021, 2022, 2023)
2022.0
>>> 

在上面的代码中,rest 是一个元组,它包含了其他所有传递过来的位置参数。

使用位置参数,仅使用函数调用中传递的值调用函数。在那里,每个值直接对应于函数定义中每个参数的数量、顺序和位置。

关键字参数:

在这种情况下,不只是在函数调用中传入值,而是指定参数的名称,然后指定要为其分配的值,形式为 key = value.

每个键都匹配函数定义中的每个参数。显式调用参数的名称和它们所采用的值有助于更清楚地了解您传入的内容并避免任何可能的混淆。

>>> def fave_language(name,language):
    print(f"Hello, I am {name} and my favorite programming language is {language}")

    
>>> fave_language(name="Yuzhou1su", language="Python")
Hello, I am Yuzhou1su and my favorite programming language is Python
>>> 

我们可以用 ** 来接受任意数量的关键字参数,比如:

>>> def function(**arg):
      for i in arg:
        print (i,arg[i])
>>> function(a=1, b=2, c=3, d=4, e=5)
a 1
b 2
c 3
d 4
e 5
>>> 

总结

在函数定义中,利用 * 接收任意数量的参数;利用 ** 来接受任意数量的关键字参数。

同时,需要注意的是位置参数和关键字参数可以与普通参数混合,以允许一组固定和一些可变参数:

def foo(para1, *args, **kwargs):
   pass

还值得注意的是,您也可以在调用函数时使用 * 和 ** 。这是一个快捷方式,允许您使用列表/元组或字典直接将多个参数传递给函数。例如:

>>> def foo(x,y,z):
	print("x=" + str(x))
	print("y=" + str(y))
	print("z=" + str(z))

	
>>> mylist = [1,2,3]
>>> foo(*mylist)
x=1
y=2
z=3
>>> mydict = {'x':1, 'y':2, 'z':3}
>>> foo(**mydict)
x=1
y=2
z=3

最后,在函数定义中,以 * 打头的参数只能作为最后一个位置参数出现,而以 ** 打头的参数只
能作为最后一个参数出现。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。