这篇文章介绍了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 操作符 "的新语法,中文翻译过来就是海象操作符,它可以作为较大表达式的一部分为变量赋值。它的表达式由一个冒号和一个等于号组成,如下
:=
由于它和海象有一些相似,所以就把它叫做海象操作符。
这种语法非常容易理解。例如,如果我们想用一行代码写出下面两行 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)
6.利用 Python 中的高阶函数
Python 有一些内置的高阶函数,为我们编写一些常用逻辑提供了方便。
例如,map() 函数是一个著名的、经常使用的高阶函数。它接收两个参数,一个是函数,另一个是可迭代元素。执行 map 函数将对可迭代的每个元素应用该函数。
names = ["liXiao", "liHua", "liMing", "HanMeimei"]
names = map(str.capitalize, names)
print(list(names))
如上例所示,在 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)
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 变量以列表的形式接收中间的项目。
以上就是“Python教程:让代码更优雅的9种python技巧”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://www.phpxs.com/post/12305/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取