python小技巧:冻结参数,让你的代码变简洁
2023-03-07 09:05:47 时间
前言
Python 有一些非常使用的模块, functools
就是其中之一。今天我们来说说其中的 partial
函数, partial
函数看起来平平无奇,如果你经常翻看高手们写的库,会发现很多地方都在使用这函数。
入门
我们从一个小场景开始。
现在我们需要读取一个 txt 文件:
with open('文件1.txt',mode='r',encoding='utf8') as f:
print(f.readline())
如果同时加载2个文件:
with open('文件1.txt',mode='r',encoding='utf8') as f:
print(f.readline())
with open('文件2.txt',mode='r',encoding='utf8') as f:
print(f.readline())
初学者都能看出来,这代码很多重复的内容,怎么简化?
方式1:
def my_open_file(file):
return open(file,mode='r',encoding='utf8')
with my_open_file('文件1.txt') as f:
print(f.readline())
with my_open_file('文件2.txt') as f:
print(f.readline())
- 思路很简单,把重复的函数整个提到自定义函数里面,把变化的文件路径定义成参数
方式2:
open_kws = {'mode':'r','encoding':'utf8'}
with open('文件1.txt',**open_kws) as f:
print(f.readline())
with open('文件2.txt',**open_kws) as f:
print(f.readline())
- 利用 python 的字典解包入参,从参数上提取
这些方式都略显麻烦
方式2有其应用场景,以后再展开讲解
冻结参数
"出场仪式"还是需要的:
from functools import partial
类似前面的方式1,` partial
` 函数提供了一个更简洁的方式
my_open_file = partial(open,mode='r',encoding='utf8')
with my_open_file('文件1.txt') as f:
print(f.readline())
with my_open_file('文件2.txt') as f:
print(f.readline())
- partial 第一个参数传入需要"冻结参数" 的目标函数 open
- 后面接的参数,就像在调用 open 函数一样设置即可
上面我们使用关键字设置参数,当然也可以按位置传入参数,或者混合使用。
def show_nums(a,b,c):
print(a,b,c)
show_free_c = partial(show_nums,1,2)
show_free_c(3) # >>> 1 2 3
show_free_b = partial(show_nums,1,c=3)
show_free_b(2) # >>> 1 2 3
接下来就要说说 partial
的小缺点
不是函数
partial
生成的是一个 partial
对象,他不是函数对象,这意味着它生成出来的东西丢失了函数说明。
现在为之前例子中的函数加上一些注释:
可以看到在 vscode 上可以正常显示信息。但是经过 partial
得到的新函数却什么都看不到:
所以一般情况下,我们都是在一个局部小范围内使用 partial
,比如在自定义模块内部使用,尽可能避免让 partial
生成的对象供外部的调用者直接使用
记得点赞、转发、收藏,一键三连~~~
推荐文章:
相关文章
- 图像处理工具Python扩展库,你了解吗?
- 十个常用的损失函数解释以及Python代码实现
- 30 个数据科学工作中必备的 Python 包
- 如何在 Windows 上安装 Python
- 几行 Python 代码就可以提取数百个时间序列特征
- 使用Python快速搭建接口自动化测试脚本实战总结
- 哪种编程语言最适合开发网页抓取工具?
- 不要在 Python 中使用循环,这些方法其实更棒!
- 震惊!用Python探索《红楼梦》的人物关系!
- 如何最简单、通俗地理解Python模块?
- 酷炫,Python实现交通数据可视化!
- 为什么急于寻找Python的替代者?
- 30 个数据工程必备的Python 包
- 去字节面试被面这题能答上来吗?谈谈你对时间轮的理解?
- 火山引擎在行为分析场景下的 ClickHouse JOIN 优化
- 用Python爬取了某宝1166家月饼数据进行可视化分析,终于找到最好吃的月饼~
- 在 Linux 上试试这个基于 Python 的文件管理器
- Python列表解析式到底该怎么用?
- 如何快速把你的 Python 代码变为 API
- 十个Python初学者常犯的错误