一、函数非固定参数

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的更多相关文章

  1. 函数和常用模块【day04】:函数的非固定参数(三)

    本节内容 1.概述 2.默认参数 3.参数组 4.总结 一.概述 在上一篇博客中我已经写了,位置参数和关键字参数,下面我们来谈谈默认参数和参数组 二.默认参数 默认参数指的是,我们在传参之前,先给参数 ...

  2. 【python】-- 函数非固定参数,返回值(return)

    函数非固定参数 1.默认参数: 代码如下: def information_register(name,age,country,sex): print("----注册信息------&quo ...

  3. 非固定参数:*args和 **kwargs

    先看一个固定参数栗子: def func1(x, args): print(x, args) func1(1,22) ====================1 22 ================ ...

  4. python学习第二十六天非固定参数几种情况

    python函数参数传递,位置参数,默认参数,关键词参数,最后介绍一个非固定参数,就可以向函数传递一个列表,元组,字典,具体看看用法 1,有一个* 号的参数情况 def goos_stu(id,*us ...

  5. 带有“非简单参数”的函数为什么不能包含 "use strict" 指令

    非简单参数就是 ES6 里新加的参数语法,包括:1.默认参数值.2.剩余参数.3.参数解构.本文接下来要讲的就是 ES7 为什么禁止在使用了非简单参数的函数里使用 "use strict&q ...

  6. python基础学习Day10 函数形参的动态参数、*args **kwargs 命名空间 global 与 nonlocal

    一.函数形参的动态参数 原因:为了拓展,对于实参数量不固定,故需要万能参数,即动态参数, *args   **kwargs # def sum1(*args): # 在函数定义时,在*位置参数,聚合. ...

  7. python的函数介绍 位置参数 关键字参数 默认参数 参数组 *args **kwargs

    1.数学意义的函数与python中的函数 数学意义的函数 y = 2*3+1 x =3 y =7 x是自变量,y是因变量 2.python中定义函数的方法 一个函数往往都是为了完成一个特定的功能而存在 ...

  8. 常量函数、常量引用参数、常量引用返回值[C++]

    1. 关于常量引用正像在C语言中使用指针一样,C++中通常使用引用 有一个函数... foo()并且这个函数返回一个引用...... & foo()...., 一个指向位图(Bitmap)的引 ...

  9. python函数 位置参数,关键字参数,可变参数优先级

    def fun(arg,args=1,*arg,**keywords): python 一共有这四类参数,第一类最常见,不用多说,第二类,关键字参数,python能通过关键字找到参数,python函数 ...

随机推荐

  1. JS规范2

    百度SS Javascript编码规范 1.变量.方法命名必须匹配正则:/^[$_a-zA-Z]\w*$/ /** * 虽然Javascript引擎支持多种格式命名的变量, * 比如下面这样的变量,J ...

  2. 使用Identity Server 4建立Authorization Server (6) - js(angular5) 客户端

    预备知识: http://www.cnblogs.com/cgzl/p/7746496.html 第一部分: http://www.cnblogs.com/cgzl/p/7780559.html 第二 ...

  3. [最短路]信使(msner)

    [题目描述] 战争时期,前线有n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系.信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位).指挥部设在第一个哨所.当指挥部下达一个命令后 ...

  4. windows下安装和redis主从配置(通过哨兵控制主从切换)

    首先自己先得了解什么是redis,这里就不详做介绍什么是redis了,这篇文章主要讲的是怎么样配置 redis怎样配置主从关系和哨兵控制主从服务器的配置以及应用,就当是给自己记笔记吧! 1.下载red ...

  5. 34.Linux-printk分析、使用prink调试驱动

    本节学习目的 1)分析printk()函数 2)使用prink()调试驱动 1.在驱动调试中,使用printk(),是最简单,最方便的办法 当uboot的命令行里的“console=tty1”时,表示 ...

  6. 【转】npm包管理器那些事

    原文链接:http://www.cnblogs.com/shuoer/p/7782125.html npm包管理器那些事! 今天和朋友针对npm包全局安装和本地项目安装这个梗展开的激烈的讨论,故此做一 ...

  7. Office 365系列 (1)概览:完整的云中Office

    Office365(以下简称O365)是一个集Office,企业邮箱,日历,日程管理,音视频会议 ,企业网盘 ,企业协作平台为一体的,旨在提高团队办公效率,减少基础设施投资和IT运维压力的解决方案.在 ...

  8. Nginx的知识分享,继续上次的分享

    5. Nginx配置文件精讲二 #这里为后端服务器wugk应用集群配置,根据后端实际情况修改即可,tdt_wugk为负载均衡名称,可以任意指定 #但必须跟vhosts.conf虚拟主机的pass段一致 ...

  9. 《Linux命令行与shell脚本编程大全》第二十一章 sed进阶

    本章介绍一些sed编辑器提供的高级特性. 21.1 多行命令 按照之前的知识,所有的sed编辑器命令都是针对单行数据执行操作的. 在sed编辑器读取数据流时,它会基于换行符的位置将数据分成行,一次处理 ...

  10. Unity3d的模型自动导入帧数表

    开发中经常需要,对美术模型进行一些处理.(以fbx为例) 例如,需要把动作的名字.start和end加入animations的clips. 如果手动操作,就是在模型的Inspector窗口,一个动作点 ...