Python函数式编程 、高阶函数学习
一、匿名函数
键字lambda表示匿名函数,冒号前面的x表示函数参数。
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:
# 匿名函数
## 定义一个普通函数
def add(x,y):
return x + y
# lambda 表达式 代表匿名函数
f = lambda x,y: x + y # 冒号后面必须是表达式
# 调用普通函数
print(add(1,2)) # 3
print(f(1,2)) # 3
def is_odd(n):
return n % 2 == 1
L = list(map(lambda x : x%2==1,range(1, 20)))
print(L)
二、三元运算符
# 三元表达式
x = 2
y = 1
# 条件为真时的返回结果 if 条件表达式 else 条件为假时的返回结果
y = x if x > y else y
print(y) # 2
三、map()、reduce()、filter()函数
1、map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
1、将例表中的元素平凡返回出来
1、使用匿名函数和map函数实现
list_x = [1,2,3,4,5,6]
l = list(map(lambda x: x * x, list_x))
print(l) print(l) # [1, 4, 9, 16, 25, 36]
2、使用普通函数实现
def squ(x):
return x* x
p = list(map(squ,list_x))
print(p) # [1, 4, 9, 16, 25, 36]
2、reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算.
from functools import reduce # 导入reduce模块
# 求例表中元素的和
list_l = [1,2,3,4,5,6,7,8,9]
p = reduce(lambda x,y:x+y,list_l)
print(p) # 45
3、Python内建的filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
filter()的作用是从一个序列中筛出符合条件的元素。由于filter()使用了惰性计算,所以只有在取filter()结果的时候,才会真正筛选并每次返回下一个筛出的元素。
# 将0剔除
list_y = [1, 0, 0, 0, 1, 2, 0]
p = list(filter(lambda x: x != 0, list_y))
print(p)
四、装饰器
装饰器实际上就是为了给某程序增添功能,但该程序已经上线或已经被使用,那么就不能大批量的修改源代码,这样是不科学的也是不现实的,因为就产生了装饰器,使得其满足:
不能修改被装饰的函数的源代码
不能修改被装饰的函数的调用方式
满足1、2的情况下给程序增添功能
1、普通用法
import time
def decorator(func):
def wra():
print(time.time())
func()
return wra
def fun1():
print('执行的函数')
f = decorator(fun1)
f()
2、装饰器用法
import time
def decorator(func):
def wra():
print(time.time())
func()
return wra
@decorator # 装饰
def fun1():
print('执行的函数')
fun1()
带参数的调用
import time
def decorator(func):
def wra(*args): # 接受一个可变参数
print(time.time())
func(*args)
return wra
@decorator # 装饰
def fun1(func_name):
print('执行的函数' + func_name)
@decorator # 装饰
def func2(func_name1,func_name2):
print('执行的函数' + func_name1 + '--' +func_name2)
fun1('111')
func2('11', '225')
支持关键字参数
import time
def decorator(func):
def wra(*args,**kw):
print(time.time())
func(*args,**kw)
return wra
@decorator # 装饰
def fun1(func_name):
print('执行的函数' + func_name)
@decorator # 装饰
def func2(func_name1,func_name2):
print('执行的函数' + func_name1 + '--' +func_name2)
@decorator # 装饰
def func3(func_name1,func_name2,**kw):
print('执行的函数' + func_name1 + '--' +func_name2)
print(kw)
func3('11', '225',a=1,b=2,d=5)