介绍 Python 功能和小技巧的文章网上有无数篇,比如变量解压缩,partial 偏函数,枚举可迭代对象... 但关于 Python 我们能说的还有很多。所以今天我将向大家展示一些我知道和有使用过的特性,这些特性在其它文章或博客中很少被提及:

消毒字符串输入

对用户输入内容进行消毒几乎适用于你写的每一个程序。通常来说转换字符大小写的操作就足够了,有时候用 Regex 正则表达式就能完成,但对于比较复杂的情况,我们有更好的办法:

user_input = "This\nstring has\tsome whitespaces...\r\n"
character_map = {
ord('\n') : ' ',
ord('\t') : ' ',
ord('\r') : None
}
user_input.translate(character_map) # This string has some whitespaces... "

在这个例子中我们可以看到空格子字符"\n"和"\t"已被单个空格代替,而"\r"已经被删除。这是一个很简单的示例,但我们可以更进一步,并使用unicodedata包和它的 combining() 函数来重新生成映射。

迭代器切片

如果尝试对 Iterator 进行切片,则会出现 TypeError和"generator object is not subscriptable"的报错,但我们有一个简单的解决办法:

import itertools
s = itertools.islice(range(50), 10, 20) # <itertools.islice object at 0x7f70fab88138>
for val in s:
...

通过使用 itertools.islice我们可以创建一个 islice对象,该对象是产生所需项目的迭代器。不过这里需要注意的是,它会消耗所有的生成器项直到切片的开始为止,而且还会消耗 islice对象中的所有项。

跳过可迭代对象的开始部分

有时候你不得不去处理这样一些文件,它们的开头是毫无用处的行,比如注释之类的。itertools再一次地能在这里派上用场:

string_from_file = """
// Author: ...
// License: ...
//
// Date: ...
Actual content...
"""
import itertools
for line in itertools.dropwhile(lambda line: line.startswith("//"), string_from_file.split
print(line)

这个代码片段只会生成文件开始注释之后的部分。如果我们只想丢弃可迭代对象开头的某些项(比如这个例子中的注释部分),但不确定这个项的大小,这个方法很实用。

创建支持 with声明的对象

大家想必都知道如何用 with声明来打开文件或者获取锁,但我们能实现自己的 with声明吗?是的,实际上通过使用 enter和 exit我们就可以实现一个上下文管理器协议:

class Connection:
def __init__(self):
...
def __enter__(self):
# Initialize connection...
def __exit__(self, type, value, traceback):
# Close connection...
with Connection() as c:
# __enter__() executes
...
# conn.__exit__() executes

这是 Python 中实现上下文管理最常见的方法,但其实还有一种更简单的方法:

from contextlib import contextmanager
@contextmanager
def tag(name):
print(f"<{name}>")
yield
print(f"")
with tag("h1"):
print("This is Title.")

上面的代码片段使用 contextmanager管理器装饰器实现了内容管理协议 。进入 with块时,执行 tag()的第一部分(在 yield之前),然后再执行该块,最后执行 tag()剩下的部分。

用 slots节省内存

如果在你编写的程序中会创建某个类的大量实例,那么你肯定已经注意到你的程序会占用大量内存。这是因为 Python 使用 Dictionary 来表示类实例的属性,虽然它速度很快但内存效率却很低。大部分情况下这个问题并不那么严重,但如果它对你的程序来说是一个大问题,你可以尝试使用 slots

class Person:
__slots__ = ["first_name", "last_name", "phone"]
def __init__(self, first_name, last_name, phone):
self.first_name = first_name
self.last_name = last_name
self.phone = phone

所以这里的情况就是当我们定义slots的属性时,Python 使用的是小型的固定大小的数组,而不是 dictionary,这就大大减少了每个实例所需的内存。使用 slots也有缺点——我们无法声明任何新属性,并且只能在 slots上使用它们。同样,带有 slots的类不能使用多重继承。

限制 CPU 和内存使用

如果你不是想通过优化程序来降低它的 CPU 和内存使用率,而是想简单粗暴地直接限制它为某个数字,那么 Python 中有一个库可以做到:

import signal
import resource
import os
# To Limit CPU time
def time_exceeded(signo, frame):
print("CPU exceeded...")
raise SystemExit(1)
def set_max_runtime(seconds):
# Install the signal handler and set a resource limit
soft, hard = resource.getrlimit(resource.RLIMIT_CPU)
resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))
signal.signal(signal.SIGXCPU, time_exceeded)
# To limit memory usage
def set_max_memory(size):
soft, hard = resource.getrlimit(resource.RLIMIT_AS)
resource.setrlimit(resource.RLIMIT_AS, (size, hard))

