函数式编程

用一系列函数解决问题

  • 函数可以赋值给变量,赋值后变量绑定函数
  • 允许将函数作为参数传入另一个函数
  • 允许函数返回一个函数
  • 高阶函数:将函数作为参数或返回值的函数

函数作为参数

将核心逻辑传入方法体,使该方法的适用性更广,体现了面向对象的开闭原则

list01 = [342, 4, 54, 56, 6776]

# 定义函数,在列表中查找第一个大于100的数
def get_number_gt_100():
    for number in list01:
        if number > 100:
            return number

# 定义函数,在列表中查找第一个偶数
def get_number_by_even():
    for number in list01:
        if number % 2 == 0:
            return number

# 参数:得到的是列表中的元素
# 返回值:对列表元素判断后的结果(True False)
def condition01(number):
    return number > 100

def condition02(number):
    return number % 2 == 0

# 通用函数
def find_single(condition): # 抽象
    for item in list01:
    # if number > 100:
    # if condition01(item):
    # if condition02(item):
    if condition(item):# 统一
        return item

# 变化点函数:查找小于10的数据
def condition03(number):
    return number < 10

print(find_single(condition03))

lambda 表达式

是一种匿名方法

  • 作为参数传递时语法简洁,优雅,代码可读性强
  • 随时创建和销毁,减少程序耦合度
  • 形参没有可以不填
  • 方法体只能有一条语句,且不支持赋值语句
# 语法

变量 = lambda 形参: 方法体
# 调用
变量(实参)

演示

from common.iterable_tools import IterableHelper

# 定义函数,在列表中查找所有大于100的数
# def condition01(number):
#     return number > 100

# 定义函数,在列表中查找所有偶数
# def condition02(number):
#     return number % 2 == 0

list01 = [342, 4, 54, 56, 6776]

for item in IterableHelper.find_all(list01,lambda number: number > 100):
    print(item)
for item in IterableHelper.find_all(list01,lambda number: number % 2 == 0):
    print(item)

内置高阶函数

  • map(函数,可迭代对象) : 使用可迭代对象中的每个元素调用函数,将返回值作为新可迭代对象元素;返回值为新可迭代对象
  • filter(函数,可迭代对象) : 根据条件筛选可迭代对象中的元素,返回值为新可迭代对象
  • sorted(可迭代对象,key = 函数,reverse = bool值) : 排序,返回值为排序结果
  • max(可迭代对象,key = 函数) : 根据函数获取可迭代对象的最大值
  • min(可迭代对象,key = 函数) : 根据函数获取可迭代对象的最小值

演示

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__)

# 3. max min 最值
emp = max(list_employees, key=lambda emp: emp.money)
print(emp.__dict__)

# 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)