【python学习】函数式编程和高阶函数 map filter reduce lambda表达式 sorted 闭包 装饰器

2023-11-11

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
高阶函数包括:map,reduce,filter, sorted
匿名函数lambda
装饰器

1 map

a1 =[1,2,3,4,5,6,7,8]
def my_add(ele):
    return ele * ele
res = map(my_add,a1)
res
<map at 0x28daa26b760>
list(res)
[1, 4, 9, 16, 25, 36, 49, 64]

L = map(str, [1,2,3,4,5,6,7,8,9])
print(list(L))
[11, 22, 33, 44]

平行的三个list也可以

def f3(x,y,z):
    return x+y + z
L = map(f3,[1,2,3,4],[10,20,30,40],[5,6,7,8])
list(L)

2.reduce

reduce 的功能有点奇怪,其实他不是用来计算求和的,求和有点大材小用

from functools import reduce
def add(x,y):
    return x+y

sum =  reduce(add,[1,3,5,7,9])
sum

25

def fn(x,y):
    return x*10 + y
a = reduce(fn,[1,3,5,7,9])
print("reduce 执行结果:",a)
reduce 执行结果: 13579

3 filter

def is_odd(n):
    return n % 2 == 1
L = filter(is_odd,[1,2,3,4,5,6,7,8,9,10])
print(list(L))
[1, 3, 5, 7, 9]

def not_empty(s):
    return s and s.strip()

L = filter(not_empty,['A','','B',None,'C',' '])
print(list(L))

4 sorted

sorter1 = sorted([1,3,6,-20,34])
print('升序排列:',sorter1)
升序排列: [-20, 1, 3, 6, 34]

sorter2 = sorted([1,3,6,-20,-70],key=abs,reverse=True)
print("自定义反向排序:",sorter2)
自定义反向排序: [-70, -20, 6, 3, 1]
# 4.2 字符串排序依照 ASCII
sorter3 = sorted(["ABC","abc","D","d"])
print("字符串排序:",sorter3)

字符串排序: [‘ABC’, ‘D’, ‘abc’, ‘d’]

# 4,3 忽略大小写排序
sorter3 = sorted(["ABC","abc","D","d"],key=str.lower)
print("字符串排序:",sorter3)

字符串排序: [‘ABC’, ‘abc’, ‘D’, ‘d’]

# 4.4 忽略大小写的字符串反向排序
sorter3 = sorted(["ABC","abc","D","d"],key=str.lower,reverse=True)
print("忽略大小写排序反向字符串排序:",sorter3)

5 lambda

f = lambda a,b,c:a + b +c
print("2+3+4 的结果:", f(2,3,4))
2+3+4 的结果: 9
L=map(lambda x:x*x,[1,2,3,4,5,6,7,8,9])
for x in L:
    print(x)

6 sorted的进阶

class Student:
    def __init__(self, age,name) -> None:
        self.name = name
        self.age = age

stu1 = Student(11,'aaa')
stu2 = Student(21,'ccc')
stu3 = Student(31,'ddd')

student_list = sorted([stu1,stu2,stu3],key=lambda x:x.age)
for stu in student_list:
    print('name:',stu.name,"age:",stu.age)
name: aaa age: 11
name: ccc age: 21
name: ddd age: 31
student_list = sorted([stu1,stu2,stu3],key=lambda x:x.age,reverse=True)
for stu in student_list:
    print('name:',stu.name,"age:",stu.age)
name: ddd age: 31
name: ccc age: 21
name: aaa age: 11

闭包

在 Python 语言中,闭包意味着要有嵌套定义,内部函数使用外部函数中定义的变量,外部函数返回内部函数名。如果调用一个函数 A,这个函数 A 返回一个函数 B,这个返回的函数 B 就叫作闭包

def func_out(num1):
    def func_in(num2):
        return num1 + num2
    return func_in

f = func_out(10)
result = f(10)
print("结果:",result)

