1.定义:由若干语句组成的语句块、函数名称、参数列表构成,是组织代码的最小单元,完成一定的功能
2.作用:简单的封装,为了复用
3.分类:内建函数,如max()、reversed()等
库函数,如math.ceil()等
自建函数
4.函数定义、调用
定义: def 函数名(参数列表):
函数体(代码块)
[return 返回值]
函数名就是标识符,命名要求一样
语句块必须缩进,约定4个空格
python的函数没有return语句,隐式会返回一个None值
定义中的参数列表成为形式参数,只是一种符号表达,简称形参
调用
函数定义,只是声明了一个函数,不会被执行,需要调用
调用的方式,就是:函数名(参数)
调用时写的参数是实际参数,是实实在在传入的值,简称实参
5.函数参数
参数调用时传入的参数要和定义的个数相匹配(可变参数例外)
位置参数
def f(x,y,z) 调用使用f(1,3,5)
按照参数定义顺序传入实参
关键参数
def f(x,y,z) 调用时使用f(x=1,y=3,z=5)
使用形参的名字来传入实参的方式,如果使用了形参的名字,那么传参顺序就可以和定义顺序不同
传参
f(z=None,y=10,x=[1])
f((1,),z=6,y=4.1)
f(y=5,z=6,2) #此方法不可行,要求位置参数必须在关键字参数之前传入,位置参数是按位置对应的
6.函数参数默认值
定义时,在形参后跟上一个值。没有缺省值的放在前面
def add(x=4,y=5):
return x+y
作用:(1)参数的默认值可以在未传入足够的参数的时候,对没有给定的参数赋值为默认值
(2)参数非常多的时候,并不需要用户每次都输入所有的参数,简化函数调用
7.可变参数
一个形参可以匹配任意个参数,在形参前使用*表示该参数是可变参数,可以接收多个实参,包括0个, 收集多个实参为一个tuple
形参前使用**,表示可以接收多个关键字参数,收集的实参名称和值组成一个字典dict
def showconfig(**kwargs):
for k,v in kwargs.items():
print('{}={}'.format(k,v))
showconfig(host='127.0.0.1',port='8080',username='wang',password='magedu')
可变参数混合使用,可变参数要放到参数列表的最后,普通参数需要放到参数列表前面,位置可变参数需要在关键字可变参数之前(越复杂越靠后)
8.keyword-only参数(python3加入)
如果在一个星号参数后,或者一个位置可变参数后,出现的普通参数,实际上已经不是普通的参数了,而是keyword-only参数
def fn(*args,x):
print(x)
print(args)
fn(3,5) #错误
fn(3,5,7) #错误
fn(3,5,x=7)
#args可以看做已经截获了所有的位置参数,x不使用关键字参数就不可能拿到实参
keyword-only参数另一种形式
def fn(*,x,y):
print(x,y)
fn(x=5,y=6)
# *号之后,普通形参都变成了必须给出的keyword-only参数
9.参数解构
def add(x, y):
return x + y
add(*(4, 5)) #注意数量,如add(*(4, 5 ,6))错
add(*{4, 5}) #注意数量,如add(*{4, 5 ,6})错
d={'x':5,'y':6}
add(**d)
add(**{'x':5,'y':6})
d = {'a': 5, 'b': 6}
add(*d.values())
(1)在集合类型前使用*或者**,把集合类型的结构解开,提取出所有元素作为函数的实参
(2)非字典类型使用*解构成位置参数
(3)字典类型使用**解构成关键字参数
(4)提取出的元素数目和要和参数的要求匹配,也要和参数的类型匹配
import random
def double_values(*args):
"""
输出最大最小值
"""
print(args)
return max(args), min(args)
print(*double_values(*[random.randint(10, 20) for _ in range(10)])) #第一个*号将打印结果解构,不加*打印整个元组,第二个*号把参数进行解构