Python day09
今天学习了匿名函数,高阶函数sorted(),reduce(),filter(),map(),带参的装饰器(三层)
列表推导式
list1 = [x for x in range(10) if x % 2 == 0]
print(list1)#[0, 2, 4, 6, 8]
list1 = [x if x %2==0 else x+1 for x in range(10)] #如果有if else需要写在for的前面
print(list1)#[0, 2, 2, 4, 4, 6, 6, 8, 8, 10]
匿名函数
lambda(),匿名函数也可以作为函数的参数
r=lambda x :x+1 冒号前面的是参数,冒号后面的是返回值
print(r(2)) #3
r=lambda x :x+1
print(r)#<function <lambda> at 0x000001E4F78ED268> r就是指lambda函数
********************************
list1=[('a',5),('b',3),('c',11)]
print(sorted(list1,key=lambda x :x[1]))#[('b', 3), ('a', 5), ('c', 11)] 按照第二个值升序排序
********************************
dict1={'a':10,'b':50,'c':30}
print(sorted(dict1.items(),key=lambda x :x[1]))#[('a', 10), ('c', 30), ('b', 50)],对字典进行值的升序排序
高阶函数
sorted()
filter()过滤器
map()映射
reduce()求累加和 , 需要导包from functools import reduce
*********************************************************************************************************
map()
list1=[0,1,5,8]
list2=map(lambda x:x**2,list1) #list2是一个map的对象地址,需要用list()强转成列表
print(list(list2))#[0, 1, 25, 64] 将后面的可迭代对象在前面的函数中执行完后映射到一个新的列表中
************
list1=[0,1,5,8]
list2=[1,2,3,4]
list3=map(lambda x,y:x+y,list1,list2)#两个列表相加到一个列表中
print(list(list3))
*********************************************************************************************************
filter()
list1=[0,1,5,8]
list2=filter(lambda x:x%2==0,list1) #函数中返回的必须是一个bool类型的值,即返回的是一个判断条件
print(list(list2))#[0, 8] #list2是一个filter的对象地址,应用list()强转
*******
list1=[0,1,5,8]
list2=filter(None,list1)
print(list(list2))#[1, 5, 8] 若函数为None,则返回为真的结果,即不等于0的值
*********************************************************************************************************
from functools import reduce
list1=[0,1,5,8]
list2=reduce(lambda x,y:x+y,list1)
print(list2)#14 将前两个值的和累加起来作为x,再与后面的值y相加
***************
list2=reduce(lambda x,y:x+y,list1,1)
print(list2)#15 最后一个参数iniital为初始值,如果有值,即把这个值作为第一个x与后面的值相加
带参数的装饰器
带参数的装饰器为三层,最外层接受参数,中间一层接受函数,最内层接收函数
如果只有两层会报错
def hanshu(f):
def wrapper(*args,**kwargs):
f()
return wrapper
@hanshu(2)
def function1():
print('hello')#TypeError: 'int' object is not callable 因为参数传给了hanshu()的f参数,他不是一个函数是一个整形,
#不能调用
************************************************
def canshu(a):#接收参数
def hanshu(f):#接收函数
def wrapper(*args, **kwargs):#接收函数的参数
print('参数是', a)
f()
return wrapper
print('----->')
return hanshu
@canshu(2)
def function1():
print('hello')
function1()#----->
#参数是 2
#hello