结果: 20

装饰器

给fun1,fun2 增加写日志的功能,进出函数都要写下来,利用闭包的方式,可以不侵入原来的方法,即可完成。


import time
def writeLog(func):
    try:
        f = open("log.txt",'a')
        f.write(func.__name__)
        f.write('\t')
        f.write(time.asctime())
        f.write('\n')
    except Exception as e:
        print(e.args)
    finally:
        f.close()
        
def fun1():

    print('功能 1')
def fun2():
    print('功能 2')
    
#不修改源代码的基础上,添加日志功能
def func_out(func):
    def func_in():
        #调用添加日志功能的方法
        writeLog(func)
        func()
    return func_in
fun_in1=func_out(fun1)
fun_in1()
fun_in2=func_out(fun2)
fun_in2()

装饰器,更方便,就是一个语法糖 @xxx 就是 fun_in1=func_out(fun1)

import time
def writeLog(func):
    try:
        f = open("log.txt",'a')
        f.write(func.__name__)
        f.write('\t')
        f.write(time.asctime())
        f.write('\n')
    except Exception as e:
        print(e.args)
    finally:
        f.close()
 #不修改源代码的基础上,添加日志功能
def func_out(func):
    def func_in():
        #调用添加日志功能的方法
        writeLog(func)
        func()
    return func_in
 @func_out       
 ’def fun1():

    print('功能 1')
@func_out
def fun2():
    print('功能 2')
    
fun1()
fun2()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【python学习】函数式编程和高阶函数 map filter reduce lambda表达式 sorted 闭包 装饰器 的相关文章

