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


Posted in Python onFebruary 23, 2021

1. 带默认值的参数

在了解带星号(*)的参数之前,先看下带有默认值的参数,函数定义如下:

>> def defaultValueArgs(common, defaultStr = "default", defaultNum = 0):
    print("Common args", common)
    print("Default String", defaultStr)
    print("Default Number", defaultNum)

(1)带默认值的参数(defaultStr、defaultNum)不传参时的调用:

>> defaultValueArgs("Test")
 
Common args Test
Default String default
Default Number 0

(2)带默认值的参数(defaultStr、defaultNum),调用的时候可以直接传参(如下例中的defaultStr),也可以写成“argsName = value”的形式(如下例中的defaultNum):

>> defaultValueArgs("Test", "Str", defaultNum = 1)
 
Common args Test
Default String Str
Default Number 1
 
>> defaultValueArgs("Test", defaultNum = 1)
 
Common args Test
Default String default
Default Number 1

注意:在函数定义时,第一个带有默认值的参数之后的所有参数都必须有默认值,否则,运行时报错。

>> def defaultValueArgs(common, defaultStr = "default", defaultNum):
    print("Common args", common)
    print("Default String", defaultStr)
    print("Default Number", defaultNum)
    
SyntaxError: non-default argument follows default argument

2.带一个星号(*)的函数参数

带一个参数的函数定义如下:

>> def singalStar(common, *rest):
  print("Common args: ", common)
    print("Rest args: ", rest)

(1)带星号(*)的参数不传参:

>> singalStar("hello")
 
Common args: hello
Rest args: ()

带星号(*)的参数不传参时默认是一个空的元组。

(2)带星号(*)的参数传入多个值时(个数大于或等于函数定义时的参数个数):

>> singalStar("hello", "world", 000)
 
Common args: hello
Rest args: ('world', 0)

不难看出,第二种方式中,星号参数把接收的多个参数合并为一个元组。

(3)当我们直接传元组类型的值给星号参数时:

>> singalStar("hello", ("world", 000))
 
Common args: hello
Rest args: (('world', 0),)

此时,传递的元组值作为了星号参数的元组中的一个元素。

(4)如果我们想把元组作为星号参数的参数值,在元组值前加上" * " 即可。

>> singalStar("hello", *("world", 000))
Common args: hello
Rest args: ('world', 0)

>> singalStar("hello", *("world", 000), "123")
Common args: hello
Rest args: ('world', 0, '123')

3.带两个星号(**)的函数参数

带两个星号(**)的函数定义如下:

>> def doubleStar(common, **double):
    print("Common args: ", common)
    print("Double args: ", double)

(1)双星号(**)参数不传值:

>> doubleStar("hello")
 
Common args: hello
Double args: {}

带双星号(**)的参数不传值时默认是一个空的字典。

(2)双星号(**)参数传入多个参数时(个数大于或等于函数定义时的参数个数):

>> doubleStar("hello", "Test", 24)
TypeError: doubleStar() takes 1 positional argument but 3 were given

>> doubleStar("hello", x = "Test", y = 24)
Common args: hello
Double args: {'x': 'Test', 'y': 24}

可以看到,双星号参数把接收的多个参数合并为一个字典,但与单星号不同的是,此时必须采用默认值传参的 “ args = value ” 的方式,“ = ” 前的字段成了字典的键,“ = ” 后的字段成了字典的值。

(3)如果想把字典作为星号参数的参数值,那么该怎么办呢?与单星号参数类似,在字典值前加上 “ ** ”,同时其后不能添加任何值。

>> doubleStar("hello", {"name": "Test", "age": 24})
TypeError: doubleStar() takes 1 positional argument but 2 were given

>> doubleStar("hello", **{"name": "Test", "age": 24}, {"name": "Test2", "age": 24})
SyntaxError: positional argument follows keyword argument unpacking

>> doubleStar("hello", **{"name": "Test", "age": 24}, **{"name": "Test2", "age": 24})
TypeError: doubleStar() got multiple values for keyword argument 'name'

