定义:用一系列函数解决问题
函数可以赋值给变量,赋值后变量绑定函数
允许函数作为参数传入另一个函数
允许函数返回一个函数
def func01():
print("func01")
#直接调用函数
func01()
#将函数赋给变量(右边的函数一定不能写小括号)
a=func01
#间接调用函数
a()
#通常用于函数参数传入 例如func01(fun02)
函数式编程适用范围:
多个函数主体逻辑相同,但核心算法不同(如下两个函数)
def get_number_gt_100(list01):
for number in list01:
if number>100:
yield number
def get_number_by_even(list01):
for number in list01:
if number%2==0:
yield number
函数式编程后如下:
list01 = [1, 2, 5, 46, 69]
#封装:将变化点分为多个函数 如:condition01,condition02
#继承:将变化点抽象为参数,通过参数统一确定统一的方法,从而隔离通用函数与变化点函数 如func
#多态:编通用函数时调用参数,执行时传递变化点函数
#价值:增加新变化点函数,不影响通用函数
def condition01(number):
return number > 100
def condition02(number):
return number % 2 == 0
def get_number(func):
for number in list01:
if func(number):
yield number
for item in get_number(condition02):
print(item)
lambda表达式
写法1:有参数有返回值(两者等价)
def func01(p1,p2):
return p1>p2
func01=lambda p1,p2:p1>p2
写法2:无参数有返回值(两者等价)
def func02():
return 100
func02=lambda:100
写法3:有参数无返回值(两者等价)
def func03(p1):
print(p1)
func03=lambda p1:print(p1)
写法4:无参数无返回值(两者等价)
def func04():
print(4)
func04=lambda :print(4)
语法:
lambda 参数:函数体
注意:
lambda能表达的函数,def都能表达,但是:
1,lambda不支持赋值语句
2,lambda不支持多条语句
lambda表达式应用
作为实参传入函数
可以将上面的调用函数与变化点函数结合起来
def get_number(func):
for number in list01:
if func(number):
yield number
for item in get_number(lambda number:number>100):
print(item)
内置高阶函数
class Employee:
def __init__(self, eid, did, name, money):
self.eid = eid # 员工编号
self.did = did # 部门编号
self.name = name
self.money = money
# 员工列表
list_employees = [
Employee(1001, 9002, "师父", 60000),
Employee(1002, 9001, "孙悟空", 50000),
Employee(1003, 9002, "猪八戒", 20000),
Employee(1004, 9001, "沙僧", 30000),
Employee(1005, 9001, "小白龙", 15000),
]
# 1. map 映射
# 需求:获取所有员工姓名
for item in map(lambda item: item.name, list_employees):
print(item)
执行结果:
师父
孙悟空
猪八戒
沙僧
小白龙
# 2. filter 过滤器
# 需求:查找所有部门是9002的员工
for item in filter(lambda item: item.did == 9002, list_employees):
print(item.__dict__)
执行结果:
{'eid': 1001, 'did': 9002, 'name': '师父', 'money': 60000}
{'eid': 1003, 'did': 9002, 'name': '猪八戒', 'money': 20000}
# 3. max min 最值
emp = max(list_employees, key=lambda emp: emp.money)
print(emp.__dict__)
执行结果:
{'eid': 1001, 'did': 9002, 'name': '师父', 'money': 60000}
# 4. sorted
# 升序排列
new_list = sorted(list_employees, key=lambda emp: emp.money)
print(new_list)
# 降序排列
new_list = sorted(list_employees, key=lambda emp: emp.money, reverse=True)
print(new_list)
执行结果:
[<__main__.Employee object at 0x00000296BD22F760>, <__main__.Employee object at 0x00000296BD17D280>, <__main__.Employee object at 0x00000296BD17D1F0>, <__main__.Employee object at 0x00000296BD17D580>, <__main__.Employee object at 0x00000296BD1DDA00>]
[<__main__.Employee object at 0x00000296BD1DDA00>, <__main__.Employee object at 0x00000296BD17D580>, <__main__.Employee object at 0x00000296BD17D1F0>, <__main__.Employee object at 0x00000296BD17D280>, <__main__.Employee object at 0x00000296BD22F760>]
(对象地址)