我想当第一
本节内容:
回调函数,闭包函数,lambda表达式,迭代器
一.回调函数
#什么是回调函数?
#定义一个函数,要求定义函数中的一个参数是另一个函数(内置函数或者自定义函数).那么这个定义的函数就是回调函数
简单来说就是函数作为参数进行传递..示例如下:
def func(x,y,f):
print(f(x,y)) _#该函数参数中的 f 可以为另一个函数,该函数是回调函数
def love(x,y): #自定义函数,
_return x+y
func(2, 2, love) #可以作为上面函数中的参数 f
func(2,2,pow) #pow是系统求幂次方的内置函数,
二.闭包函数
1.基本概念
#什么是闭包函数?
#在一个函数的内部返回了一个内函数,并且返回的内函数还使用了外函数的局部变量,那么这个外函数就被称为闭包函数
#示例如下:
#定义一个函数person()
def person():
money = 0
def work(): #在外函数中定义的内函数work()
nonlocal money #在内函数中使用nonlocal关键字可以访问外函数的临时变量
money += 100 #对外函数中的变量进行修改
print(money)
return work #在外函数中返回了内函数,这个内函数就是闭包函数
res = person() #res==work
res() #res()==work()_
2.闭包作用及特点
##这样使用闭包函数有什么用?
#如以上的例子,可以有效的保护money这个变量不受外函数以外的其他因素影响,但是我们又可以使用
##闭包函数有什么特点?
#1:在外函数中定义了局部变量,在内函数中使用了这个局部变量
#2:在外函数中返回了内函数,这个内函数就是闭包函数
#3:主要用于保护外函数中的局部变量,既可以被使用,又不会被破坏
3.检测是否为闭包函数
# 使用 函数名.closure 如果是闭包函数则返回cell,不是则返回None 注意:此处下划线为两个英文下划线
#如此处:
print(res._closure) #因为此处的res==work()_
三.lambda表达式
##匿名函数,lambda表达式
匿名函数就是不使用def定义,这个函数也没有名字
在python中可以使用lambda定义匿名函数,lambda表达式仅仅是一个表达式,不是代码块
lambda也有形参,并且不能访问除了自己的形参之外的任何数据包括全局变量
lambda是一个表达式,不能写太复杂的逻辑,功能相对单一
语法:lambda [参数列表]:返回值
示例如下:
#普通函数
def add(x,y):
return x+y
_#lambda表达式
_res = lambda x,y :x+y
print(add(2,1))
print(res(2,1)) #结果是相同的
# #lambda的分支结构
# #语法规则 lambda 参数: 真值返回值 if真值判断条件 else假值返回值
def func(sex):
if sex==‘男’:
return ‘很man’
else :
return ‘很nice’
print(func(‘男’))
res = lambda sex: ‘很man’ if sex == ‘男’ else ‘很nice’
print(res(‘女’))
四.迭代器
1.基本概念
#迭代器是python中最具特色的功能之一,是访问集合元素的一种方式
#迭代器是一种可以记住访问遍历位置的对象
#从集合的第一个元素开始访问,直到所有元素访问完毕,只能从前往后一个个访问,不能后退
#迭代器是一个能被next()函数调用,并不断返回下一个值的对象
#iter()
#功能:把可迭代对象转换为迭代器对象
#参数:可迭代的对象(str,list,tuple,dict,set,range)
#返回值:迭代器对象
#注意:迭代器一定是一个可迭代的对象,但是可迭代对象不一定是迭代器
2.特点及取值方案
迭代器取值的特点:取出一个少一个,直到取完,再获取就会报错
迭代器取值方案 :
1:next() 调用一次获取一次,直到数据被取完 .
2:list() 使用list()函数直接取出迭代器中的所有数据
3:for 使用for循环遍历迭代器的数据
3.迭代器实例
f4 = [‘刘德华’,‘黎明’,‘郭富城’,‘张学友’]
res = iter(f4) #使用iter()将可迭代对象 list 转换为迭代器
print(next(res)) #第一种取值:使用next()函数去调用迭代器对象
print(list(res)) #第二种取值:使用list()函数直接取出迭代器中的所有数据
for i in res: #第三种取值:使用for循环遍历迭代器的数据
print(i)