这里我们看到了两种限制最大 CPU 运行时间和最大内存使用的方法。对于 CPU 限制,我们首先获得该特定资源( RLIMIT_CPU)的软限制与硬限制,然后使用参数指定的描述和闲钱获取的硬限制来设置它。最后,如果 CPU 时间被超出,我们将注册导致系统退出的信号。至于内存方面,我们再次获取软限制与硬限制,并使用带有 size 参数的 setrlimit和获取的硬限制对其进行设置。

控制可导入和不可导入的内容

有些语言对于到处成员变量,方法和接口有着非常明确的机制,比如 Golang,在 Go 中仅有以大写字母开头的成员才能被导出。另一方面,在 Python 中,所有内容都可以到处,除非我们使用 all

def foo():
pass
def bar():
pass
__all__ = ["bar"]

根据上面的代码片段,我们可以看出只有 bar()会被导出。另外,我们可以将 all保留为空,并且从此模块导入时,不会输出任何 AttributeError。

比较运算符的简便方法

Python 中有很多比较运算符:lt , le , gt 和 ge,但有没有更容易的方法呢?functools.total_ordering就可以办到:

from functools import total_ordering
@total_ordering
class Number:
def __init__(self, value):
self.value = value
def __lt__(self, other):
return self.value < other.value
def __eq__(self, other):
return self.value == other.value
print(Number(20) > Number(3))
print(Number(1) < Number(5))
print(Number(15) >= Number(15))
print(Number(10) <= Number(2))

那么它实际上是怎么工作的呢?total_ordering装饰器用于简化为我们的类实现实力顺序的过程。只需要定义 lt 和 eq,这也是映射剩余操作所需的最低要求,也是装饰器的工作——它为我们填补了这个空缺。在学习Python的过程中,往往因为没有资料或者没人指导从而导致自己不想学下去了,因此我特意准备了个群 592539176 ,群里有大量的PDF书籍、教程都给大家免费使用!不管是学习到哪个阶段的小伙伴都可以获取到自己相对应的资料!

总结

上述的特性与操作都不一定是你在日常 Python 编程中常用到的,但其中一些时不时会让你感到头疼。上面所提供的解决方案大多简化了很多任务,这些任务用较为常见的方法处理都会比较冗长无聊。另外要指出的一点是,所有的这些功能都是 Python 标准库的一部分。在我看来,其中一些功能类似于“标准库中的非标准功能”,因此每当你想要在 Python 中实现某些功能时,首先去标准库里找一找,如果没有这个功能,那肯定是你找得不够仔细,如果实在是没有,再去找相关的第三方库。

