作者:Martin Heinz
翻译:EarlGrey
原文:https://martinheinz.dev/blog/1
你估计已经看了不少关于 Python 技巧的文章,里面可能会提到变量拆包(unpacking)、局部函数等,但是 Python 还有很多不为人知的高效用法,等待着被人发现。本文将介绍作者纵观全网之后,都属于很少没提及的技巧。
清理字符串输入
清理用户输入的问题,几乎适用于我们可能编写的每个程序。通常将字符转换为小写或大写就足够了,这时只需要使用正则即可,但是对于复杂的情况,有一种更好的方法:
user_input = "Thisstring hassome whitespaces..."
character_map = {
ord('') : ' ',
ord('') : ' ',
ord('') : None
}
user_input.translate(character_map) # This string has some whitespaces... "
在上述示例中,可以看到空格符“ n”和“ t”已被单个空格替换,而“ r”已被完全删除。这是一个简单的示例,但是我们可以更进一步,使用 unicodedata
包及其combining
函数生成范围更广的映射表,从字符串中删除所有重音符号。
迭代器切片
如果您尝试获取迭代器的切片,系统会报 TypeError,提示生成器对象不可下标,但是解决方案很简单:
import itertools
s = itertools.islice(range(50),10,20) #
for val in s:
...
使用 itertools.islice
,我们可以创建一个islice
对象,该对象是产生所需元素的迭代器。不过,请务必注意,这会消耗所有生成器项,直到切片开始为止,而且还会消耗我们的“ islice”对象中的所有项。
Using itertools.islice
we can create aislice
object which is an iterator that produces desired items. It's important to note though, that this consumes all generator items up until the start of slice and also all the items in ourislice
object.
跳过可迭代对象的开始
有时候需要处理的文件里,明确存在一些不需要的数据行,但是我们不确定数量,比如说代码中的注释。这时, 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)
这段代码仅在初始注释部分之后,才会产生数据行。如果我们只想在迭代器的开头丢弃数据,而又不知道有具体数量时,这个方法很有用。
仅带关键字参数(kwargs)的函数
有时候,使用仅支持关键字参数的函数可以让代码更加清晰易懂:
def test(*, a, b):
pass
test("value for a