一、函数概念
函数是组织好的、可重复使用的,用来实现单一或相关功能的代码段
函数能提高应用的模块性和代码的重复利用率。Python提供了许多内建函数,也可以自己创建函数,这被叫做用户自定义函数
函数分类:内置函数、自定义函数
不使用函数的问题:组织结构不清晰、代码冗余、无法统一管理且维护难度大
二、定义函数
函数代码块以def关键词开头,后接函数标识符名称和圆括号()
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
定义函数的三种形式:无参(只执行一些操作)、有参(根据传进的参数执行相应的逻辑)、空函数(设计代码结构)
函数的第一行语句可以选择性的使用文档字符串用于存放函数说明
函数内容以冒号起始,并且缩进
return[表达式]结束函数,选择性的返回一个值给调用方。不带表达式的return相当于返回None
函数在定义阶段,只检测语法,不执行代码
语法:
def 函数名(参数列表):
函数体
实例:
def hello(): print('Hello World!') hello()
三、 return语句
return [表达式] 语句用于退出函数,选择性的向调用方返回一个表达式。不带参数值的return语句返回None
一个函数没有return时则返回None,等同于return None
return跟一个值则返回该值,值没有数据类型限制
return跟多个值则返回一个元组
什么时候需要有返回值:
调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值
通常有参函数需要有返回值,输入参数经过计算得到一个最终的结果
什么时候不需要有返回值:
调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值
通常无参函数不需要有返回值
实例:
def my_sum (arg1,arg2): total = arg1 + arg2 return total res = my_sum(10,20) print(res)
四、函数调用的形式
1、语句形式,例:foo()
2、表达式形式,例:res=len('hello')
3、当做另一个函数的参数,例:range(len('hello'))
五、 函数的参数
函数的参数分两种:
形参:函数中的参数
实参:提供给函数调用的值
参数定义顺序:
位置参数,默认参数,*args,命名关键字参数,**kwargs
参数赋值方式:
1、 位置参数:按照从左到右的顺序定义的参数,调用时的数量必须和声明时的一样
def foo(x,y): print(x) print(y) foo(1,2)
2、 关键字参数:按照“参数名=参数值”的形式定义,参数的顺序可以与声明时不一致。需要注意的是:关键字实参必须在位置实参右边,对同一个形参不能重复传值
def foo(x,y): print(x) print(y) foo(y=2,x=1)
3、 默认参数:调用函数时,如果没有传递参数,则会使用默认参数。需要注意的是:默认参数必须在位置形参右边,通常应该定义成不可变类型
def foo(name,age,sex='male'): #在定义阶段就已经为形参赋值了 print(name,age,sex) foo('zhangsan',age=18) foo('lisi',age=20) foo('wangwu',21,sex='female') #也可以为默认参数赋值
4、 可变长参数:针对实参在定义时长度不固定的情况,应该从形参的角度找到可以接收可变长实参的方案,这就是可变长参数(形参)。针对位置参数使用*args,关键字参数使用**kwargs
def foo(x,y,*args): #加了*号的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组 print(x) print(y) print(args) foo(1,2,3,4,5,6) #执行结果如下: 1 2 (3, 4, 5, 6)
def foo(x,y,**kwargs): #加了**的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空字典 print(x) print(y) print(kwargs) foo(x=1,y=2,z=3,a=4,b=5,c=6) #执行结果如下: 1 2 {'z': 3, 'a': 4, 'b': 5, 'c': 6}
扩展用法:
def foo(x,y,*args): print(x) print(y) print(args) foo(1,2,*(3,4,5,6)) #实际是:*args = *(3,4,5,6),结果为args = 3,4,5,6。可以简单拆开打回原形 #执行结果如下 1 2 (3, 4, 5, 6)
def foo(x,y,**kwargs): print(x) print(y) print(kwargs) foo(x=1,y=2,**{'z':3,'a':4,'b':5,'c':6}) #执行结果如下: 1 2 {'z': 3, 'a': 4, 'b': 5, 'c': 6}
5、 命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传值
def foo(*args,y): print(args) print(y) foo(1,2,3,4,5,y=6)
六、 函数对象
函数是第一类对象,即函数可以当做数据传递
1、 可以被赋值
def foo(): print('Hello World!') f = foo f()
2、 可以当做参数传入
def foo(): print('Hello World!') def wrapper(func): func() wrapper(foo)
3、 可以当做函数的返回值
def foo(): print('Hello World!') def wrapper(func): return func res = wrapper(foo) print(res)
4、 可以当做容器类型的元素
def foo(): print('Hello World!') dict = { 'func':foo } dict['func']()