0%

一行 Python 代码能做什么

大学中虽然教授过 C、C++、Java,但我当时选择自学了 Python,并且在工作的前几年也是用的 Python,我非常喜欢这门语言。

虽然我在平时开发时,不喜欢为了让代码精简些、酷炫些而写出匪夷所思的代码,那些代码大部分杂乱无章、可读性差,第二次再读自己的代码就不一定能读懂。但 Python在这方面做得非常好,这也是为什么它经常成为编码挑战、面试手写代码的首选。

下面我对 Python 中用一行代码就能解决的问题做了下整理,通过这些代码片段和技巧也能看出这门语言设计的精妙和优雅:

一个数字的位数之和

这个单行代码对于计算一个数字的位数之和非常有用:

1
2
3
4
5
6
sum_of_digit = lambda x: sum(map(int, str(x)))
output = sum_of_digit(123)
print("Sum of the digits is: ", output)

Output:
Sum of the digits is: 6

单一的if-else条件

在其他语言中,条件式有时看起来有点笨重,如:

1
2
3
4
5
6
x = 10
y = 5
if x > y:
print("x is greater than y")
else:
print("y is greater than x")

用Python简化它:

1
2
3
x = 10
y = 5
print("x is greater than y" if x > y else "y is greater than x")

读起来和正常的英语有些像。

你可以用以下结构在一行代码内形成一个if语句:

<条件-真> if 条件 else <条件-假>

多个if-else条件

我们有时会使用大量的 if-else 语句,我们使用 elif 关键字,它是其他语言 else if 关键字组合的缩写,这对于转换为单行的python代码来说比较困难,看一个在代码里面使用 elif 的例子:

1
2
3
4
5
6
7
x = 200
if x < 20:
print("x is less than 20")
elif x == 200:
print("x is equal to 200")
else:
print("x is above 20")

这段代码将打印第二条语句,即 x is equal to 200

现在我们把这段代码转换成一行代码:

1
2
x = 200
print("x is less than 20") if x < 20 else print("x is equal to 200") if x == 200 else print("x is above 20")

这里使用的依然是上一个技巧,只是将其扩展为了多个条件,不过我不建议这样写,它也许很快就会变得难以阅读和维护。你需要权衡好什么时候使用这个技巧。

字符串反转

使用字符串切片操作,在一行代码中反转字符串:

1
2
3
4
5
6
input_string = "Namaste World!"
reversed_string = input_string[::-1]
print("Reversed string is: ", reversed_string)

Output:
Reversed string is: !dlroW etsamaN

分配多个变量

在一行中为每个变量分配不同的值,甚至不同的数据类型:

1
name, age, single = ‘jc’, 35, False

列表推导

列表推导是一种简单而优雅的方法,它可以从现有的列表中定义和生成新的列表:

举个例子,生成填充了数字 0 到 4 的列表:

1
2
3
4
scores = []
for x in range (5):
scores.append(x)
print(scores)

同样的结果我们可以用列表推导法来实现:

1
2
scores = [x for x in range(5)]
print(scores)

这是 Python 最伟大的功能之一。

列表推导中的条件式

继续扩展上一个技巧,如果我们想根据一个条件来跳过一些项呢?

例如,如果我们只想要奇数:

1
2
3
4
5
scores = []
for x in range (20):
if x % 2 == 1:
scores.append(x)
print(scores)

在列表推导中使用条件语句同样可以实现:

1
2
scores = [x for x in range(20) if x % 2 == 1]
print(scores)

优点:列表推理不仅更清晰,而且在大部分情况下其性能也比单次循环好得多。

斐波那契数列

斐波那契数列是一组数字的集合,其中每个数字都是它前面两个数字之和。

在一行代码中,我们使用列表推理和 for 循环生成一个斐波那契数列:

1
2
3
4
5
6
7
n=10
fib = [0,1]
[fib.append(fib[-2]+fib[-1]) for _ in range(n)]
print(fib)

Output:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

合并两个字典

我们可以使用**操作符在一行代码中合并多个字典。

我们只需要将字典和**操作符一起传给{},它就会为我们合并字典:

1
2
3
4
5
6
7
dictionary1 = {"name": "Joy", "age": 25}
dictionary2 = {"name": "Joy", "city": "New York"}
merged_dict = {**dictionary1, **dictionary2}
print("Merged dictionary:", merged_dict)

Output:
Merged dictionary: {'name': 'Joy', 'age': 25, 'city': 'New York'}

交换一个字典中的键和值

1
2
3
4
5
dict = {'Name': 'Joy', 'Age': 25, 'Language':'Python'}
result = {v:k for k, v in dict.items()}
print(result)
Output:
{'Joy': 'Name', 25: 'Age', 'Python': 'Language'}

这个交换键值对的代码非常实用。

交换变量

在其他语言中,交换两个变量需要借助第三个变量(一个临时变量)来实现:

1
2
3
tmp = var1
var1 = var2
var2 = tmp

在Python中,可以直接在一条语句中完成:

1
var1, var2 = var2, var1

甚至更进一步,可以使用相同的技巧来交换数组中的元素

1
2
3
4
5
6
colors = ['red', 'green', 'blue']
colors[0], colors[1] = colors[1], colors[0]
print(colors)

Output:
['green', 'red', 'blue']

列表推理中的嵌套循环

列表推理还可以用在矩阵(多维数组)上:

1
2
3
4
5
my_list = [(x, y) for x in [3, 4, 6] for y in [3, 4, 7] if x != y]
print(my_list)

Output:
[(3, 4), (3, 7), (4, 3), (4, 7), (6, 3), (6, 4), (6, 7)]

字典推理

与列表推理的概念相同,举个例子,我们需要一个键/值对,其中值是键的平方:

1
2
3
4
square_dict = dict()
for num in range(1, 11):
square_dict[num] = num * num
print(square_dict)

下面使用字典推导:

1
2
square_dict = { num: num * num for num in range(1, 11) }
print(square_dict)

拍平一个列表

数据工程师经常与列表和多维数据打交道,有时他们需要将多维列表转换成一维的。他们经常使用 numpy 之类的包来做这件事。

下面的例子展示了如何使用纯 Python 的单行代码来完成同样的工作:

1
2
3
4
5
6
my_list = [[1,2], [4, 6], [8, 10]]
flattened = [i for j in my_list for i in j]
print(flattened)

Output:
[1, 2, 4, 6, 8, 10]

是的,这依然时列表推导的一种应用。

从列表中解构变量

假设你有一个列表,你想把它前边的几个值捕捉到变量中,其余值都放进另一个列表。这在处理参数的时候会很有用。

让我们看一个例子:

1
2
3
4
5
x, y, *z = [1, 2, 3, 4, 5]
print(x, y, z)

Output:
1 2 [3, 4, 5]

将文件加载到一个列表中

脚本最常用的一个场景是处理文本文件,特别是将文件的每一行读入到列表中,这样我们就可以对数据进行我们需要的操作了。

在 Python 中,我们可以用强大的列表推导法将文件所有行读入一个列表:

1
2
my_list = [line.strip() for line in open('countries.txt', 'r')]
print(my_list)

总结

Python 是一门神奇的语言。今天我展示了几个强大的 Python 技巧,它们将帮助我们开发更优雅、更简单、更高效的代码。