• 售前

  • 售后

热门帖子
入门百科

Python 带星号(* 或 **)的函数参数详解

[复制链接]
禾口王君卤 显示全部楼层 发表于 2021-10-25 19:58:12 |阅读模式 打印 上一主题 下一主题
1. 带默认值的参数


在相识带星号(*)的参数之前,先看下带有默认值的参数,函数定义如下:
  1. >> def defaultValueArgs(common, defaultStr = "default", defaultNum = 0):
  2.     print("Common args", common)
  3.     print("Default String", defaultStr)
  4.     print("Default Number", defaultNum)
复制代码
(1)带默认值的参数(defaultStr、defaultNum)不传参时的调用:
  1. >> defaultValueArgs("Test")
  2. Common args Test
  3. Default String default
  4. Default Number 0
复制代码
(2)带默认值的参数(defaultStr、defaultNum),调用的时间可以直接传参(如下例中的defaultStr),也可以写成“argsName = value”的情势(如下例中的defaultNum):
  1. >> defaultValueArgs("Test", "Str", defaultNum = 1)
  2. Common args Test
  3. Default String Str
  4. Default Number 1
  5. >> defaultValueArgs("Test", defaultNum = 1)
  6. Common args Test
  7. Default String default
  8. Default Number 1
复制代码
注意:在函数定义时,第一个带有默认值的参数之后的全部参数都必须有默认值,否则,运行时报错。
  1. >> def defaultValueArgs(common, defaultStr = "default", defaultNum):
  2.     print("Common args", common)
  3.     print("Default String", defaultStr)
  4.     print("Default Number", defaultNum)
  5.    
  6. SyntaxError: non-default argument follows default argument
复制代码
2.带一个星号(*)的函数参数


带一个参数的函数定义如下:
  1. >> def singalStar(common, *rest):
  2.   print("Common args: ", common)
  3.     print("Rest args: ", rest)
复制代码
(1)带星号(*)的参数不传参:
  1. >> singalStar("hello")
  2. Common args: hello
  3. Rest args: ()
复制代码
带星号(*)的参数不传参时默认是一个空的元组。
(2)带星号(*)的参数传入多个值时(个数大于或便是函数定义时的参数个数):
  1. >> singalStar("hello", "world", 000)
  2. Common args: hello
  3. Rest args: ('world', 0)
复制代码
不难看出,第二种方式中,星号参数把接收的多个参数归并为一个元组。
(3)当我们直接传元组范例的值给星号参数时:
  1. >> singalStar("hello", ("world", 000))
  2. Common args: hello
  3. Rest args: (('world', 0),)
复制代码
此时,通报的元组值作为了星号参数的元组中的一个元素。
(4)假如我们想把元组作为星号参数的参数值,在元组值前加上" * " 即可。
  1. >> singalStar("hello", *("world", 000))
  2. Common args: hello
  3. Rest args: ('world', 0)
  4. >> singalStar("hello", *("world", 000), "123")
  5. Common args: hello
  6. Rest args: ('world', 0, '123')
复制代码
3.带两个星号(**)的函数参数


带两个星号(**)的函数定义如下:
  1. >> def doubleStar(common, **double):
  2.     print("Common args: ", common)
  3.     print("Double args: ", double)
复制代码
(1)双星号(**)参数不传值:
  1. >> doubleStar("hello")
  2. Common args: hello
  3. Double args: {}
复制代码
带双星号(**)的参数不传值时默认是一个空的字典。
(2)双星号(**)参数传入多个参数时(个数大于或便是函数定义时的参数个数):
  1. >> doubleStar("hello", "Test", 24)
  2. TypeError: doubleStar() takes 1 positional argument but 3 were given
  3. >> doubleStar("hello", x = "Test", y = 24)
  4. Common args: hello
  5. Double args: {'x': 'Test', 'y': 24}
复制代码
可以看到,双星号参数把接收的多个参数归并为一个字典,但与单星号差异的是,此时必须采用默认值传参的 “ args = value ” 的方式,“ = ” 前的字段成了字典的键,“ = ” 后的字段成了字典的值。
(3)假如想把字典作为星号参数的参数值,那么该怎么办呢?与单星号参数类似,在字典值前加上 “ ** ”,同时厥后不能添加任何值。
  1. >> doubleStar("hello", {"name": "Test", "age": 24})
  2. TypeError: doubleStar() takes 1 positional argument but 2 were given
  3. >> doubleStar("hello", **{"name": "Test", "age": 24}, {"name": "Test2", "age": 24})
  4. SyntaxError: positional argument follows keyword argument unpacking
  5. >> doubleStar("hello", **{"name": "Test", "age": 24}, **{"name": "Test2", "age": 24})
  6. TypeError: doubleStar() got multiple values for keyword argument 'name'
  7. >> doubleStar("hello", **{"name": "Test", "age": 24})
  8. Common args: hello
  9. Double args: {'name': 'Test', 'age': 24}
复制代码
4、在有些情况下,单星号函数参数和双星号函数参数是一起利用的:

  1. def singalAndDoubleStar(common, *single, **double):
  2.   print("Common args: ", common)
  3.   print("Single args: ", single)
  4.   print("Double args: ", double)
  5. singalAndDoubleStar("hello")
  6. # Common args: hello
  7. # Single args: ()
  8. # Double args: {}
  9. singalAndDoubleStar("hello", "world", 000)
  10. # Common args: hello
  11. # Single args: ('world', 0)
  12. # Double args: {}
  13. singalAndDoubleStar("hello", "world", 000, {"name": "Test", "age": 24})
  14. # Common args: hello
  15. # Single args: ('world', 0, {'name': 'Test', 'age': 24})
  16. # Double args: {}
  17. singalAndDoubleStar("hello", "world", 000, **{"name": "Test", "age": 24})
  18. # Common args: hello
  19. # Single args: ('world', 0)
  20. # Double args: {'name': 'Test', 'age': 24}
  21. singalAndDoubleStar("hello", ("world", 000), {"name": "Test", "age": 24})
  22. # Common args: hello
  23. # Single args: (('world', 0), {'name': 'Test', 'age': 24})
  24. # Double args: {}
  25. singalAndDoubleStar("hello", *("world", 000), {"name": "Test", "age": 24})
  26. # Common args: hello
  27. # Single args: ('world', 0, {'name': 'Test', 'age': 24})
  28. # Double args: {}
  29. singalAndDoubleStar("hello", *("world", 000), **{"name": "Test", "age": 24})
  30. # Common args: hello
  31. # Single args: ('world', 0)
  32. # Double args: {'name': 'Test', 'age': 24}
复制代码
到此这篇关于Python 带星号(* 或 **)的函数参数详解的文章就介绍到这了,更多相干Python 带星号参数内容请搜索草根技术分享从前的文章或继续欣赏下面的相干文章希望各人以后多多支持草根技术分享!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作