关于 Python_你一定没读过的8个技巧相关推荐

  1. 为什么有些没读过书的人做生意却很厉害?

    ‍ ‍ 1.为什么有些没读过书的人做生意却很厉害? 有好学历的人还能做好生意,其实是非常难的. 学滑雪的时候,教练会说,小孩学起来快,因为小孩脑子里没有很多固定习惯,也缺乏恐惧感.但成年人已经有很多固 ...

  2. 基于uml的大学图书馆图书信息管理系统设计实验_气味图书馆 | 这些学校的#后悔没读#和#还想再读#系列...

    有人说,图书馆是大学的心脏. 普鲁斯特曾说形状和轮廓一旦在记忆里模糊,就会失去与意识会合的扩张能力,可是气味不同,它富有生命力. 图书馆就像是大学的这种气味,它平淡无常,静默伫着,却在不知不觉中成了一 ...

  3. 我真的没读野鸡大学!是他们不好好起名字!

    我真的没读野鸡大学!是他们不好好起名字! 新航道在线2017-03-09 16:24:10野鸡大学 大学阅读(13861)评论(10) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅 ...

  4. 没读过大学也能去谷歌当工程师?未来硅谷想要怎样的人才?

    硅谷Live / 实地探访 / 热点探秘 / 深度探讨 去年年中,美国公司及求职信息网站 Glassdoor 发布了美国又有15家大企业表示很多职位将不要求本科学历.以谷歌.苹果为首的一批硅谷大公司开 ...

  5. CVPR和ICLR双榜公布,最离谱审稿人竟然没读论文!

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 来源丨新智元 随着顶会论文越收越多,审稿人手又不够,所以分配到的审稿人也是良莠不齐.最近CVPR 20 ...

  6. windows 读写锁 python_用Python实现读写锁

    起步 简单的实现 import threading class RWlock(object): def __init__(self): self._lock = threading.Lock() se ...

  7. windows 读写锁 python_用Python实现读写锁的示例代码

    起步 Python 提供的多线程模型中并没有提供读写锁,读写锁相对于单纯的互斥锁,适用性更高,可以多个线程同时占用读模式的读写锁,但是只能一个线程占用写模式的读写锁. 通俗点说就是当没有写锁时,就可以 ...

  8. 又是一年读书日,这十本书你居然还没读过?

    世界读书日已到来."华科公管学习部"联合"武大政管学习部"在人文与社科领域荐书阅读,旨在培养大家的阅读与写作兴趣,享受阅读的乐趣,尊重知识与创作. 与当今流行的 ...

  9. CVPR和ICLR双榜公布!最离谱审稿人竟然没读论文!

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 转载自:新智元 |  编辑:好困 LRS [导读]随着顶会论文越收越多,审稿人手又不够,所以分配到的审稿人也 ...

最新文章

  1. 获取树莓派4ip地址(手机热点获取)
  2. 如何对DevOps数据库进行源代码控制
  3. 《head first java 》读书笔记
  4. MySQL binlog
  5. Android --- 很好用的时间选择器
  6. linux与w7之间的切换,w7系统切换窗口怎么操作_教你w7系统切换窗口的几种方法
  7. 【MM 模块】 Optimized Purchasing 优化采购 3
  8. LUA实现单词替换功能
  9. python databaselibrary_Robot Framework下DataBaseLibrary的使用
  10. [禅悟人生]尊严非席, 不可卷起
  11. 美团大脑 | 知识图谱的建模方法及其应用
  12. 循序渐进之Spring AOP(5) - 创建切面
  13. 实例88:构建InfoGAN生成MNIST模拟数据
  14. 云计算给IT产业结构带来的影响
  15. 2012总结之pcode.DefineClass
  16. 计算机网络 --- 物理层(学习笔记)
  17. 尺取法(图文解析、初学推荐)
  18. iphone、ipad机型分辨率
  19. D. Nastia Plays with a Tree(树形dp)
  20. html文本框后面加一个按钮怎么对齐,怎样对齐文本框和图像(image)按钮实现三点一线...

热门文章

  1. php 简转繁体,php 繁体字转化为简体字
  2. 乐动力推手表管家:Android Wear的中国化之路
  3. 1、域渗透基础简单信息收集
  4. 工作流程引擎:流程引擎对比
  5. [年度计划]2017年年度学习规划
  6. Katalon Studio Enterprise
  7. 数电实验5 秒表初步
  8. LaTex常用数学符号大全
  9. html滚动字幕鼠标悬停,一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]...
  10. 冒泡和快速排序的时间复杂度_排序算法学习分享(二)交换排序---冒泡排序与快速排序...