大学中虽然教授过 C、C++、Java,但我当时选择自学了 Python,并且在工作的前几年也是用的 Python,我非常喜欢这门语言。
虽然我在平时开发时,不喜欢为了让代码精简些、酷炫些而写出匪夷所思的代码,那些代码大部分杂乱无章、可读性差,第二次再读自己的代码就不一定能读懂。但 Python在这方面做得非常好,这也是为什么它经常成为编码挑战、面试手写代码的首选。
下面我对 Python 中用一行代码就能解决的问题做了下整理,通过这些代码片段和技巧也能看出这门语言设计的精妙和优雅:
一个数字的位数之和
这个单行代码对于计算一个数字的位数之和非常有用:
1 | sum_of_digit = lambda x: sum(map(int, str(x))) |
单一的if-else条件
在其他语言中,条件式有时看起来有点笨重,如:
1 | x = 10 |
用Python简化它:
1 | x = 10 |
读起来和正常的英语有些像。
你可以用以下结构在一行代码内形成一个if语句:
<条件-真> if 条件 else <条件-假>
多个if-else条件
我们有时会使用大量的 if-else
语句,我们使用 elif
关键字,它是其他语言 else if
关键字组合的缩写,这对于转换为单行的python代码来说比较困难,看一个在代码里面使用 elif
的例子:
1 | x = 200 |
这段代码将打印第二条语句,即 x is equal to 200
。
现在我们把这段代码转换成一行代码:
1 | x = 200 |
这里使用的依然是上一个技巧,只是将其扩展为了多个条件,不过我不建议这样写,它也许很快就会变得难以阅读和维护。你需要权衡好什么时候使用这个技巧。
字符串反转
使用字符串切片操作,在一行代码中反转字符串:
1 | input_string = "Namaste World!" |
分配多个变量
在一行中为每个变量分配不同的值,甚至不同的数据类型:
1 | name, age, single = ‘jc’, 35, False |
列表推导
列表推导是一种简单而优雅的方法,它可以从现有的列表中定义和生成新的列表:
举个例子,生成填充了数字 0 到 4 的列表:
1 | scores = [] |
同样的结果我们可以用列表推导法来实现:
1 | scores = [x for x in range(5)] |
这是 Python 最伟大的功能之一。
列表推导中的条件式
继续扩展上一个技巧,如果我们想根据一个条件来跳过一些项呢?
例如,如果我们只想要奇数:
1 | scores = [] |
在列表推导中使用条件语句同样可以实现:
1 | scores = [x for x in range(20) if x % 2 == 1] |
优点:列表推理不仅更清晰,而且在大部分情况下其性能也比单次循环好得多。
斐波那契数列
斐波那契数列是一组数字的集合,其中每个数字都是它前面两个数字之和。
在一行代码中,我们使用列表推理和 for
循环生成一个斐波那契数列:
1 | n=10 |
合并两个字典
我们可以使用**
操作符在一行代码中合并多个字典。
我们只需要将字典和**
操作符一起传给{}
,它就会为我们合并字典:
1 | dictionary1 = {"name": "Joy", "age": 25} |
交换一个字典中的键和值
1 | dict = {'Name': 'Joy', 'Age': 25, 'Language':'Python'} |
这个交换键值对的代码非常实用。
交换变量
在其他语言中,交换两个变量需要借助第三个变量(一个临时变量)来实现:
1 | tmp = var1 |
在Python中,可以直接在一条语句中完成:
1 | var1, var2 = var2, var1 |
甚至更进一步,可以使用相同的技巧来交换数组中的元素
1 | colors = ['red', 'green', 'blue'] |
列表推理中的嵌套循环
列表推理还可以用在矩阵(多维数组)上:
1 | my_list = [(x, y) for x in [3, 4, 6] for y in [3, 4, 7] if x != y] |
字典推理
与列表推理的概念相同,举个例子,我们需要一个键/值对,其中值是键的平方:
1 | square_dict = dict() |
下面使用字典推导:
1 | square_dict = { num: num * num for num in range(1, 11) } |
拍平一个列表
数据工程师经常与列表和多维数据打交道,有时他们需要将多维列表转换成一维的。他们经常使用 numpy
之类的包来做这件事。
下面的例子展示了如何使用纯 Python 的单行代码来完成同样的工作:
1 | my_list = [[1,2], [4, 6], [8, 10]] |
是的,这依然时列表推导的一种应用。
从列表中解构变量
假设你有一个列表,你想把它前边的几个值捕捉到变量中,其余值都放进另一个列表。这在处理参数的时候会很有用。
让我们看一个例子:
1 | x, y, *z = [1, 2, 3, 4, 5] |
将文件加载到一个列表中
脚本最常用的一个场景是处理文本文件,特别是将文件的每一行读入到列表中,这样我们就可以对数据进行我们需要的操作了。
在 Python 中,我们可以用强大的列表推导法将文件所有行读入一个列表:
1 | my_list = [line.strip() for line in open('countries.txt', 'r')] |
总结
Python 是一门神奇的语言。今天我展示了几个强大的 Python 技巧,它们将帮助我们开发更优雅、更简单、更高效的代码。