6种更优雅书写Python代码!

news2024/11/25 14:44:22

1 简介

一些比较熟悉pandas的读者朋友应该经常会使用query()eval()pipe()assign()pandas的常用方法,书写可读性很高的「链式」数据分析处理代码,从而更加丝滑流畅地组织代码逻辑。

但在原生Python中并没有提供类似shell中的管道操作符|R中的管道操作符%>%等语法,也没有针对列表等数组结构的可进行链式书写的快捷方法,譬如javascript中数组的map()filter()some()every()等。

正所谓“标准库不够,三方库来凑”,Python原生对链式写法支持不到位没关系,我们可以使用一些简单方便且轻量的第三方库来协助我们在Python代码中大面积实现链式写法,今天的文章中我就将带大家一起学习相关的知识技巧~

2 在Python中配合pipe灵活使用链式写法

我们将使用到pipe这个第三方库,它不仅内置了很多实用的「管道操作函数」,还提供了将常规函数快捷「转换」为管道操作函数的方法,使用pip install pipe对其进行安装即可。

pipe的用法非常方便,类似shell中的管道操作:以你的数组变量为起点,使用操作符|衔接pipe内置的各个常见管道操作函数,组装起自己所需的计算步骤即可,譬如,我们筛选输入数组中为偶数的,再求平方,就可以写作:

import pipe

list(
    range(10) | 
    pipe.filter(lambda x: x % 2 == 0) | 
    pipe.select(lambda x: x ** 2)
)

因为pipe搭建的管道默认都是惰性运算的,直接产生的结果是生成器类型,所以上面的例子中我们最外层套上了list()来取得实际计算结果,更优雅的方式是配合pipe.Pipe(),将list()也改造为管道操作函数:

from pipe import Pipe

(
    range(10) | 
    pipe.filter(lambda x: x % 2 == 0) | 
    pipe.select(lambda x: x ** 2) |
    Pipe(list)
)

在上面的简单例子中我们使用到的filter()select()等就是pipe中常见的管道操作函数,事实上pipe中的管道操作函数相当的丰富,下面我们来展示其中一些常用的:

2.1 pipe中常用的管道操作函数

2.1.1 使用traverse()展平嵌套数组

如果你想要将任意嵌套数组结构展平,可以使用traverse()

(
    [1, [2, 3, [4, 5]], 6, [7, 8, [9, [10, 11]]]] | 
    pipe.traverse | 
    Pipe(list)
)

2.1.2 使用dedup()进行顺序去重

如果我们需要对包含若干重复值的数组进行去重,且希望保留原始数据的顺序,则可以使用dedup(),其还支持key参数,类似sorted()中的同名参数,实现自定义去重规则:

(
    [-1, 0, 0, 0, 1, 2, 3] | 
    pipe.dedup |
    Pipe(list)
)

(
    [-1, 0, 0, 0, 1, 2, 3] | 
    # 基于每个元素的绝对值进行去重
    pipe.dedup(key=abs) |
    Pipe(list)
)

2.1.3 使用filter()进行值过滤

我们最开始的例子中使用过它,用法就是基于传入的lambda函数对每个元素进行条件判断,并保留结果为True的,与javascript中的filter()方法非常相似:

(
    [1, 4, 3, 2, 5, 6, 8] |
    # 保留大于5的元素
    pipe.filter(lambda x: x > 5) |
    Pipe(list)
)

2.1.4 使用groupby()进行分组运算

这个函数非常实用,其功能相当于管道操作版本的itertools.groupby(),可以帮助我们基于lambda函数运算结果对原始输入数组进行分组,通过groupby()操作后直接得到的结果是分组结果的二元组列表,每个元组的第一个元素是分组标签,第二个元素是分到该组内的各个元素:

基于此,我们可以衔接很多其他管道操作函数,譬如衔接select()对分组结果进行自定义运算:

2.1.5 使用select()对上一步结果进行自定义遍历运算

这个函数是pipe()中核心的管道操作函数,通过前面的若干例子也能弄明白,它的功能是基于我们自定义的函数,对上一步的运算结果进行遍历运算。

2.1.6 使用sort()进行排序

相当于内置函数sorted()的管道操作版本,同样支持keyreverse参数:

上述内容足以支撑大部分日常操作需求,你也可以在https://github.com/JulienPalard/Pipe中查看pipe的更多功能介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92841.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MMPs-PEG-BSA 多基质金属蛋白酶-聚乙二醇-牛血清白蛋白

产品名称:多基质金属蛋白酶-聚乙二醇-牛血清白蛋白 英文名称:MMPs-PEG-BSA 质量控制:95% 原料分散系数PDI:≤1.05 存储条件:-20C,避光,避湿 用 途:仅供科研实验使用,不用…

RK3399平台开发系列讲解(中断篇)掌握信号处理

🚀返回专栏总目录 文章目录 一、信号的基本概念二、信号处理流程三、可重入与异步信号安全3.1、可重入函数3.2、异步信号安全沉淀、分享、成长,让自己和他人都能有所收获!😄 📢信号在操作系统中有悠久的历史,信号的概念和使用方式都非常简单,但是要编写出真正实用而稳…

Py根据对象的某个属性排序,比大小

目录 核心代码 一个练习题 核心代码 方法1 不对原来的list进行改变 m sorted(需要排序的list集合, keylambda x: x.对象的属性名) 括号中加上reverseTrue表示反转顺序,你默认的顺序是从小到大加上之后变成从大到小OK 方法2 对原来的list进行排序 cmp operator…