>> doubleStar("hello", **{"name": "Test", "age": 24})
Common args: hello
Double args: {'name': 'Test', 'age': 24}

4、在有些情况下,单星号函数参数和双星号函数参数是一起使用的:

def singalAndDoubleStar(common, *single, **double):
  print("Common args: ", common)
  print("Single args: ", single)
  print("Double args: ", double)

singalAndDoubleStar("hello")
# Common args: hello
# Single args: ()
# Double args: {}
singalAndDoubleStar("hello", "world", 000)
# Common args: hello
# Single args: ('world', 0)
# Double args: {}
singalAndDoubleStar("hello", "world", 000, {"name": "Test", "age": 24})
# Common args: hello
# Single args: ('world', 0, {'name': 'Test', 'age': 24})
# Double args: {}
singalAndDoubleStar("hello", "world", 000, **{"name": "Test", "age": 24})
# Common args: hello
# Single args: ('world', 0)
# Double args: {'name': 'Test', 'age': 24}
singalAndDoubleStar("hello", ("world", 000), {"name": "Test", "age": 24})
# Common args: hello
# Single args: (('world', 0), {'name': 'Test', 'age': 24})
# Double args: {}
singalAndDoubleStar("hello", *("world", 000), {"name": "Test", "age": 24}) 
# Common args: hello
# Single args: ('world', 0, {'name': 'Test', 'age': 24})
# Double args: {}
singalAndDoubleStar("hello", *("world", 000), **{"name": "Test", "age": 24})
# Common args: hello
# Single args: ('world', 0)
# Double args: {'name': 'Test', 'age': 24}

到此这篇关于Python 带星号(* 或 **)的函数参数详解的文章就介绍到这了,更多相关Python 带星号参数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python常用内置函数总结
Feb 08 Python
Python中的元类编程入门指引
Apr 15 Python
python enumerate函数的使用方法总结
Nov 15 Python
Django自定义过滤器定义与用法示例
Mar 22 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
Apr 23 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
python getopt模块使用实例解析
Dec 18 Python
Python requests模块cookie实例解析
Apr 14 Python
pycharm 实现复制一行的快捷键
Jan 15 Python
详解Python魔法方法之描述符类
May 26 Python
总结三种用 Python 作为小程序后端的方式
May 02 Python
python解决OpenCV在读取显示图片的时候闪退的问题
Feb 23 #Python
关于探究python中sys.argv时遇到的问题详解
Feb 23 #Python
python链表类中获取元素实例方法
Feb 23 #Python
Python之多进程与多线程的使用
Feb 23 #Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 #Python
matplotlib grid()设置网格线外观的实现
Feb 22 #Python
浅析python连接数据库的重要事项
Feb 22 #Python
You might like
Body是什么,该怎么喝出咖啡里的口感
2021/03/03 咖啡文化
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
PHP实现发送微博消息功能完整示例
2019/12/04 PHP
JavaScript 题型问答有答案参考
2010/02/17 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
2016/01/06 Javascript
JavaScript编程中实现对象封装特性的实例讲解
2016/06/24 Javascript
JS实现的幻灯片切换显示效果
2016/09/07 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
2018/07/05 jQuery
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
详解Vue项目部署遇到的问题及解决方案
2019/01/11 Javascript
react同构实践之实现自己的同构模板
2019/03/13 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
使用Python编写一个模仿CPU工作的程序
2015/04/16 Python
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
python简易远程控制单线程版
2018/06/20 Python
Python中使用socks5设置全局代理的方法示例
2020/04/15 Python
python如何将图片转换素描画
2020/09/08 Python
详解css3使用transform出现字体模糊的解决办法
2020/10/16 HTML / CSS
Html5之webcoekt播放JPEG图片流
2020/09/22 HTML / CSS
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
华为c/c++笔试题
2016/01/25 面试题
《蜗牛》教学反思
2014/02/18 职场文书
运动会标语
2014/06/21 职场文书
2016年少先队活动总结
2016/04/06 职场文书