让代码更优雅的9种python技巧

这篇文章介绍了9个Python技巧,帮助编写更优雅的Python代码。

Pythonic 是优雅的同义词

Python之禅最早由 Tim Peters在Python邮件列表中发表,它包含了影响[Python编程语言设计的19条软件编写原则。

Python之禅的内容:

优美优于丑陋,

明了优于隐晦;

简单优于复杂,

复杂优于繁杂,

扁平优于嵌套,

稀疏优于稠密,

可读性很重要!

特例亦不可违背原则,

即使实用比纯粹更优。

错误绝不能悄悄忽略,

除非它明确需要如此。

面对不确定性,

拒绝妄加猜测。

任何问题应有一种,

且最好只有一种,

显而易见的解决方法。

尽管这方法一开始并非如此直观,

除非你是荷兰人。

做优于不做,

然而不假思索还不如不做。

很难解释的,必然是坏方法。

很好解释的,可能是好方法。

命名空间是个绝妙的主意,

我们应好好利用它。

优美优于丑陋,这不仅是《Python 禅》的第一句话,也是所有 Python 开发者的信条。

但如何区分代码的美丑呢?更重要的是,如何编写漂亮的 Python 代码?

空谈误国。将以初学者易懂的示例演示 9 个 Python 绝妙技巧,帮助你在日常工作中编写更多 Python 程序。

1.使用 product() 函数避免嵌套的 Python 循环

当程序变得复杂时,就不可避免地要编写嵌套循环。然而,嵌套循环会增加程序的阅读和维护难度。

幸运的是,在 Python 中,可以通过product() 函数避免嵌套循环。

例如,我们有一个包含 3 层嵌套 for 循环的程序如下:


list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]

for a in list_a:
    for b in list_b:
        for c in list_c:
            if a + b + c == 2077:
                print(a, b, c)
# 70 2000 7

为了使代码更简洁明了,我们可以使用 itertools 模块中的 product() 函数来优化代码:

from itertools import product

list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]

for a, b, c in product(list_a, list_b, list_c):
    if a + b + c == 2077:
        print(a, b, c)
# 70 2000 7

2.海象操作符赋值表达式

自 Python 3.8 起,有了一种名为 “walrus 操作符 “的新语法,中文翻译过来就是海象操作符,它可以作为较大表达式的一部分为变量赋值。它的表达式由一个冒号和一个等于号组成,如下

:=

由于它和海象有一些相似,所以就把它叫做海象操作符。

img

这种语法非常容易理解。例如,如果我们想用一行代码写出下面两行 Python 代码,该怎么做呢?

student = "HanMeimei"
print(student)
# HanMeimei

遗憾的是,我们不能直接在 print() 函数中进行赋值。如果我们尝试这样做,将会出现 TypeError:

print(student = "HanMeimei")
# TypeError: 'author' is an invalid keyword argument for print()

多亏了海象操作符,我们真的可以在一行中完成这些操作:

print(student := "HanMeimei")

3.三元条件操作符在一行中编写简单的 If-Else 结构

在编程世界中,if-else 条件无处不在。为了让简单的逻辑表达变得容易,Python 为我们提供了三元运算符。简单地说,它允许在一行中写入 if-else 条件:

min = a if a < b else b

显然,上面的代码要比下面的整洁得多:

if a<b:
  min = a
else:
  min = b

4.使用 Lambda 函数定义简单函数

如果只想定义一个简单的函数,那么可能不需要使用传统的语法。lambda 函数是一种更优雅的选择。

例如,以下函数用于计算斐波那契数字:

def fib(x):
    if x<=1:
        return x
    else:
        return fib(x-1) + fib(x-2)

它可以完美运行,但代码本身有点难看。让我们编写一个单行代码来实现同样的功能:

fib = lambda x: x if x <= 1 else fib(x - 1) + fib(x - 2)

5.列表推导式

如果说列表推导式能让代码变得优雅,还可以为节省大量的键入和时间,同时保持代码的可读性。很少有编程语言能做到这一点。

student = ["LiXiao", "LiHua", "LiMing", "HanMeimei"]
L1 = [name if name.startswith('H') else 'Not student' for name in student]
print(L1)

image-20240725174624873

利用 Python 中的高阶函数

Python 有一些内置的高阶函数,为我们编写一些常用逻辑提供了方便。

例如,map() 函数是一个著名的、经常使用的高阶函数。它接收两个参数,一个是函数,另一个是可迭代元素。执行 map 函数将对可迭代的每个元素应用该函数。

names = ["liXiao", "liHua", "liMing", "HanMeimei"]
names = map(str.capitalize, names)
print(list(names))

image-20240725174835593

如上例所示,在 map() 函数的帮助下,我们可以避免编写 for 循环来对姓名列表中的每个单词进行大写。

另一个著名的高阶函数是 reduce()。顾名思义,它将一个函数应用到一个可迭代函数中,并对其进行累加操作。

例如,下面的示例将一个列表转换为一个字符串:

from functools import reduce
city = ['P', 'a', 'r', 'i', 's', 2, 0, 2, 4]
city_to_str = reduce(lambda x, y: str(x) + str(y), city)
print(city_to_str)

image-20240725175047040

7.联合运算符:合并词典的最简单方法

合并字典是日常 Python 编程中的常见需求。有很多方法可以做到这一点。但在 Python 3.9 之前,所有这些方法都很难看。

从 Python 3.9 开始,我们终于有了最优雅的字典合并方式—使用 union 操作符。

cities_us = {'New York City': 'US', 'Los Angeles': 'US'}
cities_uk = {'London': 'UK', 'Birmingham': 'UK'}

cities = cities_us|cities_uk
print(cities)

如上例所示,我们只需使用 | 操作符即可合并两个不同的字典。此外,它还支持就地合并:

cities_us = {'New York City': 'US', 'Los Angeles': 'US'}
cities_uk = {'London': 'UK', 'Birmingham': 'UK'}

cities_us |= cities_uk
print(cities_us)

8.F-Strings:Pythonic 字符串格式化技术

几乎所有编程语言都支持字符串格式化语法。但并不是每一种都能像 Python 的 f-string 技术一样优雅。

pi = 3.1415926
print(f'Pi is approximately equal to {pi:.2f}')
# Pi is approximately equal to 3.14

id = 1  # need to print a 3-digit number
print(f"The id is {id:03d}")
# The id is 001

N = 1000000000  # need to add separator
print(f'His networth is ${N:,d}')
# His networth is $1,000,000,000

正如上面的程序所示,使用 f-string 技巧,我们可以应用一个 Python 变量,并在 f-string 中定义其格式规范。

下面的示例将借助 f 字符串打印今天的时间:


from datetime import datetime

print(f"Today is {datetime.today()}")

9.使用星号解包迭代表和重构赋值

如何将列表、元组和集合合并为一个列表?

最优雅的方法是使用星号:

A = [1, 2, 3]
B = (4, 5, 6)
C = {7, 8, 9}
L = [*A, *B, *C]
print(L)
# [1, 2, 3, 4, 5, 6, 8, 9, 7]

如上所述,星号可用作迭代表的前缀,以解压缩其项目。

除了解包迭代表,星号还可用于 Python 中的重构赋值:

a, *mid, b = [1, 2, 3, 4, 5, 6]
print(a, mid, b)
# 1 [2, 3, 4, 5] 6

如上图所示,在一个星号的帮助下,mid 变量以列表的形式接收中间的项目。

感谢您的阅读。❤️

https://readmedium.com/zh/9-fabulous-python-tricks-that-make-your-code-more-elegant-bf01a6294908