1、匿名函数
用lambda关键词能创建小型匿名函数,这种函数得名于省略了用def声明函数的标准步骤。
lambda函数的语法只包含一个语句,如下:
lambda 参数列表: 运算表达式
如下实例:
sum = lambda arg1,arg2:arg1 + arg2
#调用sum函数
print("Value of total : %d" % sum( 10, 20 ))
print("Value of total : %d" % sum( 20, 20 ))
以上实例输出结果:
lambda函数能接收任何数量的参数但只能返回一个表达式的值。
匿名函数可以执行任意表达式(甚至print函数),但是一般认为表达式应该有一个计算结果供返回使用。
python在编写一些执行脚本的时候可以使用lambda,这样可以接受定义函数的过程,比如写一个简单的脚本管理服务器。
1.1 应用场合
1.1.1 函数作为参数传递
'''
匿名函数的使用场合:
匿名函数作为参数使用
'''
def test():
print('_____test_____')
def func(a,f):
print('----->',a)
f()
func(5,test)
print('---------')
def func1(a,f): # f = lambda x : x**2
print('++++>',a)
r = f(a)
print('====》',r)
func1(8,lambda x:x**2)
Python中使用函数作为参数的内置函数和类:
函数名或类名 | 功能 | 参数描述 |
sorted函数 | 用来将一个无序列表进行排序 | 函数参数的返回值规定按照元素的哪个属性进行排序 |
filter类 | 用来过滤一个列表里符合规定的所有元素,得到的结果是一个迭代器 | 函数参数的返回值指定元素满足的过滤条件 |
map类 | 将列表里的每一项数据都执行相同的操作,得到的结果是一个迭代器 | 函数参数用来指定列表里元素所执行的操作 |
reduce函数 | 对一个序列进行压缩运算,得到一个值。python3以后,这个方法被移到了functools模块 | 函数参数用来指定元素按照哪种方式合并 |
1.2 sorted函数的使用
'''
高阶函数
一个函数的参数是另一个函数,高阶函数
系统高阶函数:max min sorted
'''
m = max(5,9)
print(m) # 9
m = max([2,4,67,8,9])
print(m) # 67
# 找出最大值
list1 = [('tom',19),('tony',20),('lily',18),('daniel',21),('rose',22)]
m = max(list1,key=lambda x:x[1])
print(m) # ('rose', 22)
# 找出最小值
mi = min(list1,key=lambda x:x[1])
print(mi) # ('lily', 18)
# 排序,从小到大
s = sorted(list1,key=lambda x:x[1]) # x[1]表示按照年龄排序
print(s) # [('lily', 18), ('tom', 19), ('tony', 20), ('daniel', 21), ('rose', 22)]
# 从大到小
s = sorted(list1,key=lambda x:x[1],reverse=True) # x[1]表示按照年龄排序
print(s) # [('rose', 22), ('daniel', 21), ('tony', 20), ('tom', 19), ('lily', 18)]
1.3 filter
# 找出年龄大于20岁的
list1 = [('tom', 19), ('tony', 20), ('lily', 18), ('daniel', 21), ('rose', 22)]
# filter的匿名函数要求返回值必须是bool类型,只有bool类型结果为True的才是符合过滤条件的
rr = filter(lambda x: x[1] > 20, list1) # 只有x[1]>20这一块的值返回的是true,才符合过滤要求
print(rr) # <filter object at 0x000001B92C9B36C8> # 得到的是一个filter object,得到的是一个迭代器的items
print(list(rr)) # [('daniel', 21), ('rose', 22)] # 把它强转成list就可以看到结果了
1.4 map
# 通过匿名函数指明提取的内容,并对内容进行加工,提取list1中符合条件的内容
list1 = [('tom', 19), ('tony', 20), ('lily', 18), ('daniel', 21), ('rose', 22)]
ma = map(lambda x:x[1],list1)
print(list(ma)) # [19, 20, 18, 21, 22]
# title首字母大写
ma = map(lambda x:x[0].title(),list1)
print(list(ma)) # ['Tom', 'Tony', 'Lily', 'Daniel', 'Rose']
# upper全部字母大写
ma = map(lambda x:x[0].upper(),list1)
print(list(ma)) # ['TOM', 'TONY', 'LILY', 'DANIEL', 'ROSE']
1.5 reduce函数
from functools import reduce
r = reduce(lambda x,y : x+y,[1,2,3,4,5])
print(r) # 15
2、高阶函数
在python中,函数其实也是一种数据类型。
def test():
return 'hello world'
print(type(test)) # <class 'function'>
函数对应的数据类型是function,可以把它当做是一种复杂的数据类型。
既然同样都是一种数据类型,我们就可以把它当作数字或者字符串来处理。
2.1 定义一个变量指向函数
在python中,可以定义一个变量,让它来指向一个函数,相当于给函数起了一个别名。
def test():
return 'hello wrold'
fun = test # 定义了一个变量fun,让它指向了test这个函数
print(fun()) # 使用fun()可以直接调用test这个函数
print(id(fun)) # 1798631154312
print(id(test)) # 1798631154312
注意:在定义一个变量表示一个函数时,函数后面不能加括号!加括号表示的是调用这个函数。
def test():
return 'hello wrold'
result = test() # 这种写法是调用test函数,并把函数的返回值赋值给result变量
#print(result()) # 这里会报错 TypeError: 'str' object is not callable
fun = test # 这种写法是test函数起了一个别名,注意,这里的test后面不能加()
fun() # 可以使用别名调用这个函数
高阶函数:既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,同样,我们还可以把一个函数当做另一个函数的返回值。这种函数的使用方式我们称之为高阶函数。
2.2 函数做为另一个函数的参数
def test(age,action):
if age < 18:
print('您还没满18岁,请退出')
action() # 把参数action直接当做一个函数来调用
def smoke():
print('我已经18岁了,我想喝酒')
my_action = smoke # 定义一个变量my_action,让它指向smoke函数
test(21,my_action) # 将my_action传给test函数作为它的参数
test(21,smoke) # 还可以不再定义一个新的变量,直接传入函数名
2.3 函数作为另一个函数的返回值
def test():
print('我是test函数里输入的内容')
def demo():
print('我是demo里输入的内容')
return test # test函数作为demo函数的返回值
result = demo() # 我是demo里输入的内容,调用demo函数,把demo函数的返回值赋值给result
print(type(result)) # <class 'function'> result的类型是一个函数
result() # 我是demo里输入的内容 我是test函数里输入的内容 既然result是一个函数,那么就可以直接使用()调用这个函数
demo()() # 我是demo里输入的内容 我是test函数里输入的内容