1、函数的定义与调用
1.1、什么是函数?
- 数学定义:y=f(x),y是x的函数,x是自变量;y=f(x1,x2,x3...)
- Python函数定义:
- 由若干语句组成代码块,函数名称,参数列表构成;它是组织代码的最小单元;
- 完成一定的功能
1.2、函数的作用?
- 结构化编程对代码的最基本的封装,一般按功能组织一段代码;
- 函数封装的目的是为了函数的复用(一次定义多次调用),减少代码重复;
- 代码更加简洁易读;
1.3、函数的分类?
- 内建函数
- 库函数
- 自定义函数
1.4、函数的定义?
# def 语句定义函数 def 函数名(参数列表): 函数体 [return 返回值] ############ (1)函数名就是标识符,命名要求和标识符要求一样; (2)语句块必须缩进,约定为4个空格 (3)Python的函数,如果没有return语句,默认return None (4)定义中的参数列表为函数的形式参数,只是一种符号表达,简称为形参;
1.5、函数的调用
# 函数的调用 函数名() 表示函数的调用; (1)函数定义,只是声明了一个函数(只会检查语法),不会执行; (2)调用时的参数就是实际参数,就是给函数传递的实际值;
2、函数的参数
2.1、函数参数的分类
- 形参:函数在定义时的参数;
- 位置参数
- 关键字参数
- 默认参数
- 可变位置参数
- args = tuple()
- 命名关键字参数(kword only)
- 例如:def fn(x,y,*,a=10),这里的‘*’就是只是一个标识符,声明后面的a为keyword-only参数,必须传值;
- 可变关键字参数
- kwargs=dict()
- 实参:函数在调用时的参数;
- 位置参数
- 关键字参数
def fn(x,y,z=5,*args,a=5,**kwargs,): print(1,"x",x) print(2,"y",y) print(3,"z",z) print(4,"args",args) print(5,"a",a) print(6,"kwargs",kwargs) fn(1,2,3,4,5,a=10,b=11,c=12) ''' 运行结果: 1 x 1 位置参数x 2 y 2 位置参数y 3 z 3 默认参数z 4 args (4, 5) 可变长参数 args 5 a 10 命名关键字参数 a 6 kwargs {'b': 11, 'c': 12} 关键字参数 kwargs '''
参数规则:参数列表的一般顺序为,普通,缺省,可变位置,keyword-only(可带缺省值),可变关键字参数;
3、函数参数的解构
# 参数解构:
(1)给函数提供实参的时候,可以在集合类型前使用*或者**,把集合类型的结构解开,提出所有元素作为函数的实参;
(2)非字典类型使用 ‘*’ 解构成位置参数;
(3)字典类型使用‘**’解构成关键字参数;
(4)解构出来的元素数目要与参数的要求一致,也要和参数类型匹配;
##参数解构 def add(x:int,y:int)->int: print(x,y) return x + y print(add(*(4,5))) # x,y=(4,5) print(add(*[1,2])) # x,y=[1,2] print(add(*{1,2})) # x,y={1,2} print(add(**{'x':4,'y':6})) # x,y={'x':4,'y':6}
print(add(**{'x':4,'y':6})) # x,y={'x':4,'y':6} ==>x=4,y=6
print(add(**{'a':4,'b':6}))
'''
TypeError: add() got an unexpected keyword argument 'a'
# 运行报错, a,b={'a':4,'b':6} ==> a=4,b=6 ==>add(a=4,b=6) 而add函数的参数列表并没有参数a,所以报错
''' def add(*args,sum=0): for i in args: sum+=i return sum ret1=add(*[1,2,3,4,5]) ret2=add(*[i for i in range(100) if i%2]) print(ret1,ret2)