专栏首页Crossin的编程教室分享几个冷门Python技巧

分享几个冷门Python技巧

大家好,欢迎来到 Crossin的编程教室 !

有很多文章介绍了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 作者:Martin Heinz 译者:测试

本文分享自微信公众号 - Crossin的编程教室(crossincode)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-02-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 分享几个js小技巧

    可以使用 Array.includes(Array.includes) 重写以上条件句。

    薛定喵君
  • 这几个冷门但实用的 Python 技巧你知道吗?

    这篇文章主要和大家分享一些 Python 不一样的技巧,感受 Python 带给你的乐趣吧。

    Crossin先生
  • 分享几个 SpringBoot 实用的小技巧

    最近分享的一些源码、框架设计的东西。我发现大家热情不是特别高,想想大多数应该还是正儿八经写代码的居多;这次就分享一点接地气的: SpringBoot 使用中的一...

    Java团长
  • 《Pandas 练习 75 题 原版》、《Python 一行代码》、《Pandas 数据分析小技巧系列》汇总

    最近两周周末也都加班,只能利用有限的业余时间,写写深爱着的公众号文章,三年来从未改变过,因为有一个又一个你在守候。

    double
  • 给大家分享几个操作上的技巧~~~

    WolframChina
  • python技巧分享(一)

    songleo
  • python技巧分享(二)

    songleo
  • python技巧分享(三)

    songleo
  • python技巧分享(四)

    songleo

扫码关注云+社区

领取腾讯云代金券