本周内容:
day01:函数的基本使用
1、先定义,后调用
2、函数参数的使用
形参
位置形参
默认形参
实参
位置实参
关键字实参
*与**在实参与形参中的应用
day02:函数的核心
1、函数对象
第一类对象(第一等公民)
2、函数的嵌套
3、名称空间与作用域(******)
名称空间与作用域的关系是在函数定义阶段就确立的,与调用位置无关
4、闭包函数 = 函数对象 + 函数嵌套 + 名称空间与作用域
day03:装饰器
1、无参装饰器
2、有参装饰器
day04:迭代器与生成器
1、迭代器
2、生成器——>自定义的迭代器
3、三元表达式
4、生成式
day05:函数剩余
1、函数递归——>重复执行代码
2、匿名函数lambda
3、匿名函数与内置函数的结合使用map、filter、reduce
4、其他内置函数
一、函数介绍
1、什么是函数
ps:函数就是盛放实现某一功能的容器
具备某一功能的工具就叫函数
事先准备工具的过程称之为函数的定义
遇到应用场景拿来就用称为函数的应用
所以函数的使用原则:先定义,后调用
2、为何要用函数
解决下列问题
1、代码组织结构越来越不清晰,可读性差
2、代码可扩展差
3、
3、如何用函数
定义的语法:
def 函数名(参数1,参数2,参数3,...):
"""函数的文档注释"""
代码1
代码2
代码3
return 返回值
调用的用法
函数名()
二、定义函数
x = 10
def 函数名(参数1,参数2,参数3,...):
"""函数的文档注释"""
代码1
代码2
代码3
return 返回值
强调:定义函数只检测语法,不执行代码
定义函数发生的事情:
1、申请内存空间把函数体代码放进去
2、将函数内存地址绑定给函数名
def login(): #login = 函数的内存地址
print(11111)
print(22222)
print(33333)
print(login) #输出login的内存地址
三、调用函数
login()
发生的事情:
1、先通过函数名定位到函数的内存地址
2、函数内存地址()——>触发函数体代码的运行
强调:调用函数才会执行函数体代码
例如:
def func():
print(11111
例2:
def func():
print(11111)
asdasd
print(22222)#无语法错误,但是有逻辑错误,在执行时才会提示错误
四、定义函数的三种形式
1、无参
def func():
print('xxxxx')
func()
例如:
def say():
print('==========')
print('welcome')
print('==========')
say()
2、有参
def func(x):
#x = 1111
print(x)
func(1111)
例如:
def max2(x,y):
x = 10
y = 20
if x > y:
print(x)
else:
print(y)
3、空
def login():
pass
五、调用函数的三种形式
1、语句
len('hello')
2、表达式
res = len('hello')* 10
print(res)
3、可以当做参数传给另外一个函数
print(len(''hello''))
六、函数参数
1、形参:在函数定义阶段括号内指定的参数,称之为形式参数,简称形参——>变量名
2、实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参——>变量值
def func(x,y): #形参
print(x,y)
func(12,34) #实参
形参与实参的关系是:
在调用函数时,实参值会绑定给形参名,在函数调用完毕后解除绑定
细分的话。。。
(1)位置形参:
在定义函数时按照从左到右的顺序以此定义的变量名,称之为位置形参
特点:必须被赋值
def func(x,y):
print(x)
print(y)
func(1,2)
(2)位置实参:
在调用函数时,按照从左到右的顺序依次传入的值,称之为位置实参
特点:按照位置为形参赋值,一 一对应
(3)关键字实参:在调用函数时,按照key=value的形式传值,称之为关键字实参
特点:可以打乱顺序,但是仍然能够指名道姓的为指定的参数赋值
func(y=21,x=20)
#注意:可以混用位置实参与关键字实参,但是
1>位置实参必须在关键字实参的前面
2>不能为同一形参重复赋值
func(''egon'',y = 20) #正确
func(y = 20,''egon'')#语法错误
例如:def foo(x,y,z)
pass
func(1,y=2,3) #语法错误
func(1,2,z=3) #正确
func(1,y=2,z=3) #正确
func(1,y=2,z=3,x=2) #错误
(4)默认形参:在定义函数时,就已经为某个形参赋值了,称之为默认形参
特点:调用函数时,可以不用为其赋值
def func(name,age=18):
print(name)
print(age)
func('egon') #egon 18
func('egon',19) #egon 19
#注意:可以混用位置形参与默认形参,但是
1>位置形参必须在前面
2>默认形参的值,通常应该是不可变类型的
3>默认形参的赋值是在函数定义阶段赋值的
(5)可变长参数:
可变长参数指的是在调用函数时,传入的实参个数不固定,对应着必须有特殊形式的形参来接收溢出的实参
溢出的位置实参——>*
溢出的位置关键字实参——>**
1>*在形参中的应用,*会将溢出的位置实参合并成一个元组,然后赋值给紧跟其后的那个形参名
def func(x,*args): # args = (2,3,4,5)
print(x)
print(args)
func(1,2,3,4,5)
2>**在形参中的应用,**会将溢出的关键字实参合并成一个字典,然后赋值给紧跟其后的那个形参名
def func(x,**kwargs): #kwargs = {''a'':2,"c":4,"b":3}
print(x)
print(kwargs)
func(1,a=2,b=3,c=4)
3>*在实参中的应用,是一种打散行为,*会将紧跟其后的那个值打散成位置实参
func(*[11,22,33]) #func(11,22,33)
func(*'hello') #func(''h'',''e'',''l'',''l'',''o'')
func(*{'k1':1111,'k2':2222} #func(''k1'',''k2'')
4>**在实参中的应用,**只能跟字典类型,**会将字典打散成关键字实参
func(**{'k1':111,'k2':222}) #func('k2'=222,'k1'=111)
七、函数的返回值
return详解:
1、函数可以有多个return,但只要执行一次return,整个函数就立即结束,并且将return后的值当做本次调用的结果返回
2、return后的返回值有三种情况:
(1)return值:返回的就是这一个值
(2)return值1,值2,值3:返回的是一个元组
def func():
return 111,''xxx'',[22,33]
res = func()
print(res) #(111,'xxx',[22,33])
(3)函数内可以没有return、或者return None、或者return,默认返回None