函数的非固定参数-Day3
一、函数非固定参数
1、默认函数,我们在传参之前,选给参数指定一个默认的值。默认参数特点是非必须传递的。
- def test(x,y=2):
- print(x)
- print(y)
- print("------没有给默认参数传值------")
- test(1)
- print("------给默认参数传位置参数------")
- test(1,3)
- print("------给默认参数传关键字参数------")
- test(1,y=3)
- #返回值:
- ------没有给默认参数传值------
- 1
- 2
- ------给默认参数传位置参数------
- 1
- 3
- ------给默认参数传关键字参数------
- 1
- 3
默认参数用途:
- 安装默认软件(def test(x,soft=True))
- 传递默认参数值(定义mysql的默认端口号:def count(host.port=3306))
二、参数组
之前我们传参数,都是传一个固定参数,不能多也不能少,但是如果说我们需要非固定参数怎么办呢?于是衍生出了,一下以下两种传参方式:
- *args:非固定位置参数传参,接收N个位置参数,转换成元组的方式
- **kwargs:非固定关键字传参,接收N个位置参数,转换成字典的方式
1、非固定位置参数传参
(1)非固定位置参数可传参类型
- def test(*args): #非固定位置参数传参,形参必须以*开头,args参数名可自定义,args为规范
- print(args)
- print("------不传入任何值------")
- test()
- print("------传入多个位置参数------")
- test(1,2,3,4,5)
- print("------传入列表------")
- test([1,2,3,4,5])
- print("------传入列表前加*------")
- test(*[1,2,3,4,5])
- #返回值
- ------不传入任何值------
- () #什么都不输入,输出空元组
- ------传入位置参数------
- (1, 2, 3, 4, 5) #输入多个位置参数,输出元组
- ------传入列表------
- ([1, 2, 3, 4, 5],) #输入列表,输出元组中的一个元素
- ------传入列表前加*------
- (1, 2, 3, 4, 5) #输入列表前加*,输入元组
(2)、位置参数和非固定位置参数混用
- def test(x,*args):
- print(x) #位置参数
- print(args) #非固定参数
- test(1,2,3,4,5)
- #返回值
- 1
- (2, 3, 4, 5)
从上面看出,第一个参数,被当做位置参数,剩下的被当做非固定位置参数
(3)、关键字参数和非固定位置参数混用
- def test(x,*args):
- print(x)
- print(args)
- test(x=1,2,3,4,5)
- #返回值
- Traceback (most recent call last):
- File "E:/python/day3/func_test7.py", line 25, in <module>
- test(1,2,3,4,x=5)
- TypeError: test() got multiple values for argument 'x'
很显然报错,因为x=1是关键字参数,*args是位置参数,而关键字参数不能在位置参数前面,所以报错
2、非固定关键字参数传参
(1)非固定关键字参数传参类型
- def test(**kwargs):
- print(kwargs)
- print("------不传入任何值------")
- test()
- print("------传入多个关键字参数------")
- test(name='wesley', age=24)
- print("------传入字典------")
- test(**{'name': 'wesley','age': 24}) # 传入字典时,一定要在字典前面加**,否则就会报错
- #返回值
- ------不传入任何值------
- {}
- ------传入多个关键字参数------
- {'name': 'wesley', 'age': 24}
- ------传入字典------
- {'name': 'wesley', 'age': 24}
然而,为什么非固定位置参数不需要加**,非固定关键字参数必须要加**,不加会怎么样呢?
- def test(**kwargs):
- print(kwargs)
- test({'name':'wesley','age':24})
- #返回值:
- Traceback (most recent call last):
- File "E:/python/day3/funx_test6.py", line 9, in <module>
- test({'name':'wesley','age':24})
- TypeError: test() takes 0 positional arguments but 1 was given
因为传入的字典被当做位置参数,所以报类型错诶,所以千万要记住:传字典,加**
(2)位置参数和非固定关键字参数混用
- def test(name,**kwargs):
- print(name)
- print(kwargs)
- print("-------1个位置参数--------")
- test("wesley")
- print("-------1个位置参数,两个关键字参数--------")
- test("wesley",age=24,sex='M')
- print("--------3个关键字参数--------")
- test(name="wesley",age=24,sex='M')
- #返回值
- wesley
- {}
- -------1个位置参数,两个关键字参数--------
- wesley
- {'age': 24, 'sex': 'M'}
- --------3个关键字参数--------
- wesley
- {'age': 24, 'sex': 'M'}
(3)位置参数、关键字参数和非固定关键字参数混合
- def test(name,age=24,**kwargs):
- print(name)
- print(age)
- print(kwargs) #参数组一定要放在最后
- print("-------age默认参数--------")
- test("wesley",sex='M',hobby='BMW')
- print("-------age位置参数--------")
- test("wesley",24,sex='M',hobby='BMW')
- print("-------age关键字参数--------")
- test(name="wesley",sex='M',hobby='BMW',age=24) #age关键字参数,放在前后没有影响
- #返回值
- -------age默认参数--------
- wesley
- 24
- {'sex': 'M', 'hobby': 'BMW'}
- -------age位置参数--------
- wesley
- 24
- {'sex': 'M', 'hobby': 'BMW'}
- -------age关键字参数--------
- wesley
- 24
- {'sex': 'M', 'hobby': 'BMW'}
注:如果遇到一个关键字传参和非固定关键字,前后方的位置是不影响传参的,但是我们一般还是按顺序来。
(4)位置参数、关键字参数、非固定位置参数和非固定关键字参数
- def test(name,age=24,*args,**kwargs):
- print(name)
- print(age)
- print(args)
- print(kwargs)
- print("-------位置参数、非固定位置参数、非固定关键字参数--------")
- test("wesley",1,2,3,sex='M',hobby='BMW')
- print("-------位置参数、非固定位置参数、非固定关键字参数--------")
- test("wesley",24,*[1,2,3],**{'sex':'M','hobby':'BMW'})
- #返回值
- -------位置参数、关键字参数、非固定位置参数、非固定关键字参数--------
- wesley #name位置参数
- 1 #age位置参数
- (2, 3) #非固定位置参数,已转成成元组
- {'hobby': 'BMW', 'sex': 'M'} #非固定关键字参数,已转换成字典
- -------位置参数、非固定位置参数、非固定关键字参数--------
- wesley
- 24
- (1, 2, 3) #以列表的方式传入,列表前面加*
- {'hobby': 'BMW', 'sex': 'M'} #以字典的方式传入,字典前面加**
上面的age传参传的是位置参数,那能否传入关键字参数呢?
- def test(name,age=24,*args,**kwargs):
- print(name)
- print(age)
- print(args)
- print(kwargs)
- test("wesley",age=25,1,2,3,sex='M',hobby='BMW')
- #返回值
- File "E:/python/day3/func_test7.py", line 13
- test("wesley",age=25,1,2,3,sex='M',hobby='BMW')
- ^
- SyntaxError: positional argument follows keyword argument #语法错误,位置参数在关键字参数前面
看来不可以的,为什么?因为age=19是关键字参数,而后面的*args是非固定位置参数,不管*args传入几个字,它的本质都是位置参数,上面我们提到关键字参数是不能在位置参数前,所以报错了
看来上面的情况不可以的,那能不能非固定关键字参数在非固定位置参数前面呢?
- def test(name,age=24,*args,**kwargs):
- print(name)
- print(age)
- print(args)
- print(kwargs)
- test("wesley",25,sex='M',hobby='BMW',1,2,3)
- #返回值
- File "E:/python/day3/func_test7.py", line 13
- test("wesley",25,sex='M',hobby='BMW',1,2,3)
- ^
- SyntaxError: positional argument follows keyword argument #语法错误,关键字参数在位置参数前面
非固定关键字参数,本质也是关键字参数,是不能放在非固定位置参数的前面
三、总结
- 参数分为:默认参数、位置参数、关键字参数、非固定位置参数、非固定关键字参数
- 位置参数之前传参,位置不能调换,否则值也会跟着调换;且位置参数多一个或少一个都是不可以的
- 关键字参数是不能放在位置参数前面的,且不用考虑位置的前面问题
- 函数传参的位置依次是:位置参数、默认参数(调用位置参数的值)、非固定位置参数、关键字参数、非固定关键字参数
函数的非固定参数-Day3的更多相关文章
- 函数和常用模块【day04】:函数的非固定参数(三)
本节内容 1.概述 2.默认参数 3.参数组 4.总结 一.概述 在上一篇博客中我已经写了,位置参数和关键字参数,下面我们来谈谈默认参数和参数组 二.默认参数 默认参数指的是,我们在传参之前,先给参数 ...
- 【python】-- 函数非固定参数,返回值(return)
函数非固定参数 1.默认参数: 代码如下: def information_register(name,age,country,sex): print("----注册信息------&quo ...
- 非固定参数:*args和 **kwargs
先看一个固定参数栗子: def func1(x, args): print(x, args) func1(1,22) ====================1 22 ================ ...
- python学习第二十六天非固定参数几种情况
python函数参数传递,位置参数,默认参数,关键词参数,最后介绍一个非固定参数,就可以向函数传递一个列表,元组,字典,具体看看用法 1,有一个* 号的参数情况 def goos_stu(id,*us ...
- 带有“非简单参数”的函数为什么不能包含 "use strict" 指令
非简单参数就是 ES6 里新加的参数语法,包括:1.默认参数值.2.剩余参数.3.参数解构.本文接下来要讲的就是 ES7 为什么禁止在使用了非简单参数的函数里使用 "use strict&q ...
- python基础学习Day10 函数形参的动态参数、*args **kwargs 命名空间 global 与 nonlocal
一.函数形参的动态参数 原因:为了拓展,对于实参数量不固定,故需要万能参数,即动态参数, *args **kwargs # def sum1(*args): # 在函数定义时,在*位置参数,聚合. ...
- python的函数介绍 位置参数 关键字参数 默认参数 参数组 *args **kwargs
1.数学意义的函数与python中的函数 数学意义的函数 y = 2*3+1 x =3 y =7 x是自变量,y是因变量 2.python中定义函数的方法 一个函数往往都是为了完成一个特定的功能而存在 ...
- 常量函数、常量引用参数、常量引用返回值[C++]
1. 关于常量引用正像在C语言中使用指针一样,C++中通常使用引用 有一个函数... foo()并且这个函数返回一个引用...... & foo()...., 一个指向位图(Bitmap)的引 ...
- python函数 位置参数,关键字参数,可变参数优先级
def fun(arg,args=1,*arg,**keywords): python 一共有这四类参数,第一类最常见,不用多说,第二类,关键字参数,python能通过关键字找到参数,python函数 ...
随机推荐
- border-sizing属性
box-sizing属性可以为三个值之一:content-box(default),border-box,padding-box. content-box,border和padding不计算入widt ...
- 五、Hadoop学习笔记————调优之硬件选择
ResourceManageer服务器需要选择性能较好的 若有1TB数据,每天增量为10GB,则需要预留17.8TB,*3是因为有三分备份,*1.3是因为还需要预留出空间给操作系统等等 若集群在三十台 ...
- js-引用类型-Array
1.数组的操作方法 <html> <meta http-equiv="content-type" charset="utf-8" /> ...
- redis 梳理笔记(二)
一.redis 分布式 redis+keepalived (虚ip漂移) redis 100秒平均写入并发 3.6w (写入与keepalived监控程序无关) .redis 数据库内存已占有80% ...
- js学习笔记(延时器)
//setTimeout() //功能:设置一个延时器 //语法:var timer = window.setTimeout(code,millisec); //参数: code:是任何合 ...
- 老男孩Python视频教程:第一周
认识和尝试Python 备注:老男孩Python视频教程,视频来自网络,在此分享,侵删 对我来说,第一周视频主要解答了以下疑问: 1. Python的三大特点是什么? 答:解释型.动态类型(运行期间才 ...
- 51Nod 1110 距离之和最小 V3 中位数 思维
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i].点P到点P[i]的带权距离 = 实际距离 ...
- ssm开发关于web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" ...
- labview生成可执行文件
labview生成可执行文件可以分为两种情况. 第一种,是电脑中有labview软件开发环境的情况 第二种,是电脑中没有安装labview软件开发环境 下面是一个简单的labview代码: 程序解释: ...
- C# DropDownList 绑定枚举类
第一种 DropDownList_Franchiser_Type.DataSource = ListTypeForEnum(); DropDownList_Franchiser_Type.DataVa ...