9个不为人知的Python技巧
有很多介绍Python中各种很酷的功能(如变量拆包、偏函数、枚举可迭代对象)的文章,但说到Python时,还有很多东西可以谈论,这里我将尝试展示我所知道和使用的一些特性,我还没有在其他地方看到有人提到过它们。我们开始吧。
清理字符串输入
对用户输入进行清理的问题几乎适用于您编写的所有程序。通常情况下,将字符转换为小写或大写就足够了,有时您可以使用Regex来完成这项工作,但对于复杂的情况来说,可能有更好的方法:
在本例中,您可以看到空白字符“\n”和“\t”已被单个空格替换,而“\r”已被完全删除。这是一个简单的例子,但是我们可以更进一步,使用unicodedata包和它的combining()函数来生成并进行映射,从而生成更大的重新映射表,我们可以使用它来删除字符串中的所有重音。
对迭代器进行切片
如果您尝试对一个迭代器进行切片,您会得到一个TypeError,这说明生成器对象是不可下标访问的,但有一个简单的解决方案可以解决这个问题:
使用itertools.islice我们可以创建一个islice对象,它是一个会生成所需项的迭代器。需要注意的是,这将消耗slice开始之前的所有生成器项,以及islice对象中的所有项。
跳过可迭代对象的开始部分
有时您必须处理那些以您不想要的可变数量的行(如注释)开始的文件。itertools再次为这个问题提供了简单的解决方案:
这代码段只生成初始注释部分之后的行。如果我们只想在可迭代对象的开头丢弃一些项目(本例中是一些行),并且不知道有多少个项目,那么这种方法是很有用的。
只带有关键字参数(kwargs)的函数
在使用以下这样的函数时,创建只接受关键字参数的函数来提供(强制)更多的清晰性是很有帮助的:
正如您所看到的,这可以通过在关键字参数之前放置单个*参数来轻松解决。如果我们把位置参数放在*参数之前,位置参数显然也会存在。
创建支持with语句的对象
例如,我们都知道如何使用with语句来打开文件或获取锁,但是我们可以实现自己的with语句吗? 当然,我们可以使用__enter__和__exit__方法来实现上下文管理协议:
这是在Python中实现上下文管理最常见的方法,但是还有更简单的实现方法:
上面的代码片段使用contextmanager管理器装饰器实现了内容管理协议。在进入with块时,tag函数(在yield之前)的第一部分会被执行,然后该with块被执行,最后,tag函数的其余部分会被执行。
使用__slots__节省内存
如果您曾经编写过一个创建某个类的大量实例的程序,您可能会注意到您的程序会突然需要大量内存。这是因为Python使用字典来表示类实例的属性,这使得它的速度很快,但是内存效率不高,这通常并不是一个问题。然而,如果它成为您的程序的一个问题时,您可以尝试使用__slots__:
这里的情况是,当我们定义了__slots__属性时,Python会使用小的固定大小的数组而不是字典来定义属性,这大大减少了每个实例所需的内存。使用__slots__也有一些缺点——我们不能声明任何新的属性,并且我们只能使用在__slots__上这些属性。而且,带有__slots__的类不能使用多重继承。
限制CPU和内存的使用
如果您不想优化您的程序内存或CPU使用,您只想把它限制在某个固定大小的内存上,那么Python也有一个这样的库来做到这一点:
这里我们可以看到设置最大CPU运行时间和最大内存使用限制的两个选项。对于CPU限制,我们首先获取特定资源(RLIMIT_CPU)的软限制和硬限制,然后使用参数指定的秒数和前面检索到的硬限制来设置它。最后,我们注册信号,如果CPU时间超过限制,该信号会导致系统退出。对于内存,我们再次检索软限制和硬限制,并使用带有大小参数的setrlimit和检索的硬限制来设置它。
控制什么可以导入,什么不可以导入
一些语言有非常明显的导出成员(变量、方法、接口)的控制机制,例如Golang,其中只有以大写字母开头的成员会被导出。另一方面,在Python中,所有东西都可以被导出,除非我们使用__all__:
根据上面的代码片段,我们知道只有bar函数会被导出。同样,我们可以让__all__为空,这样,当我们从这个模块导入的时候,任何东西都不会被导出,并且会导致AttributeError。
实现比较运算符的简单方式
考虑到目前已经有相当多的比较操作符——__lt__ 、__le__ 、 __gt__ 或 __ge___,因此,为一个类实现所有的比较操作符是相当烦人的。但如果有更简单的方法可以实现呢?functools.total_ordering就派上用场了:
那么,这到底是怎么工作的呢?total_ordering装饰器用于简化实现类实例排序的过程。我们只需要定义__lt__和__eq__,它们是剩余操作的映射所需的最小值,装饰器就会为我们填充空白。
结论
并不是所有这些特性在日常的Python编程中都是必需的和有用的,但是它们中的一些可能会不时地派上用场,而且它们还可能会简化那些在其他情况下会非常冗长和难以实现的任务。我也想说明的是,所有这些特性是Python标准库的一部分,而其中的一些在我看来就像标准库中所具有的相当不标准的东西,所以当您想使用Python实现某些东西的时候,您首先应该去标准库中寻找它,如果您不能找到它,那么您可能还是不够努力(如果真的没有,那它肯定在一些第三方库中)。
英文原文:https://martinheinz.dev/blog/1
译者:测试
9个不为人知的Python技巧相关推荐
- 程序员必知的20个Python技巧
作者 | Duomly 译者 | 弯月,编辑 | 郭芮 出品 | CSDN(ID:CSDNnews) Python是一门流行且应用广泛的通用编程语言,其应用包括数据科学.机器学习.科学计算等领域,以及 ...
- 你需要知道的20个常用的Python技巧
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习算法那些事 Python的可读性和简单性是其广受 ...
- python%20语言 20培训_Python语言学习之20个值得学习的Python技巧
点击蓝字获取更多精彩信息 1.字符串反转 使用切片反转字符串. str1="qwert" rev_str1=str1[::-1] #输出 # trewq 2.使首字母 ...
- 【python技巧】“”、“”等符号操作
[python技巧] 1)[关于'&' :按照二进制进行与操作,可以用作判断奇偶][https://zhidao.baidu.com/question/308587899.html] & ...
- 离散度计算公式 python_被多种离散化场景困扰?8种python技巧!让数据处理更简单...
前言 python数据处理与分析学习过程中,需要有这样的一种意识,即元"为什么选择了python而不是其他?"既然选择了python,那么在实际应用中,它到底哪里不一样?大家说的方 ...
- python大型项目经验_经验丰富程序员才知道的8种高级Python技巧
全文共2330字,预计学习时长11分钟 图源:unsplash 本文将介绍8个简洁的Python技巧,若非经验十足的程序员,你肯定有些从未见过.向着更简洁更高效,出发吧! 1.通过多个键值将对象进行排 ...
- python生成uuid_咸鱼高赞回答:有什么相见恨晚的Python技巧,附赠python最新教程...
日常工作几乎离不python.一路走来,他积累了不少有用的技巧和tips,现在就将这些技巧分享给大家.这些技巧将根据其首字母按A-Z的顺序进行展示. Python相关学习资料获取方式:转发文章+关注私 ...
- python初学者_面向初学者的20种重要的Python技巧
python初学者 Python is among the most widely used market programming languages in the world. This is be ...
- 你与数据科学家只差这26条python技巧
戳蓝字"CSDN云计算"关注我们哦! 作者 | Peter Gleeson 来源 | Python数据科学 编译 | wLsq Python是目前世界上最流行的编程语言之一.因为: ...
最新文章
- 【C#公共帮助类】10年代码,最全的系统帮助类
- 全球自动驾驶政策概况及特征研究
- eclipse安装hadoop插件及配置
- 嵌入式linux开发环境搭建——VirtualBox虚拟机网络环境解析
- 天梯赛 L1-025 正整数A+B (15 分)
- 判断pc浏览器和手机浏览器方法
- pycharm显示全部数据_PyCharm第一次安装及使用教程
- 记一次,jvm 内存溢出
- 二、Spring MVC之常用注解
- 超全的软件测试工具大全
- 时装连连看,基于MindSpore实现FashionMNIST图像分类
- OutMan——Foundation框架中的集合类(三)
- Guessing Game
- UOS其他分区及移动硬盘带锁问题处理
- 蓝桥杯嵌入式第十二届省赛真题
- 冈萨雷斯《数字图像处理》学习笔记(九)形态学图像处理
- 平衡车轮子控制器使用
- HPE服务器使用SPP刷新固件方法
- 【申报通知】关于组织开展广东省2022年高新技术企业认定工作的通知
- 泰捷we30c系统语言,系统简洁无广告 不堆硬件用户至上-泰捷WE30C升级版电视盒子...