『无为则无心』Python函数 — 26、Python函数参数的传递方式
提示:上一篇文章介绍了Python中函数的基本使用,本篇文章主要说明一下Python函数实参的传递方式。
1、位置参数
位置参数:调用函数时根据函数定义的参数位置来传递参数。
def user_info(name, age, gender):
print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
# 调用函数
user_info('TOM', 20, '男')
注意:传递和定义参数的顺序及个数必须一致。就是将对应位置的实参复制给对应位置的形参,第一个实参赋值给第一个形参,第二个实参赋值给第二个形参,以此类推。
示例:
def user_info(name, age, gender):
print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
# 1.调用函数,传递的参数个数不正确
# 结果:TypeError: user_info() missing 1 required positional argument: 'gender'
user_info('TOM', 20)
# 2.调用函数,传递的参数的顺序不正确
# 不会报错,但输出的内容完全歧义。
# 结果:您的名字是男, 年龄是TOM, 性别是20
user_info('男', 'TOM', 20)
2、关键字参数
可以不按照形参定义的顺序去传递,而直接根据参数名去传递参数。
函数调用,通过键=值
形式加以指定。
可以让函数更加清晰、容易使用,同时也清除了参数的需求。
def user_info(name, age, gender):
print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
# 正确用法
user_info('Rose', age=20, gender='女')
user_info('小明', gender='男', age=16)
# 位置参数必须写在关键字参数的前面
# 结果:SyntaxError: positional argument follows keyword argument
user_info(gender='男', age=16, "孙悟空")
# 位置参数必须写在关键字参数的前面,同时位置参数的顺序也要对应
# 结果:TypeError: user_info() got multiple values for argument 'age'
user_info("孙悟空", '男', age=16)
# 格式正确,但是位置参数的顺序不正确,结果也会产生歧义。
# 结果:您的名字是20, 年龄是孙悟空, 性别是男
user_info(20, "孙悟空", gender='男')
"""
总结:定义参数时,位置参数和关键字参数,尽量统一使用一种。
"""
注意:
- 位置参数和关键字参数可以混合使用。
- 函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。
3、缺省参数(默认参数)
缺省参数也叫默认参数,用于定义函数时,为参数提供默认值,调用函数时可不传该默认参数的值。
提示:所有位置参数必须出现在默认参数前(因为默认参数的格式和关键字参数格式一样,所以都要写在所有参数之后),包括函数定义和调用。
def user_info(name, age, gender='男'):
print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
# 没有为缺省参数传值,表示使用默认值。
user_info('TOM', 20)
# 为缺省参数传值,使用这个值,即修改了默认值。
user_info('Rose', 18, '女')
注意:函数调用时,如果为缺省参数传值则修改默认参数值,否则使用这个默认值。
4、不定长参数(可变参数)
不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可用包裹位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。
(1)包裹位置传递
"""
1.在定义函数时,可以在形参前边加上一个*,这样这个形参将会获取到所有的实参,
它将会将所有的实参保存到一个元组中
2.*args说明:*一定要写,args表示形参,可以自定义名称。
但在实际工作中,一般默认使用*args做为不定长包裹位置传递参数的表示,不做修改。
"""
def user_info(*args):
print(args)
# ('TOM',)
user_info('TOM')
# ('TOM', 18)
user_info('TOM', 18)
# ()
user_info()
注意:传进的所有参数都会被
args
变量收集,它会根据传进的所有的位置实参,合并为一个元组(tuple
),args
是元组类型,这就是包裹位置传递。(这个过程也叫装包或者组包)
小应用:
# 定义一个函数,可以求任意个数字的和
def sum(*nums):
# 定义一个变量,来保存结果
result = 0
# 遍历元组,并将元组中的数进行累加
for n in nums:
result += n
print(result)
sum(123, 456, 789, 10, 20, 30, 40)
注意事项:
# 注意事项1
# 带星号的形参只能有一个
# 带星号的参数,可以和其他参数配合使用
# 第一个参数给a,第二个参数给b,剩下的都保存到c的元组中
def fn2(a, b, *c):
print('a =', a)
print('b =', b)
print('c =', c)
fn2(1, 2, 3, 4, 5)
"""
输出结果:
a = 1
b = 2
c = (3, 4, 5)
"""
# 注意事项2
# 可变参数不是必须写在最后,但是注意,
# 带*的参数后的所有参数,必须以关键字参数的形式传递
# 第一个参数给a,剩下的位置参数给b的元组,c必须使用关键字参数
def fn2(a, *b, c):
print('a =', a)
print('b =', b)
print('c =', c)
# TypeError: fn2() missing 1 required keyword-only argument: 'c'
# fn2(1, 2, 3, 4, 5) # 报错
fn2(1, 2, 3, 4, c=5)
"""
输出结果:
a = 1
b = (2, 3, 4)
c = 5
"""
# 注意事项3
# 所有的位置参数都给a,b和c必须使用关键字参数,
# 且必须写在最后。
def fn2(*a, b, c):
print('a =', a)
print('b =', b)
print('c =', c)
fn2(1, 2, 3, b=4, c=5)
"""
输出结果:
a = (1, 2, 3)
b = 4
c = 5
"""
# 注意事项4
# 如果在形参的开头直接写一个*,
# 则要求我们的所有的参数必须以关键字参数的形式传递。
def fn2(*, a, b, c):
print('a =', a)
print('b =', b)
print('c =', c)
fn2(a=3, b=4, c=5)
"""
输出结果:
a = 3
b = 4
c = 5
"""
# 注意事项5
# *形参只能接收位置参数,而不能接收关键字参数
def fn3(*a):
print('a =', a)
# TypeError: fn3() got an unexpected keyword argument 'a'
fn3(a=3, b=4, c=5)
(2)包裹关键字传递
"""
**kwargs说明:**一定要写,args表示形参,可以自定义名称。
但在实际工作中,一般默认使用**kwargs做为不定长包裹关键字传递参数的表示,不做修改。
"""
# 收集所有关键字参数,它会将这些参数统一保存到一个字典中返回。
# 字典的key就是参数的名字,字典的value就是参数的值
def user_info(**kwargs):
print(kwargs)
# {'name': 'TOM', 'age': 18, 'id': 110}
# 关键字不能加引号,应为关键字对应的是形参。
user_info(name='TOM', age=18, id=110)
# 包裹关键字传递只能有一个,并且必须写在所有参数的最后
# 实参可以不按顺序传递
def fn3(b, c, **a):
print('a =', a, type(a))
print('b =', b)
print('c =', c)
fn3(e=10, b=1, d=2, c=3, f=20)
"""
输出结果:
a = {'e': 10, 'd': 2, 'f': 20} <class 'dict'>
b = 1
c = 3
"""
综上:无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程(组包简单的说,就是收集分散的参数,返回一个整体数据)。关于组包对应就是拆包,在之前的文章【Python元组】中有介绍,可以对应的查看。
5、位置参数、默认参数、可变参数的混合使用
参数定义与调用顺序的基本原则是:位置参数,默认参数,包裹位置,包裹关键字。(定义和调用都应遵循)
提示:默认参数与包裹位置参数可以根据需求进行位置调换。
def user_info(name, age, sex=1, *args, **kargs):
print name, age, sex, args, kargs
user_info('tanggu', 25, 2, 'music', 'sport', class=2)
# 输出结果
# tanggu 25 1 ('music', 'sport') {'class'=2}
6、拓展:参数解包
关于组包对应就是拆包,在之前的文章【Python元组】中有介绍,可以对应的查看。
(1)通过包裹位置对一个元组进行解包
操作方式:使用*
号。
如下示例:
# 参数的解包(拆包)
def fn4(a, b, c):
print('a =', a)
print('b =', b)
print('c =', c)
# 创建一个元组
t = (10, 20, 30)
# 我们直接传递t,会报错
# TypeError: fn4() missing 2 required positional arguments: 'b' and 'c'
# fn4(t)
# 而以前我们是这样拆包的
# fn4(t[0], t[1], t[2])
"""
输出结果:
a = 10
b = 20
c = 30
"""
# *号拆包
# 传递实参时,也可以在序列类型的参数前添加星号,
# #这样他会自动将序列中的元素依次作为参数传递。
# 这里要求序列中元素的个数必须和形参的个数的一致
fn4(*t)
"""
输出结果:
a = 10
b = 20
c = 30
"""
(2)通过包裹关键字对一个字典进行解包
操作方式:使用**
号。
如下示例:
# 参数的解包(拆包)
def fn4(a, b, c):
print('a =', a)
print('b =', b)
print('c =', c)
# 创建一个字典
d = {'a': 100, 'b': 200, 'c': 300}
# 通过 **来对一个字典进行解包操作
# 字典中的key要和函数的形参一一对应。
fn4(**d)
"""
输出结果:
a = 100
b = 200
c = 300
"""
『无为则无心』Python函数 — 26、Python函数参数的传递方式的更多相关文章
- 『无为则无心』Python函数 — 25、Python中的函数
目录 1.函数的使用 (1)定义函数 (2)调用函数 (3)使用函数的注意事项 2.函数的参数 3.实参的类型 Python函数的说明: Python中函数的应用非常广泛,前面章节中我们已经接触过多个 ...
- 『无为则无心』Python函数 — 27、Python函数的返回值
目录 1.返回值概念 2.return关键字的作用 3.返回值可以返回的数据类型 4.函数如何返回多个值 5.fn5 和 fn5()的区别 6.总结: 1.返回值概念 例如:我们去超市购物,比如买饮料 ...
- 『无为则无心』Python函数 — 28、Python函数的简单应用
目录 1.函数嵌套调用 2.Python函数的简单应用 (1)打印线条 (2)函数计算 (3)打印图形 3.函数的说明文档 (1)函数的说明文档的作用 (2)函数说明文档的语法 (3)查看函数的说明文 ...
- 『无为则无心』Python函数 — 29、Python变量和参数传递
目录 1.Python的变量 (1)Python变量不能独立存在 (2)变量是内存中数据的引用 (3)注意点 2.了解变量的引用 3.Python的参数传递(重点) (1)示例 (2)结论 (3)总结 ...
- 『无为则无心』Python函数 — 30、Python变量的作用域
目录 1.作用于的概念 2.局部变量 3.全局变量 4.变量的查找 5.作用域中可变数据类型变量 6.多函数程序执行流程 1.作用于的概念 变量作用域指的是变量生效的范围,在Python中一共有两种作 ...
- 『无为则无心』Python函数 — 31、命名空间(namespace)
目录 1.什么是命名空间 2.三种命名空间 3.命名空间查找顺序 4.命名空间的生命周期 5.如何获取当前的命名空间 1.什么是命名空间 命名空间指的是变量存储的位置,每一个变量都需要存储到指定的命名 ...
- 『无为则无心』Python函数 — 32、递归
目录 1.什么叫递归函数 2.递归的应用场景 3.递归的特点 4.应用:3以内数字累加和 5.应用:阶乘 6.总结 1.什么叫递归函数 Python中,在函数内部,可以调用其他函数.如果一个函数在内部 ...
- 『无为则无心』Python函数 — 33、高阶函数
目录 1.高阶函数的定义 2.体验高阶函数 3.内置高阶函数 (1)map()函数 (2)reduce()函数 (3)filter()函数 1.高阶函数的定义 把函数作为参数传入(把一个函数作为另外一 ...
- 『无为则无心』Python面向对象 — 54、重写和super()函数
目录 1.重写 2.super()函数 方式一 方式二 __mro__内置类属性说明 1.重写 在子类中如果有和父类同名的方法,则通过子类实例去调用该方法时,会调用子类中的该方法而不是父类的方法,这个 ...
随机推荐
- 计划任务 at & crond tbc
一次性任务 at 工具 由包 at 提供 依赖与atd服务,需要启动才能实现at任务 at队列存放在/var/spool/at目录中 执行任务时PATH变量的值和当前定义任务的用户身份一致 作业执行命 ...
- 【补档_STM32单片机】脉搏波采集显示硬件设计
一.脉搏波简介 脉搏一般情况下指的都是动脉脉搏.每分钟的脉搏次数称为脉率,正常情况下与心率是一致的.心脏的一次收缩和舒张成为一个心动周期.在每个心动周期内,心室的收缩和舒张会引起脉内压力的周期性波 ...
- VMware vRealize Suite 8.4 发布 - 多云环境的云计算管理解决方案
VMware vRealize Suite 8.4.0, Release Date: 2021-04-15 概述 VMware vRealize Suite 是一种多云环境的云计算管理解决方案,为 I ...
- PTH的几种食用姿势
PTH PTH(pass the hash)也叫做hash传递.在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过NTLM Hash(mimikatz或其他手段抓取到的密码hash)访问远 ...
- JVM学习心得—JVM内存模型(个人整理,请勿转载)
一.运行时数据区域 线程私有的:程序计数器+虚拟机栈+本地方法栈 线程共享的:堆+方法区(运行时常量池)+直接内存(非运行时数据区的一部分) *JDK1.8后将方法区废除,新增元空间. 1.1 程序计 ...
- 华为4D成像雷达、智能驾驶平台MDC 810
华为4D成像雷达.智能驾驶平台MDC 810 2020年10月底,华为发布了HI品牌,在今年2021年上海国际车展前夕,华为以 "专新致智" 为主题,举办HI新品发布会,发布了包括 ...
- 华为MDC自动驾驶
华为MDC自动驾驶 智能驾驶汽车中,包含四个核心子系统:传感器.计算平台.执行器与应用算法,华为MDC( Mobile Data Center: 移动数据中心)定位为智能驾驶的计算平台.此平台集成了华 ...
- MySQL必知必会笔记——查询的基础知识
查询基础知识 第七章 数据过滤 组合where子句 MySQL允许给出多个WHERE子句.这些子 句可以两种方式使用:以AND子句的方式或OR子句的方式使用. AND操作符 可使用AND操作符给WHE ...
- Spring Cloud09: Config 配置中心
一.概述 什么是配置中心呢,在基于微服务的分布式系统中,每个业务模块都可以拆分成独立自主的服务,由多个请求来协助完成某个需求,那么在某一具体的业务场景中,某一个请求需要调用多个服务来完成,那么就存在一 ...
- mybatis——一级缓存、二级缓存
一.Mybatis缓存 ● MyBatis包含一个非常强大的查询緩存特性,它可以非常方便地定制和配置缓存.绶存可以极大的提升查询效率. ● MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存 ...