py基础系列(四):函数
- 函数定义
- 有参函数
- 无参函数
- 函数调用
- 函数参数
- 不可变对象和可变对象参数
- 默认值参数
- 不定长参数
- 实参序列解包
- lambda表达式
- 嵌套定义
- 修饰器
- 生成器函数
函数定义
有参函数
定义形式:
def 函数名( [形式参数列表] ): 函数体
无参函数
定义形式:
def 函数名(): 函数体 # 即使无参,括号也不能省略 函数体
与Java语言不一样,Python中无需指定返回值的数据类型。每一个Python函数实际上都有一个返回值。如果函数的return有指定返回值,将执行返回值,否者返回值为None。
(1)return语句没有指定返回值, 则默认返回None
(2)return语句指定返回多个值
函数也可以返回多个值。定义时将需要返回的多个值依次放在return的后面,用逗号隔开。实际返回一个数组
(3)多个return语句
一个函数的函数体中可以有多个return语句,当执行其中任意一个return语句后,本函数体的执行就结束,
函数调用
调用时一定要有小括号。没有小括号在Python中不会报告语法错误,但就不是调用函数,相当于函数重命名。
函数名()
d=sum # 缺失括号,相当于给sum起了个别名 d c= d(8,3)
函数参数
不可变对象和可变对象参数
不可变对象:数字、字符串和元组
可变对象:列表、字典、集合
(1)不可变对象做参数
不可变对象作为函数实参时,如果在函数体内改变形参的值,不会导致实参值发生改变。
(2)可变对象做参数
可变对象作为函数实参时,在函数体内改变形参的值将导致实参的值发生改变
默认值参数
定义形式:
def 函数名(…, 形参名=默认值):
函数体
# 函数名__defaults__ 查看函数所有默认值的设置值,返回值为一个元组
(1)设置了默认值的参数只在定义时解释和初始化一次。
一个形参如果设置了列表、集合及字典等可变类型的默认值,那么第一次使用默认值时,形参的值为设置的默认值,以后继续调用函数则不会再次用默认值初始化
(2)如果调用时给默认值参数传了值,那么它对默认值形参的变化情况没有影响
不定长参数
不定长参数指的是形式参数没有指定个数,从而达到可以传入任意个数的实参。
(1)第一种定义不定长参数的形式:
def 函数名(*形参名):
函数体
系统将传递进来的任意数量的实参组合成一个 元组 传给形参。
(2)第二种定义不定长参数的形式:
def 函数名(**形参名):
函数体
系统将传递进来的任意数量的、显式赋值的实参组合成一个 字典 传给形参。
实参序列解包
当形参有多个时 ,可以使用列表、元组、集合、字典及其他可迭代对象作为实参,并在实参名称前面加上一个星号(*),Python解释器会首先将实参序列解包,然后将序列中的值分别传递给形参变量。
lambda表达式
一般形式:
lambda 形参列表: 表达式 #这个表达式只能是简单语句 不能有if分支等结构
也可以将lambda表达式变成命名函数,
一般形式:
函数名 = lambda 形参列表: 表达式
例如, f = lambda x, y: x + y
嵌套定义
嵌套定义即在函数体内再定义另一个函数。函数也跟变量一样有作用域,嵌套定义的函数不能被外部直接使用,否则会抛未定义变量异常。
这里的inner函数就像当于outer函数的局部变量。
被嵌套的函数不会随着外部函数的执行而自动执行,只是完成定义。要执行被嵌套的函数,需要在外部函数的函数体内显式地调用它
修饰器
修饰器也是一个函数,它接收其他函数作为参数,在此基础上加上一些功能作为修饰后返回新函数
在定义函数main()之前加上@ decorator以使用该修饰器
生成器函数
生成器函数是指一个包含了yield语句的函数,生成器函数可以用来创建生成器对象。yield语句返回值并暂停函数的运行,生成器是一个迭代器,所以下次可以通过生成器对象的__next__()函数、内置函数next或for循环遍历生成器对象时再恢复执行,并从yield语句的后一条语句继续执行。
需要注意的是,yield 不能和 return 共用且需要写在函数内。yield和return一样,都可以返回值,但是 return 在返回值之后就直接结束一个函数,而 yield 不会。
生成器对象具有向前性即一次性使用不能再回头
需要重新生成一个生成器对象才能从头再遍历该对象