函数、可变参数、keyword-only参数、实参解构
函数的数学定义:y=f(x) ,y是x的函数,x是自变量。y=f(x0, x1, ..., xn)
python中的函数: 由函数名称、参数列表、和若干语句组成的语句块构成,完成一定的功能,是组织代码的最小单元。
函数的作用
- 结构化编程对代码的最基本的封装,一般按照功能组织一段代码
- 封装的目的为了复用,减少冗余代码
- 代码更加简洁美观、可读易懂
函数的定义
def 函数名(参数列表):
函数体(代码块)
[return 返回值]
- 函数名就是标识符,遵守变量命名规范
- 函数体必须缩进
- 如果没有return语句,默认返回None
- 定义中的参数列表称为形参,只是一种符号表达
函数调用
- 函数定义只是声明了一个函数,它不会被执行,需要被调用
- 调用的方式,就是函数名加上小括号,括号内写上参数
- 调用时写的参数是实参,是实际传入的值
def add(x, y):
result = x + y
return result
res = add(4, 5)
print(res)
- 计算的结果,通过返回值返回
- 调用时通过函数名add加2个参数,返回值可使用变量接收
- 定义需要在调用前,否则抛NameError异常
- 函数是可调用的对象,callable()
print(callable(add))
# True
调用时传入的参数要和定义的参数个数相匹配(可变参数除外)
形参可以分为默认参数和非默认参数,默认参数必须在非默认参数后面
实参可以分为位置参数和关键字参数,位置参数是按位置对应的,关键字参数必须在位置参数后面
位置参数
- def f(x, y, z) 调用使用f(1, 3, 5)
- 按照参数定义顺序传入实参
关键字参数
- def f(x, y, z) 调用使用f(x=1, y=3, z=5)
- 使用形参的名字来传入实参的方式,如果使用了形参名字,那么传参顺序就可以和定义顺序不同
函数参数的默认值
- 定义时在形参后跟上一个值
- 函数调用时,没有传递的参数将使用默认值
- 可以简化函数调用
def add(x=4, y=5):
result = x + y
return result
# 测试调用
- add(6, 10)
- add(6, y=7)
- add(x=5, 6) # 关键字参数必须在位置参数后面
- add(x=5)
- add(y=7)
- add()
- add(x=5, y=6)
- add(y=6, x=5)
可变参数
- 函数定义时可以使用*args和**kwargs收集多个传递进来的实参
- 一个形参可以匹配任意多个参数,包括0个
- 可变位置参数,*args,收集多个实参的位置参数为一个元祖
- 可变关键字参数,**kwargs,收集多个实参的关键字参数为一个字典,在整个形参列表的最后
- 可混合使用
def add(*args):
sum = 0
print(type(args))
for i in args:
sum += i
return sum
print(add(3, 6, 9))
# <class 'tuple'>
# 18
def func(x, y, *args, **kwargs):
print(x)
print(y)
print(args)
print(kwargs)
func(3, 5, 7, 9, a=1, b='keithTt')
func(3, 5)
func(3, 5, 7)
func(3, 5, a=1, b='keithTt')
func(3, 5, x=7, a=1, b='keithTt') # 错误,这里3传递给了x,又传递x=7将抛出TypeError参数获得多个值异常
keyword-only参数
- 在一个星号参数后、或者一个可变位置参数后的形参
- 函数调用时必须使用关键字参数传参
- 调用时如果没有默认值,则必须传递实参,否则将抛出TypeError缺少keyword-only参数异常
def func(*args, x=1, y, **kwargs):
# def func(*, x=1, y, **kwargs):
print(x)
print(y)
print(args)
print(kwargs)
func(3, 5, x=3, y=5, b='KeithTt')
总的来说,函数定义时的形参顺序: 普通参数、默认参数、可变位置参数、keyword-only参数(可设置默认值)、可变关键字参数。
实参解构
- 传递实参时,可以使用*和**解构可迭代对象,提取出序列中的所有元素
- 非mapping类型序列使用*解构
- mapping类型(字典)使用**解构,如果使用*解构字典将提取出字典中元素的key
# 可变位置参数解构
def add(*args):
return sum(args)
print(add(1,2,3))
print(add(*[1,2,3]))
print(add(*range(10)))
print(*range(10))
# 0 1 2 3 4 5 6 7 8 9
# 可变关键字参数解构
def city_temp(**kwargs):
for k,v in kwargs.items():
print(k,':',v)
d = {'bj':'32c','xm':'23c','sh':'31c'}
city_temp(**d)
# bj : 32c
# xm : 23c
# sh : 31c
编写一个函数,能够接受至少2个参数,返回最小值和最大值
def max_min(*args):
# print(args)
max_ = max(args)
min_ = min(args)
return min_,max_
print(max_min(*range(10)))
# (0, 9)
函数、可变参数、keyword-only参数、实参解构的更多相关文章
- (5)ES6解构赋值-函数篇
函数参数的解构赋值 function sum(x, y) { return x + y; } sum(1,2); //解构赋值 function sum([x, y]) { return x + y; ...
- ES6解构赋值常见用法
解构赋值出现的契机: let obj = { a: 1, b: 2 } // 取值 let a = obj.a let b = obj.b 问题核心: 每次取值既要确定对象属性名,还得重新定义一个变量 ...
- ES6 中变量的解构赋值
1. 数组的解构赋值 解构: ES6 中允许按照一定的模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构(Destructuring). 1. 基本用法 本质上,这种写法属于"模式匹 ...
- ES6 学习笔记(二)解构赋值
一.数组的解构赋值 1.基本用法 ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,该操作即为解构 如: let [a,b,c]=[1,2,3]; console.log(a,b,c) ...
- ES6(二)解构赋值详解
详解一下之前的解构赋值 ①解构赋值中的"..." let [a,...b]= [1]; b // [] ...代表变量b去匹配剩余的所有元素返回一个数组 ,匹配不到时返回[] // ...
- 变量的解构赋值////////////z
变量的解构赋值 数组的解构赋值 对象的解构赋值 字符串的解构赋值 数值和布尔值的解构赋值 函数参数的解构赋值 圆括号问题 用途 数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值, ...
- ES6-个人学习笔记二--解构赋值
第二期,解构赋值如果能够熟练应用确实是个十分方便的功能,但是过分的依赖和嵌套只会让代码理解和维护起来十分困难,是个体现高逼格的表达式呢~ 1,解构赋值的基础 //定义:es6运行按照一定模式,从数组或 ...
- ES 6 : 变量的解构赋值
1. 数组的解构赋值 [ 基本用法 ] 按照一定的模式从数组或者对象中取值,对变量进行赋值的过程称为解构. 以前,为变量赋值只能直接指定值: 而ES 6 允许写成下面这样: 上面的代码表示,可以从数组 ...
- ES6解构赋值
前面的话 我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段.在ES6中添加了可以简化这种任务的新特性:解构.解构是一种打破数据结构,将其拆分为更小部分的过程.本文将详细介绍ES6解构赋值 ...
随机推荐
- mssql2012的分页查询
sql2102支持的分页查询 注意:以下都是先执行排序,再取行数据 select* from t_workers order by worker_id desc offset 3 rows --先 ...
- 网络对抗技术 2017-2018-2 20152515 Exp7 信息搜集与漏洞扫描
1. 实践内容(3.5分) 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为. 原理:如果可以冒充域名服务器,然后把查询的 ...
- 6、使用jconsole+VisualVM分析JVM
一.不断增加对象触发GC的代码 VM 参数:-Xms100m -Xmx100m -XX:+UseSerialGC import java.util.ArrayList; import java.uti ...
- Yii2 软删除
什么是软删除 后台操作,删除一条记录,不希望真正的从数据库中删除,用个字段标记一下.比如delete_at.默认0.当执行删除操作,更新delete_at为当前时间戳 这样列表显示的时候只查询dele ...
- C#集合与泛型集合
看到这个标题,大家应该就知道有泛型集合,就有非泛型集合 既然都是集合,咱们今儿就简单的来对比讲解下 需要记住的不算太多,理解记忆.理解记忆 2017-11-0411:39:09 C# 泛型集合之非泛型 ...
- OD之去除nag弹窗(四)
在某些方面,一个软件如果没有注册的话,老是会弹出烦人的注册弹窗,就如下图一样: 出现了两次弹窗,开始一次,关闭后又一次,老办法,拖进OD进行分析;不过看出程序很简单,就出现了messagebox的调用 ...
- 4星|《流量池》:Luckin Coffee营销操盘手经验谈
流量池:“急功近利”的流量布局.营销转化 作者是一线营销操盘手,全书是作者的经验总结,这样的作者在营销类图书中比较罕见,因此这本书非常有价值. 全书是写给巨头之外的企业营销人员看的,这样的企业的流量来 ...
- idou老师教你学Istio: 如何用Istio实现K8S Egress流量管理
本文主要介绍在使用Istio时如何访问集群外服务,即对出口流量的管理. 默认安装的Istio是不能直接对集群外部服务进行访问的,如果需要将外部服务暴露给 Istio 集群中的客户端,目前有两种方案: ...
- es6箭头函数使用场景导致的一些问题
1. 今天在使用draggable组件时,监听dragmove事件时获取到的事件对象有一些异常, 代码如下 draggable.on('drag:move', (event) => { cons ...
- PAT甲题题解-1048. Find Coins (25)-水
给n,m以及n个硬币 问,是否存在两个硬币面值v1+v2=m 因为面值不会超过500,所以实际上最多500个不同的硬币而已 #include <iostream> #include < ...