9 个神奇的 Python 技巧,让你的代码更优雅
admin
2024-04-30 12:54:15
0

本文将通过示例演示9个绝妙的 Python 技巧,以帮助你在日常工作中编写更多 Pythonic 程序。

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

当程序变得复杂时,你不可避免地要编写嵌套循环。然而,嵌套循环会使程序更难阅读和维护。

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

例如,我们有一个程序如下,其中包含 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 productlist_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 开始,有一种称为“海象运算符”的新语法,它可以将值赋给变量作为更大表达式的一部分。

这种语法非常容易理解。比如我们想把下面两行 Python 代码写在一行中,怎么写呢?

author = "Yang"
print(author)
# Yang

不幸的是,我们不能直接将赋值放入 print() 函数中。如果我们尝试,将会出现 TypeError:

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

多亏了 walrus 运算符,我们真的可以在一行中做到这一点:

print(author:="Yang")
# Yang

3.三元条件运算符:在一行中编写一个简单的 if-else 结构

if-else 条件在编程世界中无处不在。为了让简单的逻辑易于表达,Python 为我们提供了三元运算符。简而言之,它只允许将 if-else 条件放在一行中:

min = a if a < b else b

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

if a

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

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

例如,下面的函数是计算斐波那契数列:

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

它工作得很好,但代码本身有点难看。让我们写一个单行代码来实现相同的功能:

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

5.列表理解:以 Pythonic 方式获取列表

说列表理解使你的代码优雅仍然是轻描淡写的说法。它可以为您节省大量的输入和时间,但仍然保持您的代码可读性。很少有编程语言可以做到这一点。

Genius = ["Jerry", "Jack", "tom", "yang"]
L1 = [name if name.startswith('y') else 'Not Genius' for name in Genius]
print(L1)
# ['Not Genius', 'Not Genius', 'Not Genius', 'yang']

随意享受一下上面优雅的程序,想想如果没有列表理解技巧,你需要写多少行代码。

6.利用 Python 中的高阶函数

Python 内置了一些高阶函数,方便我们编写一些通用逻辑。

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

names = ['yAnG', 'MASk', 'thoMas', 'LISA']
names = map(str.capitalize, names)
print(list(names))
# ['Yang', 'Mask', 'Thomas', 'Lisa']

如上例所示,借助 map() 函数,我们可以避免编写 for 循环以将名称列表中的每个单词大写。

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

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

from functools import reducecity = ['L', 'o', 'n', 'd', 'o', 'n', 2, 0, 2, 0]
city_to_str = reduce(lambda x, y: str(x) + str(y), city)
print(city_to_str)
# London2020

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

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

从 Python 3.9 开始,我们终于找到了最优雅的字典合并方式——使用联合运算符。

cities_us = {'New York City': 'US', 'Los Angeles': 'US'}
cities_uk = {'London': 'UK', 'Birmingham': 'UK'}cities = cities_us|cities_uk
print(cities)
# {'New York City': 'US', 'Los Angeles': 'US', 'London': 'UK', 'Birmingham': 'UK'}

如上例所示,我们可以简单地使用 | 运算符合并两个不同的词典。更重要的是,它还支持就地合并:

cities_us = {'New York City': 'US', 'Los Angeles': 'US'}
cities_uk = {'London': 'UK', 'Birmingham': 'UK'}cities_us |= cities_uk
print(cities_us)
# {'New York City': 'US', 'Los Angeles': 'US', 'London': 'UK', 'Birmingham': 'UK'}

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

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

pi = 3.1415926
print(f'Pi is approximately equal to {pi:.2f}')
# Pi is approximately equal to 3.14id = 1  # need to print a 3-digit number
print(f"The id is {id:03d}")
# The id is 001N = 1000000000  # need to add separator
print(f'His networth is ${N:,d}')
# His networth is $1,000,000,000

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

你还记得 C 编程语言的字符串格式化语法吗?您是否同意 Python 的 f-string 语法更简单?

让 f-string 技术更令人惊叹的是我们可以在 f-strings 中嵌入表达式。嵌入表达式将在运行时进行评估。

