【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 闭包 装饰器 的相关文章

  • 尽管极其懒惰,但如何在 Python 中模拟 IMAP 服务器?

    我很好奇是否有一种简单的方法来模拟 IMAP 服务器 例如imaplib模块 在Python中 without做很多工作 是否有预先存在的解决方案 理想情况下 我可以连接到现有的 IMAP 服务器 进行转储 并让模拟服务器在真实的邮箱 电子
  • 下载 PyQt6 的 Qt Designer 并使用 pyuic6 将 .ui 文件转换为 .py 文件

    如何下载 PyQt6 的 QtDesigner 如果没有适用于 PyQt6 的 QtDesigner 我也可以使用 PyQt5 的 QtDesigner 但是如何将此 ui 文件转换为使用 PyQt6 库而不是 PyQt5 的 py 文件
  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • 如何生成给定范围内的回文数列表?

    假设范围是 1 X 120 这是我尝试过的 gt gt gt def isPalindrome s check if a number is a Palindrome s str s return s s 1 gt gt gt def ge
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 安装后 Anaconda 提示损坏

    我刚刚安装张量流GPU创建单独的后环境按照以下指示here https github com antoniosehk keras tensorflow windows installation 但是 安装后当我关闭提示窗口并打开新航站楼弹出
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql

随机推荐

  • 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 闭包 装饰器

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