恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

分钟解读 Python 中的链式调用

  • 首页
  • 资讯中心
  • /
  • 分钟解读 Python 中的链式调用

相关资讯

解析“花光千亿资产”模拟器:玩法、技术形态与前端实现 2026/9/4 18:58:34
AI音频生成项目Notion本地部署指南:从环境搭建到效果评估 2026/9/4 18:58:34
重新认识生成器generator 2026/9/4 18:53:34

最新资讯

Python实战:从微博爬虫到情感分析的舆情系统构建
扫描数据进UE:从点云到流式传输的开源管线全解析
从扫描数据到UE流式加载:开源3D数据管线完整实战指南
ESP32-S3 N16R8模组深度解析:从选型到量产实践
FPGA测控程序框架设计:模块化拆分与数据流实战指南
Visual C++原生XML解析器实现:从零构建无依赖DOM树与状态机解析

今日推荐

爬虫防护实操:出海网站拦截恶意采集、垃圾爬虫、无效刷量,CDN 精准防护落地指南
STM32H743 SPI从机DMA双缓冲通信实战
CPU开盖降温教程:20元成本让温度直降30度的原理与实践

本周热门

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析
数字电路时序基石:深入理解建立时间与保持时间
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

分钟解读 Python 中的链式调用

发布时间:2026/9/4 18:58:34
分钟解读 Python 中的链式调用 要是你有计划去开展涉及数据分析, 或者数据挖掘等数据科学范畴的工作, 又或者像我这般当下正从事相关领域工作, 那么「链式调用」对于我们来讲是一门必须修习的课程。为什么是链式调用一种也被叫做方法链的链式调用, 按字面意思来讲, 是把一系列操作或函数方法用像链子那样的方式穿起来的 Code 方式。最初, 我察觉到并真正领会那链式调用之中所蕴含的「美」的契机、时刻, 得追溯到起始于运用 R 语言的管道操作符之时。library(tidyverse) mtcars %% group_by(cyl) %% summarise(meanOfdisp mean(disp)) %% ggplot(aes(xas.factor(cyl), ymeanOfdisp, fillas.factor(seq(1,3)))) geom_bar(stat identity) guides(fillF)就 R user 而言, 对于这一段代码, 能够很快明白整个流程步骤究竟是怎样的。这所有的一切, 都是借助符号%%管道操作符展开讨论的。借助管道操作符, 我们能够把左边的事物传送给紧接着的事物, 在这里, 我把数据集传至函数里头, 随后把获取到之后的结果再度传至函数, 最终传至函数之中去做可视化绘制。要是我未曾掌握链式调用, 那么最初学习R语言的我必然会这般去写。library(tidyverse) cyl4 - mtcars[which(mtcars$cyl4), ] cyl6 - mtcars[which(mtcars$cyl6), ] cyl8 - mtcars[which(mtcars$cyl8), ] data - data.frame( cyl c(4, 6, 8), meanOfdisp c(mean(cyl4$disp), mean(cyl6$disp), mean(cyl8$disp)) ) graph - ggplot(datadata, aes(xfactor(cyl), ymeanOfdisp, fill as.factor(seq(1,3)))) graph - graph geom_bar(stat identity) guides(fillF) graph若是不运用管道操作符, 那我将会开展没必要的赋值, 且进行原有数据对象的覆盖, 然而实际上其中产生的cyl#、data, 最终都仅仅是为graph这一幅图片提供服务的, 所以致使的问题便是代码会变得繁杂冗余。一种在极大程度上简洁代码之际, 又提高了代码可读性的方式, 是能快速知晓每一步所做之事的链式调用 , 它在做数据分析或者处理数据之时十分有用 , 在减少创建不必要变量时 , 能以快速且简单的方式来进行探索。你能够于诸多地方看见链式调用抑或管道操作的踪迹, 在此处我列举出除R语言之外的两个典型示例。一个是 Shell 语句echo seq 1 100 | grep -e ^[3-4].* | tr 3 *于 shell 语句里运用「|」管道操作符, 可迅速达成链式调用行为, 在此处, 我先是打印出 1 至 100 的全部整数, 接着把这些整数传递至 grep 方法内, 从中提取以 3 或者 4 起始的所有部分, 随后再将此部分传入至 tr 方法里, 并且把数字含有 3 的部分用星号进行替换, 所呈现的结果如下这样子顿号逗号括号括号顿号句号问号叹号引号冒号加号等于好的句号句号句号句号句号句号句号句号句号。另外一个是 Scala 语言object Test { def main(args: Array[String]): Unit { val numOfseq (1 to 100).toList val chain numOfseq.filter(_%20) .map(_*2) .take(10) } }在这段示例里头, 首先呢, 这个变量涵盖了从1至100的全部整数, 接着从chain部分起始, 我先是在其基础之上调用了方法, 用来筛选这些数字里属于偶数的那部分, 其次又调用map方法, 把这些被筛选出来的数乘上2最后运用take方法从新形成的数字那儿取出前10个数, 这些数一起被赋值给了chain变量。依据上面所讲的内容, 想必你能够对于链式调用形成一个初步的印象, 然而一旦你掌握了链式调用, 那么除了会致使你的代码风格产生些变化之外, 你的编程思维也会有着不一样的提高。中的链式调用在其中达成一个简易的链式调用, 便是借助构建类方法, 并且返回对象自身, 或者返回归属类。class Chain: def __init__(self, name): self.name name def introduce(self): print(hello, my name is %s % self.name) return self def talk(self): print(Can we make a friend?) return self def greet(self): print(Hey! How are you?) return self if __name__ __main__: chain Chain(name jobs) chain.introduce() print(-*20) chain.introduce().talk() print(-*20) chain.introduce().talk().greet()于此我们构建一个Chain类要递送一个name字符串参数来实施实例对象的构建, 在这个类当中存在三个方法, 各是、talk以及greet。因每次返回的皆是self自身, 所以我们能够持续不断地调用对象归属类里的方法, 其结果如下:hello, my name is jobs -------------------- hello, my name is jobs Can we make a friend? -------------------- hello, my name is jobs Can we make a friend? Hey! How are you?在 中使用链式调用前面铺垫了这么多终于谈到有关于 链式调用部分其中的多数方法都颇为适宜运用链式方法来开展操作, 缘由在于经由 API 处理之后所返回的常常依旧是类型或者类型, 因此我们能够径直就去调用相应的方法, 在此我以我于今年 2 月份前后给他人所做案例演示之际爬取到的华农兄弟 B 站视频数据作为例子。能够借助链接予以获取。数据字段的相关信息呈现如下情形, 其中存在着三百条数据, 而且有着二十个字段。字段信息但在运用这部分数据之前, 我们还得针对这部分数据开展初步的清洗工作, 在此我主要挑选了以下这些字段。1、数据清洗各字段对应的值如下所示字段值从数据中我们可以看到「华农兄弟」这四个字都会出现在title字段的前面, 要是统计标题字数, 就得预先把它去掉。上传日期看起来是一溜长长的数值, 实际上是1970年至今的时间戳, 我们要把它处理成能读懂的年月日格式。播放量长度仅显示了分秒, 小时却没用「00」补全, 所以这方面我们既要完成补全, 又要把它转换成对应的时间格式。链式调用操作如下import re import pandas as pd # 定义字数统计函数 def word_count(text): return len(re.findall(r[\u4e00-\u9fa5], text)) tidy_data ( pd.read_csv(~/Desktop/huanong.csv) .loc[:, [aid, title, created, length, play, comment, video_review]] .assign(title lambda df: df[title].str.replace(华农兄弟, ), title_count lambda df: df[title].apply(word_count), created lambda df: df[created].pipe(pd.to_datetime, units), created_date lambda df: df[created].dt.date, length lambda df: 00: df[length], video_length lambda df: df[length].pipe(pd.to_timedelta).dt.seconds ) )这儿先是借由loc方法从中挑出列, 接着调用方法去创建新字段, 新字段若其字段名跟原来的字段相符, 那就会实施覆盖, 于此我们能够清晰看到其中字段的产生过程, 跟表达式展开交互:1.title 和2.和3. 和2、播放量趋势图利用基于前边经过稍微清洁之后所获取到的数据, 我们能够迅速进行一份播放量走势的探寻。在此处, 我们要运用这个归属的字段当作 X 轴, 将播放量 play 字段作为 Y 轴来开展可视化呈现。# 播放量走势 %matplotlib inline %config InlineBackend.figure_format retina import matplotlib.pyplot as plt (tidy_data[[created, play]] .set_index(created) .resample(1M) .sum() .plot( kindline, figsize(16, 8), titleVideo Play Prend(2018-2020), gridTrue, legendFalse ) ) plt.xlabel() plt.ylabel(The Number Of Playing)这里, 我们把上传日期跟播放量这两个筛选出来, 要先设为索引, 才可以接着用重采样的办法开展聚合操作。这里, 我们以月作为统计颗粒度, 对每个月的播放量予以加总, 之后再调用plot接口达成可视化操作。链式调用存在着这样一个小技巧, 那就是说, 能够借助括号作用域具备的连续特性, 从而让整个链式调用的操作不会出现报错的情况, 当然了, 如果有人不喜欢采用这种方式的话, 那么也能够手动在每一条操作的后面追加一个\符号, 所以呢, 上面所提到的整个操作就会变成现在这样:tidy_data[[created, play]] \ .set_index(created) \ .resample(1M) .sum() .plot( \ kindline, \ figsize(16, 8), \ titleVideo Play Prend(2018-2020), \ gridTrue, \ legendFalse \ )但相较于追加一对括号而言, 这种在尾部追加\符号的方式, 并不被推荐, 且也不显得优雅。不过呢, 要是既不存在于括号作用的范围之内, 又没有去追加那个反斜杠符号, 那么在程序运行的时候, 解释器就会出现报错的情况。3、链式调用性能从前两个案例能够看得出, 链式调用算得上是较为优雅且能够迅速地达成一套数据操作的流程, 不过哩, 链式调用也会因不同的写法而存有性能方面的差异了。这里, 我们持续依据前面的操作去做, 这里, 我们就凭借那个来针对play、还有和进行求和之后所获的数值进一步拿10作为底数来进行对数化。最终, 需要得出以下的结果:统计表格写法一一般写法一般写法这种写法是基于拷贝之后开展操作, 操作所获取的结果会持续不断地去覆盖原本存在的数据对象。写法二链式调用写法链式调用写法能够见到, 链式调用此番写法跟一般写法开展比较会快那么些许, 然而呢因为数据量相对较小这种情况的存在, 所以二者时间方面所显示出的差异并非特别大可是链式调用鉴于无需有额外的中间变量以及覆盖写入这一步骤, 于内存开销这块会少一点。结尾链式调用的优劣透过本文零零碎碎的话语, 你能够领会到链式调用让代码在可读懂性方面显著地得到了提升, 与此同时, 运用尽可能精简的代码数量去达成更多的操作。当然了, 链式调用并非是毫无瑕疵的那种完美, 它也是存在着一定程度缺陷的。比如说, 当链式调用的方法数量超过 10 步以上这个情况发生时, 那么出错的几率就会呈现出大幅度提高的态势, 进而造成调试或者 Debug 的困难。就像这样:(data .method1(...) .method2(...) .method3(...) .method4(...) .method5(...) .method6(...) .method7(...) # Something Error .method8(...) .method9(...) .method10(...) .method11(...) )你仅能够, 从链式调用的方法体里, 按照从尾而后倒向头部的顺序, 一步步地, 对发生问题的确切地方进行重现。因此使用链式调用时一定必须要考虑以下问题对于操作数据时, 是否需要借助中间变量, 其中的步骤, 是否需要进行拆解分开做, 而每次操作过后所得到的结果, 是否依旧成为那种类型呢?假使无需中间变量, 步骤无需拆分, 且确保最终返回之物即为类型, 那么便愉悦地运用链式调用方式来达成你的数据流程吧此人乃练习时长不足两年的非正统文科生, 钟情于敲代码, 致力于撰写文章, 热衷于摆弄各类新鲜事物, 当前从事大数据分析与挖掘方面的工作。赞 赏 作 者中文社区, 是 的全球技术社区, 愿景是成为全球 20 万中文开发者的精神部落 , 如今覆盖各大主流媒体与协作平台, 和阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN 等业界知名公司及技术社区建立广泛联系, 有来自十多个国家和地区、数万名登记会员, 会员来自以工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构及海内外知名公司, 全平台近 20 万开发者关注。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号