9个技巧使你的Python代码更Pythonic!

news2024/11/19 5:53:17

如何区分漂亮和丑陋的代码?

更重要的是,如何写出漂亮的 Python 代码?

本文将通过初学者容易理解的例子展示9个神话般的Python技巧,以帮助你在日常工作中编写更多的Pythonic程序。

01 product()

使用 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

02 海象操作符

赋值表达式的一个可爱技巧

从Python 3.8开始,有一个新的语法,叫做 "海象操作符",它可以作为一个更大的表达式的一部分给变量赋值。

操作符 := 的可爱名字来自海象的眼睛和獠牙。

                                           图片来自维基百科

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

author = "云朵君"
print(author)
# 云朵君

不幸的是,我们不能直接把赋值放到print()函数中。如果我们尝试的话,会出现一个TypeError。

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

感谢海象操作者,我们真的可以在一行中做到这一点。

print(author:="云朵君")
# 云朵君

03 三元条件运算符

用一行写一个简单的If-Else结构

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

min = a if a < b else b

很明显,上面的代码比下面的要整齐得多。

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

04 Lambda函数

使用Lambda函数来定义简单函数

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

例如,以下函数是计算斐波那契数的。

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

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

05 列表推导式

以Pythonic方式获得一个列表

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

Genius = ["云朵君", "小猴子", "数据STUDIO", "机器学习研习院"]
L1 = [name if name.startswith('云') else 'Not Genius' for name in Genius]
print(L1)
# ["云朵君", "Not Genius", "Not Genius", "Not Genius"]

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

06 高阶函数

利用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 reduce

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

07 联合运算符

合并字典的简单方法

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

从 Python3.9 开始,我们终于得到了优雅的字典合并方式——使用联合运算符。

article_author = {'数据STUDIO': '云朵君', 
                  '机器学习研习院': '小猴子'}
author_cities = {'云朵君': '江苏', 
                 '小猴子': '成都'}

info = article_author|author_cities
print(info)
#{'数据STUDIO': '云朵君', 
  '机器学习研习院': '小猴子', 
  '云朵君': '江苏', 
  '小猴子': '成都'}

正如上面的例子所示,我们可以简单地使用|操作符来合并两个不同的字典。更有甚者,它还支持就地合并。

08 F-string

F-string字符串格式化技术

几乎每一种编程语言都支持字符串格式化语法。但不是每一种都像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内定义其格式规范。

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

“Simple is better than complex.” — The Zen of Python

使得f-string技术另一个点是,我们可以在f-strings里面嵌入表达式。嵌入的表达式将在运行时被评估。

下面的例子使用f-string打印今天的时间。

from datetime import datetime

print(f"Today is {datetime.today()}")
# Today is 2022-12-31 18:18:18.666666

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 变量接收中间的项目,并作为一个列表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1610239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【wpf】ObservableCollection 跨线程报错问题

背景 ObservableCollection 我们之前介绍过他和List的区别。ObservableCollection 的好处在于&#xff0c;当集合发生变化时&#xff0c;能发送通知通知界面发生相应的更改。但是ObservableCollection 有个弊端。无法在非UI线程中访问。 要么就是通知失效了&#xff0c;要么就…

血的教训之虚拟机重装[包含一系列虚拟机,c++,python,miniob配置]

一切都要从头开始&#xff0c;由于脑袋糊涂&#xff0c;没看到是虚拟机的文件&#xff0c;直接一口气全删掉了&#xff0c;哎&#xff01;&#xff01;数据恢复后发现也不行&#xff0c;磁盘文件还是缺失了一部分&#xff0c;只能重新再来了。 等待ing 看不到按钮&#xff0c;按…

CSS基础:盒子模型详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃&#xff0c;大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 We…

SQLite的PRAGMA 声明(二十三)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite从出生到现在&#xff08;发布历史记录&#xff09;&#xff08;二十二&#xff09; 下一篇&#xff1a;用于 SQLite 的异步 I/O 模块&#xff08;二十四&#xff09; PRAGMA 语句是特定于 SQLite 的 SQL 扩…

功能测试前景揭秘:会被淘汰吗?

在当今快速发展的信息时代&#xff0c;软件已经成为我们工作、学习乃至生活中不可或缺的一部分。随着技术的不断进步和应用的广泛普及&#xff0c;软件测试作为保障软件质量和功能实现的关键步骤&#xff0c;其职业发展路径也受到了广泛的关注。特别是针对功能测试这一细分领域…

踏上R语言之旅:解锁数据世界的神秘密码(二)

R语言学习 文章目录 R语言学习1.数据的R语言表示2.多元数据的R语言调用3.多元数据的简单R语言分析 总结 1.数据的R语言表示 数据框&#xff08;data frame) R语言中用函数data.frame()生成数据框&#xff0c;其句法是&#xff1a; data.frame(data1,data2,…)&#xff0c;例如…

记录一个hive中因没启yarn导致的spark引擎跑insert语句的报错