javaSE -面向对象编程(包,继承,组合,多态,抽象类,接口)

一、包(package) 1.1、包(package)是组织类的一种方式 包里存的基本上都是类,而这些类都是别人写好的。我们只需要拿着用。前提是导入对应的包 比如说:打印数组 import java.util.Arrays; public class T…

鲜花店如何数字化转型,鲜花店管理小程序

鲜花的用途非常广泛,除了平时祝福送亲友外,还有七夕/情人节送情侣/爱人等,商圈中的各品牌花店也都不少,并且其收益也相当可观,虽然是非必需品,但却又不可缺。 雨科网观察了鲜花行业相关数据报告后&#xff…

基于java+springmvc+mybatis+vue+mysql的学生竞赛模拟系统

项目介绍 本系统采用java语言开发,后端采用springboot框架,前端采用vue技术,数据库采用mysql进行数据存储。 前台: 首页、公交信息、论坛交流、试卷、校园资讯、个人中心、后台管理 后台: 首页、个人中心、用户管理…

别再随意说 Redis 的 SET 保障原子性,在客户端不一定

分布式系统有一个特点,就是无论你学习积累多少知识点,只要在分布式的战线中,总能遇到各种超出主观意识的神奇问题。比如前文使用Jedis来实现分布式锁的技术知识点储备,本以为很稳不会再遇到什么问题,但实际情况却是啪啪…

Android ASM

文章目录逆波兰表达式与字节码的关系中缀表达式转换为逆波兰表达式(后缀表达式)的过程逆波兰表达式求值过程ASM 的使用ASM 常用 api 说明ClassWriter构造函数传参 flags 的作用定义类的属性:visit()定义类的方法:visitMethod()定义…

原生小程序canvas生成图片、保存到本地

今天在视频中看到一个跳动的小球的效果,感觉挺好玩的。于是自己也实现了一个,感觉还是好玩,就想来分享一番;小伙伴们可以来看一下。这次主要为大家玩一下radial-gradient和动画阴影的调试。 效果呈上 代码来了 大家可以先仔细阅…

Docker安装(图文教程)

一、Docker简介 1、Docker是什么 (1)Docker是一种虚拟化容器技术。Docker基于镜像,可以秒级启动各种容器。每一种容器都是一个完整的运行环境,容器之间互相隔离。(2)在Docker的官方,提供了很多容…

Java培训之Nginx启动

1. Nginx启动 启动问题 进入/usr/local/nginx/sbin目录,运行命令./nginx 即可启动nginx nginx无法启动: libpcre.so.1/libpcre.so.0: cannot open shared object file解决办法 Java培训之Nginx启动 解决方法: ln -s /usr/local/lib/libpcre.so.1 /l…

web前端网页设计期末课程大作业:HTML旅游网页主题网站设计——酒店主题网站设计—酒店阳光温馨网站(5页)HTML+CSS+JavaScript

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

[附源码]Nodejs计算机毕业设计基于的汉服服装租赁系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

32-Vue之ECharts-雷达图

ECharts-雷达图前言雷达图特点雷达图的基本实现雷达图的常见效果显示数值区域面积绘制类型完整代码前言 本篇来学习写雷达图 雷达图特点 可以用来分析多个维度的数据与标准数据的对比情况 雷达图的基本实现 ECharts 最基本的代码结构定义各个维度的最大值准备具体产品的数…

Python编程|手把手教植物大战僵尸,代码开源

前言 如题,手把手教Python实现植物大战僵尸游戏,代码简单易学,无需额外安装Python包,只要有pygame即可,文末获取全部素材及源代码~ 视频演示效果:https://www.bilibili.com/video/BV1cG411u755/?spm_id_…

并发编程之深入理解ReentrantLock和AQS原理

AQS(AbstractQueuedSynchronizer)在并发编程中占有很重要的地位,可能很多人在平时的开发中并没有看到过它的身影,但是当我们有看过concurrent包一些JDK并发编程的源码的时候,就会发现很多地方都使用了AQS,今…

(文章复现)6计及源荷不确定性的电力系统优化调度(MATLAB程序)

目录 参考文章: 代码主要内容: 主程序: 结果图: 参考文章: 考虑源荷两侧不确定性的含风电电力系统低碳调度——崔杨(2020) 代码主要内容: 参照考虑源荷两侧不确定性的含风电的…

JAVA基础讲义06-面向对象

面向对象一、编程思想什么是编程思想面向过程和面向对象面向过程编程思想面向过程思想面向过程实现应用场景面向过程特点面向过程代表语言面向对象介绍面向对象编程思想面向对象的三大特征面向对象思想总结什么是编程面向对象分析方法分析问题的思路和步骤二、类和对象类类的概…

它破解了AI作画的中文语料难题,AIGC模型讲解(以世界杯足球为例)

目录1 扩散模型与AI绘画2 中文语料的挑战3 昆仑天工:AIGC新思路3.1 主要特色3.2 模型蒸馏3.3 编解码与GPT3.4 stable-diffusion3.5 性能指标4 体验中文AI绘画模型5 展望1 扩散模型与AI绘画 AI绘画发展历史始于20世纪60年代,当时人工智能研究者们尝试使用…

springboot启动流程源码分析

一、引入思考的问题 1、springboot未出现之前,我们在在spring项目中如果要使用数据源(比如我们使用druid),需要做哪些事情呢? (1)引入druid的jar包 (2)配置数据源的参…