前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >这竟然是Python标准库,实用却很少人使用的技巧

这竟然是Python标准库,实用却很少人使用的技巧

作者头像
咋咋
发布2021-09-01 12:21:42
3340
发布2021-09-01 12:21:42
举报
文章被收录于专栏:数据大宇宙

前言

你用过 python 的标准库 functools 的 partial 函数吗?

你用过 python 的一个关键字 nonlocal 吗?

那么他们两者结合能做到什么功能?

从一个简单需求开始:

  • 希望 print 的时候,每个内容的分隔符使用逗号。可以通过 sep 参数设置即可

但是每次调用都需要设置 sep 参数,很麻烦。

上一节我们使用字典存放函数参数值,简化了重复设置参数的困扰:

但是,这方式写起来不直观,到处是奇奇怪怪的符号。

有没有一种方式让我们就像调用普通函数一样,却能做到同样效果的方式?

今天我们就来学习标准库中的函数,并且提供他的改良版和应用场景。


functools 的 partial

重复设置大量参数的场景其实很常见,为此 python 在标准库中提供了解决方式。

  • 行4:partial 函数接受无限个参数,因为被包装的函数的参数是不固定的
  • 第一个参数非常重要,指定了被包装的函数(上图的 axes.text)
  • 他的返回就是一个全新的函数,这个函数与被包装的函数有一样的行为,区别仅仅是有了你预设的参数默认值而已

现在我们可以不断使用他:

  • 行3:可以提供新的参数值,也可以覆盖预设的参数

这家伙完全做到了上一节的效果,并且使用上非常直观舒服。

目前为止,这些内容你都可以在网络上搜索到,没有啥特别。

但是,大概了解其运行机制,有助于我们写出标准库不能直接提供的功能。

接下来,就是原理和改进环节


原理

初学者往往把 partial 的实现的功能看作是黑魔法,但是其实他运用的只是我们上一节说过的原理。

以下是我们自己实现的 partial 简化版:

使用与之前的一样:

如果你看过我以前关于装饰器的文章,你大概马上理解:

  1. 返回另一个不知名的函数(_real_func)
  2. 函数中利用闭包,保存了被包装函数与传入的预设参数值字典(行1中的 func 和 kws)
  3. 当不知名函数被调用时,合并预设和即时传入的参数字典,调用真正的被包装函数

如下是整个调用过程:

  • 当我们调用 my_partial 时,只是执行了红色框的代码,绿色框里面的代码并没有执行
  • 当我们调用 myprint 时,都是执行了一次绿色框中的函数逻辑

知道这些有啥用?现在就来看一个场景:

  • 希望每次调用 myprint,都自增一个层数
  • 每个层数的内容前用不同数量的空格区别开来
  • 每行内容一开始都加上层级名称

想想看,只是靠 functools.partial 是做不到这效果


改进版

这个需求的难点在于,怎么能在每次 myprint 调用后,保存层级状态。

再看看之前的流程图:

  • 每次调用 myprint,都执行了一次 _real_func 这个函数
  • 但是,_real_func 函数是无法保存任何整体,因为执行完毕后,里面的变量就会被清除掉

显然,能保存东西的变量可以定义在 红色区 里面,绿色区之前:

但是,我们是无法直接在 _real_func 里面修改这个变量。这是 python 避免我们误操作的限制。

他也给了相应解除限制的关键字—— nonlocal:

  • 行5:表明我们需要修改上层变量(实际是闭包变量)
  • 行9:修改他

有了这个机制,剩下只是一些细节实现而已:

如果你学过类、对象这些面向对象的知识,你就会发现,上面相当于给最外层的函数(函数==对象)加了一个属性而已 因此,如果使用类来实现此需求会更加符合直觉


你学会了没有?

记得点赞,转发!谢谢支持!

推荐阅读:

  1. 教你Python字典的妙用,消除繁琐的if判断
  2. 字典推导式与解包
  3. Python玩数据入门必备系列(7):最会匹配的集合——字典
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • functools 的 partial
  • 原理
  • 改进版
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档