首页 > 编程语言 >5.python-函数式编程

5.python-函数式编程

时间:2022-12-16 01:12:47浏览次数:54  
标签:函数 迭代 python 编程 list item print lambda

函数式编程

(1) 定义:用一系列函数解决问题。
-- 函数可以赋值给变量,赋值后变量绑定函数。
-- 允许将函数作为参数传入另一个函数。
(2) 高阶函数:将函数作为参数或返回值的函数。

函数作为参数(函数式编程理论支柱)

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

函数式编程思想

适用性:多个函数,主体结构相同,但是核心算法不同
步骤:
1. 分:将不同的算法单独定义在函数中
2. 隔:使用参数隔离通用函数与变化函数
价值:
创造通用函数

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


# 定义函数,在列表中查找第一个小于100的数
def func02():
    for item in list01:
        if item < 100:
            return item


list01 = [3, 32, 52, 5, 22, 52, 525, 8, 5, 46, 36, 262]
print(func01())  # 32 # 直接调用函数
print(func02())  # 3


# 函数func01和func02只有判断句子不同,其余相同,可将函数更改为
def func03(condition):  # 函数主体不变,将不同的部分抽取成函数作为参数传入
    for item in list01:
        if condition(item):  # 间接调用函数
            return item


def condition01(item):
    return item > 10


def condition02(item):
    return item < 100


print(func03(condition01))  # 将条件函数condition01作为参数传入,不带有小括号,有小括号传入的是函数的返回值
print(func03(condition02))  # 将条件函数condition02作为参数传入

lambda 表达式

(1) 定义:是一种匿名方法
(2) 作用:
-- 作为参数传递时语法简洁,优雅,代码可读性强。
-- 随时创建和销毁,减少程序耦合度

# 语法 lambda 形参:方法体
# 形参没有可以不填
# 方法体只能有一条语句,且不支持赋值语句
cool = lambda x: print(x)
cool(3)  # 3


# lambda常用于函数式编程,作为参数传入,间接调用
def first(condition):
    for item in list01:
        if condition(item):
            return item


list01 = [42, 45, 16, 21, 7, 27, 7, 7, 27, 60, 2627, 8, 2, 724, 5, 266, 27, 2, 180, 7]

# 获取列表第一个大于100的数
print(first(lambda x: x > 100))  # 2627
# 获取列表第一个小于10的数
print(first(lambda x: x < 10))  # 7


def find_all(condition):
    list_number = []
    for item in list01:
        if condition(item):
            list_number.append(item)
    return list_number


# 获取列表中所有被3整除的数且为偶数
print(find_all(lambda x: x % 3 == 0 and x % 2 == 0))  # [42, 60, 180]
# 获取列表中所有奇数或被5整除的数
print(find_all(lambda x: x % 2 == 1 or x % 5 == 0))  # [45, 21, 7, 27, 7, 7, 27, 60, 2627, 5, 27, 180, 7]

内置高阶函数

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

# map(函数,可迭代对象):
# 使用可迭代对象中的每个元素调用函数,将返回值作为新可迭代对象元素;返回值为新可迭代对象。
# 获取所有的姓名
print(list(map(lambda x: x.name, list_employees)))  # ['师父', '孙悟空', '猪八戒', '沙僧', '小白龙']
# 获取所有的工号和工资
print(list(map(lambda x: (x.eid, x.did),
               list_employees)))  # [(1001, 9002), (1002, 9001), (1003, 9002), (1004, 9001), (1005, 9001)]

# filter(函数,可迭代对象):
# 根据条件筛选可迭代对象中的元素,返回值为新可迭代对象。
# 查找工资小于40000的
iterable01 = filter(lambda x: x.money < 40000, list_employees)
for item in iterable01:
    print(item.__dict__)
# 查找部门编号为9001且工资大于20000的
iterable02 = filter(lambda x: x.did == 9001 and x.money > 20000, list_employees)
for item in iterable02:
    print(item.__dict__)

# sorted(可迭代对象,key = 函数,reverse = bool值):False升序 True降序
# 排序,返回值为排序结果。
# 按工资升序
iterable03 = sorted(list_employees, key=lambda x: x.money, reverse=False)
for item in iterable03:
    print(item.__dict__)
# 按工号降序
iterable04 = sorted(list_employees, key=lambda x: x.eid, reverse=True)
for item in iterable04:
    print(item.__dict__)

# max(可迭代对象,key = 函数):根据函数获取可迭代对象的最大值。
# min(可迭代对象,key = 函数):根据函数获取可迭代对象的最小值。
# 工资最大值
employees01 = max(list_employees, key=lambda x: x.money)
print(employees01.__dict__)  # {'eid': 1001, 'did': 9002, 'name': '师父', 'money': 60000}
# 部门最小值
employees02 = min(list_employees, key=lambda x: x.did)
print(employees02.__dict__)  # {'eid': 1002, 'did': 9001, 'name': '孙悟空', 'money': 50000}

 

标签:函数,迭代,python,编程,list,item,print,lambda
From: https://www.cnblogs.com/xmgcool/p/16986306.html

相关文章

  • Python OpenCV
    OpenCV准备工作Python版本3.6OpenCV版本3.4.1.15condacreate-nOpenCV3.6python=3.6pipinstallopencv-python==3.4.1.15pipinstalldlib==19.6.1pytho......
  • C#内联函数 特性 MethodImplOptions.AggressiveInlining)
    https://www.cnblogs.com/cdaniu/p/15900255.htmlImpl:implement的缩写内联函数在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议......
  • python-函数
    python-函数函数的作用封装代码,提高代码的重用性函数的使用函数的使用方法:先定义在调用函数的定义把代码封装到函数的内部函数的调......
  • 4.python-定时任务框架
    定时任务框架APScheduler提供了基于间隔、周期及时间的定时任务在命令行安装#Linux操作系统:sudopipinstallapscheduler#Windows操作系统:pipinstallapscheduler......
  • 深度学习笔记第一门课第二周:神经网络的编程基础(下)
    本文是吴恩达老师的深度学习课程[1]笔记部分。作者:黄海广[2]主要编写人员:黄海广、林兴木(第四所有底稿,第五课第一二周,第三周前三节)、祝彦森:(第三课所有底稿)、贺志尧(第五课第......
  • python 日志 logging模块详解
    1、基本使用配置logging基本的设置,然后在控制台输出日志,importlogginglogging.basicConfig(level=logging.INFO,format='%(asctime)s-%(name)s-%(levelname)s-......
  • 学习python-flask04
    flask项目演示打开一个flask项目运行步骤1.pycharm打开项目2.安装依赖:虚拟环境用pipinstall-rreq.txt3.数据库建库:movie #root用户密码不是123需要改两个地......
  • C语言中将二维数组作为函数参数来传递
    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下:方法一, 形参给出第二维的长度。例如:#include<stdio.h>voidfunc(intn,char str[][5]){ inti; f......
  • Java网络编程
    Java最初是作为一种网络编程语言出现的,它能够使用网络上的各种资源和数据,与服务器建立各种传输通道,将自己的数据传送到网络的各个地方。你可以用Java很轻松地完成这些,......
  • [Glib] GObject 的 dispose 和 finalize 成员函数的各自作用
    ​​GObject学习教程---第十一章8本文是学习学习他人的博客的心得(具体详见“楼主见解”),如果源网站可访问的话,建议直接访问源网站:楼主见解:主要讲解析构为什么需要2个函数来实......