【背景说明】 刚在hive中配置了Spark引擎&#xff0c;在进行Hive on Spark测试时报错&#xff0c; 报错截图如下&#xff1a; [atguiguhadoop102 conf]$ hive which: no hbase in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/mod…

【Linux】服务器时区 [ CST | UTC | GMT | RTC ]

目录 1. 硬件时间&#xff08;Real_TIME Clock [RTC time]&#xff09; 1.1 硬件时间简介 1.2 如何使用硬件时间 2. 系统时间&#xff08;UTC时间&#xff09;&#xff08;Universal time&#xff09; 2.1 系统时间简介 2.2 UTC时间 3. 本地时间&#xff08;Local time&…

webpack源码分析——enhanced-resolve库之getType、normalize、join和cachedJoin函数

一、PathType 路径类型 const PathType Object.freeze({Empty: 0, // 空Normal: 1, // 默认值Relative: 2, // 相对路径AbsoluteWin: 3, // win 下的绝对路径AbsolutePosix: 4, // posix 下的绝对路径Internal: 5 // enhanced-resolve 内部自定义的一种类型&#xff0c;具体是…

颠覆传统消费,走向可持续:每次购物都是循环的开始

亲爱的读者朋友们&#xff0c;大家好&#xff0c;我是微三云周丽。今天&#xff0c;我非常激动地想要向大家分享一种极具创新性和前瞻性的商业模式——循环购。这种模式将消费返利与积分返利理念相融合&#xff0c;为商家与消费者之间搭建了一座互动与共赢的桥梁&#xff0c;让…

安全开发实战(1)--Cdn

目录 安全开发专栏 CDN介绍 1.信息收集阶段 1.1判断CDN是否存在 1.1.1, One 1.1.2,Two(改进) 1.1.3,进行整合 增加输入功能 1.1.4 批量读取监测存储(进行测试) 问题1: 问题2: 解决方案: 1.1.4 基本编写完成 命令框中: cdn存在.txt 总结 这里我是根据整个渗透测…

【spring】springProperty 使用

springProperty 是一个在 Spring 框架中使用的SpEL&#xff08;Spring Expression Language&#xff09;表达式&#xff0c;它允许你在应用程序的配置中引用 Spring 应用程序上下文中的属性值。这个表达式通常用于从 Spring 的 Environment 对象中获取配置属性的值&#xff0c;…

【Java探索之旅】用面向对象的思维构建程序世界

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、初识面向对象1.1 什么是面向对象&#xff1f;1.2 面向对象与面向过程 二、类的定义…

HDLbits 刷题 -- Adder100

Create a 100-bit binary adder. The adder adds two 100-bit numbers and a carry-in to produce a 100-bit sum and carry out. 译&#xff1a; 创建一个100位二进制加法器。加法器将两个100位的数字和一个进位相加&#xff0c;产生一个100位的和并执行。 个人解法&#xf…

短视频素材哪里去找?推荐几个视频素材免费下载的网站

高质量的资源&#xff0c;会让你的视频创作更加生动和具有吸引力。下面我为你介绍世界各地的优质无水印视频素材网站&#xff0c;以拓宽你的创作视野&#xff0c;帮助你在这个视觉革命的时代中脱颖而出。 1. 蛙学府&#xff08;中国&#xff09; 提供各种类别的优质高清视频素…

【Linux C | 多线程编程】互斥量、信号量、条件变量对比总结

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 本文未经允许…

【UKE!】2024.4.19

2024.4.19 【你知道的都是真相。只可惜那些并不是真相的全部。】 Friday 三月十一 谷雨 <BGM “谷雨–音阙诗听”> AC :Answer Coarse,粗劣的答案 ​ CE :Compile Easily,轻松通过 ​ PC :Perfect Compile 完美的编译 ​ WA :Wonderful Answer,好答案 ​ RE :Run Exce…

【Java开发指南 | 第十六篇】Java数组及Arrays类

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 数组数组特点创建数组处理数组多维数组Arrays类 数组 Java中的数组是一种用来存储固定大小的相同类型元素的数据结构。 数组特点 数组具有以下特点&#xff1a; 1、固定大小: 一旦数组被创建&#xff0c;其…

【云计算】云数据中心网络(五):对等连接

《云网络》系列&#xff0c;共包含以下文章&#xff1a; 云网络是未来的网络基础设施云网络产品体系概述云数据中心网络&#xff08;一&#xff09;&#xff1a;VPC云数据中心网络&#xff08;二&#xff09;&#xff1a;弹性公网 IP云数据中心网络&#xff08;三&#xff09;…

vue3 echarts 图表主题切换

我主要是用了localStorage和composable来实现的。 先创建composable文件夹存储composable的操作方法&#xff1b; 在App.vue文件里面&#xff0c;先将主题数据存储在localStorage里面&#xff1b; 主题切换 图表theme包更换 为什么要用composable呢&#xff1f; 单纯的使用…