以下示例将在 f 字符串的帮助下打印今天的时间:

from datetime import datetimeprint(f"Today is {datetime.today()}")
# Today is 2021-07-31 18:20:48.956829

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]

如上所述,星号可以用作可迭代对象的前缀来解包它们的项目。

除了解包 iterables 之外,星号还可以用于 Python 中的解构赋值:

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

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

相关内容

热门资讯

英国失业率升至近5年最高位 英国国家统计局2月17日发布的报告显示,由于经济增长乏力,2025年第四季度英国就业市场继续走软,失...
深夜全球资产大跌!纳指跌超1%... 每经编辑|陈柯名 美股开盘三大指数齐跌,道琼斯指数跌0.36%,标普500指数跌0.75%,纳斯达...
ST银江2025年预亏超17亿... 来源:经济观察网 经济观察网 基于最新公开信息,ST银江(股票代码:300020)有以下值得关注的事...
原创 特... 特朗普签令制裁古巴石油供应国,俄大使怒批“完全疯狂”:这记回马枪刺痛了谁? 背景:一纸行政令搅动加...
鹏扬基金总经理杨爱斌:2026... 岁序更新,骏马启程。值此2026马年新春佳节来临之际,谨向投资者朋友们致以诚挚的新春祝福,祝大家马年...
光大银行泰州分行被罚115万 近日,国家金融监督管理总局泰州监管分局发布了多张罚单,剑指光大银行股份有限公司泰州分行及其相关责任人...
伊朗宣布关闭霍尔木兹海峡部分区... 来源:21世纪经济报道 △伊朗伊斯兰革命卫队海军军演的主要阶段在霍尔木兹海峡展开 据伊朗方面17日...
新春守护不打烊 成都市场监管全... 春节假期开启,节日市场迎来消费高峰。近日,成都市各区(市)县市场监管局坚守监管一线,紧盯食品安全、价...
澳新银行:伦敦矿业股下跌,受价... 受金属价格下滑影响,伦敦矿业股早盘下跌。澳新 银行分析师写道,因美元走强打压了市场情绪,金价未能守住...
报告:凯德投资的私募基金业务可... 来源:滚动播报 大华继显的Adrian Loh在一份报告中称,凯德投资(CapitaLand Inv...
2025年AI落地进行时:企业... 今天分享的是:2025年AI落地进行时:企业业务、组织与人才升级实战案例集 报告共计:141页 20...
原创 中... 正当美国总统特朗普鼓吹“一日一赢”的神话时,一场美元霸权崩塌的前奏正在悄然演奏。截至今年1月份,美元...
俄罗斯石油神话正在崩塌:1.5... 王爷说财经讯:你敢信吗?2026年2月17日最新消息,足足1.5亿桶原油正漂在全球各大洋的油轮上,核...
景顺长城基金总经理康乐:主动有... 日月其迈,时盛岁新。农历马年来临,谨代表景顺长城基金,向广大投资者及所有支持和信任我们的朋友,致以最...
石家庄斜视怎么治疗?专业眼科医... 斜视带来的困扰 斜视不仅影响外观,还可能导致视力下降、立体视觉缺失等问题。比如孩子在学校看黑板、读书...
五天被三次约谈,高德地图怎么了... 来源:市场资讯 (来源:财闻) 借贷业务、火车票销售业务及网约车业务是高德被约谈的主要业务。 当前正...
金银价格大跳水 当地时间17日,全球多个主要市场因传统节日休市,贵金属市场交投清淡。 在美联储降息预期有所降温的背景...
消息称月之暗面新一轮超7亿美元... 2 月 17 日消息,据“科创板日报”报道,在完成上一轮 5 亿美元(现汇率约合 34.58 亿元人...
原创 春... 2026年春晚的钟声还未敲响,一场由机器人引发的消费飓风已提前登陆。当晚八点零七分,当《机械霓裳》节...
金价、银价,突然大跌! 继昨日下跌后,2月17日早上,现货金银再次双双急跌,现货黄金一度失守4980美元/盎司,日内跌超0....