随机推荐

  • Eclipse Svn插件各个版本以及对应Svn Connector的下载地址

    Eclipse Svn插件各个版本以及对应Svn Connector的下载地址 http www polarion com products svn subversive download php 可供大家把包下载然后在Eclipse里面进
  • linux内核新版gpio配置

    新版gpio操作
  • 2019年第十届蓝桥杯真题解析

    难度 难 算法 二分法 问题描述 小明公司的办公区有一条长长的走廊 由 N 个方格区域组成 如下图所示 走廊内部署了 K 台扫地机器人 其中第 i 台在第 Ai 个方格区域中 已知扫地机器人每分钟可以移动到左右相邻的方格中 并将该区域清扫干
  • 一键清空朋友圈软件_微信清理朋友圈app下载-微信清理朋友圈下载v1.8.0 安卓版-西西软件下载...

    微信清理朋友圈app一款强大的微信清理工具 当你想要重置自己的微信号并删除所有的内容之时 又觉得一条条删太麻烦了 就可以用到这款神器工具 可以帮助你一键删除掉朋友圈内的所有内容 帮助你轻松的重置微信号 十分的方便 赶快下载微信清理朋友圈ap
  • CentOS系统性能工具 sar 示例!

    安装配置 Sysstat 安装 Sysstat 包 Ubuntu sudo apt get install sysstat CentOS yum install sysstat CentOS rpm ivh sysstat 10 0 0 1
  • 使用FFmpeg进行屏幕录像和录音

    有些时候我们需要对屏幕进行录制 比如制作视频教程 录制直播等 然而这方面的软件多是收费的 即使是免费试用版的还有水印 特别烦人 下面介绍使用FFmpeg进行屏幕录制的方法 Windows 先安装dshow软件 Screen Capturer
  • iOS推送(利用极光推送)

    本文主要是基于极光推送的SDK封装的一个快速集成极光推送的类的封装 不喜勿喷 1 首先说一下推送的一些原理 Push的原理 Push 的工作机制可以简单的概括为下图图中 Provider是指某个iPhone软件的Push服务器 这篇文章我将
  • Linux SSH登录服务器报ECDSA host key “ip地址“ for has changed and you have requested strict checking错误

    Linux SSH命令用了那么久 第一次遇到这样的错误 ECDSA host key ip地址 for has changed and you have requested strict checking 记录下方便记忆 解决方案 在终端上
  • 系统没有wmi服务器,系统没有WMI服务怎么办.WMI错误修复方法

    WMI是一项核心的Windows管理技术 WMI作为一种规范和基础结构 通过它可以访问 配置 管理和监视几乎所有的Windows资源 比如用户可以在远程计算机器上启动一个进程 设定一个在特定日期和时间运行的进程 远程启动计算机 获得本地或远
  • XCTF_Web_新手练习区:simple_js(源代码详解)

    文章目录 第七题 simple js 源代码详解 目标 Writeup 源代码详解 第七题 simple js 源代码详解 目标 掌握有关js的知识 Writeup 进入环境后我们遇到了输入密码 于是我们随便输入一个密码 点击确定 之后啥也
  • Android应用底部导航栏(选项卡)实例

    现在很多android的应用都采用底部导航栏的功能 这样可以使得用户在使用过程中随意切换不同的页面 现在我采用TabHost组件来自定义一个底部的导航栏的功能 我们先看下该demo实例的框架图 其中各个类的作用以及资源文件就不详细解释了 还
  • 十分钟利用windows7漏洞破解开机密码

    所有win7系统都使用 首先连按五下Shift键弹出粘滞键提醒 然后我们点击否后关机 启动系统时将其强制关机 虚拟机利用电源关闭虚拟机 自用主机就在开机时长按关机键强制关闭系统 随后启动系统 我们选择启动启动修复 推荐 选择取消即不还原 等
  • Python数据可视化——折线图

    Python数据可视化 折线图 随着数据分析和数据科学的飞速发展 数据可视化成为了越来越重要的一环 而Python作为一门强大的编程语言 其在数据可视化领域也有着不俗的表现 本文将为大家介绍如何使用Python的Matplotlib库创建一
  • 【Transformers】第 6 章:用于标记分类的微调语言模型

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Vue.config.js常用配置详解

    摘要 本文将介绍Vue config js中常用的配置选项 包括publicPath outputDir devServer chainWebpack等 并提供相应的代码示例 帮助读者更好地理解和配置Vue项目 1 publicPath p
  • 新汽车电子技术图谱

    商业模式 改变传统对于OEM来讲的 卖车即结束 的模式 会员模式 共享模式 租赁模式 运营模式等各种新型的数字出行体验模式 OTA云 远程刷新 远程诊断 远程车控 远程数据上传 第三方App 应用商店 边缘计算 多级云计算 大数据处理 AI
  • Android4.4深入浅出之SurfaceFlinger与Client通信框架(一)

    SurfaceFlinger框架是基于Binder进程间通信机制搭建的 SF作为一个服务进程 用户程序想要跟它通信必然要经过Binder机制 首先说一下 用户要跟SF通信 那么SF必须出现在ServiceManager中 因为SF也是一个服
  • ROS STAGE教程1

    默认路径opt ros kinetic share 下有stage 和 stage ros 到该路径下可运行 rosrun stage ros stageros rospack find stage ros world willow err
  • STM32+HC-05蓝牙模块学习与使用

    HC 05蓝牙串口通信 HC05模块是一款高性能主从一体蓝牙串口模块 是一种集成蓝牙功能的PCBA板 用于短距离无线通信 十分方便 从某宝商家那里可以看到 蓝牙可以使用多种方法使用 这里我使用的是蓝牙主机连接 所以我们这里需要准备的器件 两
  • 【python学习】函数式编程和高阶函数 map filter reduce lambda表达式 sorted 闭包 装饰器

    函数式编程就是一种抽象程度很高的编程范式 纯粹的函数式编程语言编写的函数没有变量 因此 任意一个函数 只要输入是确定的 输出就是确定的 这种纯函数我们称之为没有副作用 而允许使用变量的程序设计语言 由于函数内部的变量状态不确定 同样的输入