10个小技巧,让你的 Python 代码更加优雅
itomcoil 2025-05-03 14:46 11 浏览
10个小技巧改进的 Python 代码,让你的代码更加简洁、更加 Python 化。
1. 用enumerate代替range
如果你需要遍历一个列表,并且需要同时获取索引和元素,大多数情况可能会使用 range(len(data)) 的语法。
比如我们要遍历一个列表,找到所有的负数:
私信小编01即可获取大量Python学习资源
data = [1, 3, -5, 7, 9, -11]
for i in range(len(data)):
if data[i] < 0:
print(f"索引:{
i},元素:{
data[i]}")
输出:
索引:2,元素:-5
索引:5,元素:-11
虽然这种方法有效,但如果使用 Python 内置的 enumerate 函数会更好,这个函数会返回遍历过程中当前索引和当前元素值作为一个元组,因此可以直接输出索引和值:
data = [1, 3, -5, 7, 9, -11]
for i, v, in enumerate(data):
if v < 0:
print(f"索引:{
i},元素:{
v}")
输出:
索引:2,元素:-5
索引:5,元素:-11
2. 深入理解list,替代for循环
假如我们要创建一个从0~9的平方数的列表,一种简单的方法是先创建一个 list ,然后通过 for 循环每次将一个数的平方 append 到列表的结尾。
squares = []
for i in range(10):
squares.append(i ** 2)
print(squares)
输出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
但其实通过列表生成式,我们有一种更快捷的方法,只需要一行代码就能够实现相同的功能。
squares = [i ** 2 for i in range(10)]
print(squares)
输出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3. 通过 Python 内置的sorted()方法对复杂的对象进行排序
排序的需求在很多场景中都很常见,Python中的可迭代对象(列表、元组、字典)都可以进行排序,内置函数 sorted() 让我们甚至都不需要自己实现排序算法。
data = [1, 3, -5, 7, 9, -11]
sortedData = sorted(data)
print(sortedData)
输出:
[-11, -5, 1, 3, 7, 9]
sorted() 方法自动将列表按照升序排序,如果你想按照降序排序,可以使用 sorted() 的参数 reverse = True 。
sorted() 方法同样也适用于元组类型的数据,但是注意排序的结果将返回一个列表。
data = (1, 3, -5, 7, 9, -11)
print(data)
sortedData = sorted(data)
print(sortedData)
输出:
(1, 3, -5, 7, 9, -11)
[-11, -5, 1, 3, 7, 9]
对于复杂的可迭代对象,比如我们可以创建一个列表,列表中的每一个元素都是一个人的字典信息,然后我们按照每个人的年龄进行排序。
我们可以用 sorted() 的 key 参数,传入一个匿名函数,让排序按照我们预想的方式进行。
data = [{
"name": "Alex", "age": 18},
{
"name": "Band", "age": 21},
{
"name": "Coco", "age": 17}]
sorted_data = sorted(data, key=lambda x: x["age"])
print(sorted_data)
输出:
[{'name': 'Coco', 'age': 17}, {'name': 'Alex', 'age': 18}, {'name': 'Band', 'age': 21}]
4. 使用集合Set存储唯一值
如果你有一个包含多个值的列表,并且需要去重,一个不错的技巧是将我们的列表转换为一个集合。
Python的集合是一种无序的数据类型,并且没有重复元素,还提供了不同集合之间的运算,可以求交集、并集和差集。
data = [1, 3, 3, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9, 9]
setData = set(data)
print(setData)
输出:
{1, 3, 5, 7, 9}
5. 使用生成器以节省内存
有时候列表并不是最好的选择。假如我们有一个非常大的列表,有10000个元素,我们想计算所有元素的总和,虽然可以用列表来做,当如果数据量特别大的话我们可能会遇到内存问题,更好的解决方案是使用生成器。
dataList = [i for i in range(10000)]
print(sum(dataList))
dataGen = (i for i in range(10000))
print(sum(dataGen))
输出:
列表生成式与生成器具有相同的语法,不同点在于列表生成式使用的是中括号,而生成器使用的是小括号。
生成器通过类似于懒加载的方式计算我们需要的元素,因此它一次只生成一个元素,并且只在需要的时候才生成。
我们可以使用 sys 的 getsize() 方法看一下列表和生成器的大小。
import sys
dataList = [i for i in range(10000)]
print(sys.getsizeof(dataList), "bytes")
dataGen = (i for i in range(10000))
print(sys.getsizeof(dataGen), "bytes")
输出:
85176 bytes
112 bytes
6. 在字典中获取元素使用.get()并且设置默认值
假设我们有一个字典,其中包括不同的键,比如商品和价格,在我们的代码中的某个点,想要获得商品的价格。
当我们用 [] 简单的访问键时,如果键不在字典中,那么代码将会报错,引发一个 KeyError 。
dataDict = {
"name": "Tesla",
"price": 250000
}
print(dataDict["count"])
报错:
Traceback (most recent call last):
File "mian.py", line 5, in <module>
print(dataDict["count"])
KeyError: 'count'
更好的方式是使用 .get() 方法,此时如果键不存在,则不会引发 KeyError ,而是返回一个默认值,如果我们不指定默认值,它会直接返回None,如果我们指定默认值,那么它会返回我们指定的默认值。
dataDict = {
"name": "Tesla",
"price": 250000
}
print(dataDict.get("count"))
print(dataDict.get("count", 0))
输出:
None
0
7. 计数器collections.Counter
如果你想计算列表中元素的数量,Python中有一个非常方便的工具。
from collections import Counter
data = [1, 3, 3, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9, 9]
counter = Counter(data)
print(counter)
输出:
Counter({9: 5, 7: 4, 5: 3, 3: 2, 1: 1})
Counter 可以统计列表中不同元素的数量,并且按照出现次数降序排列,这比我们自己计算要好得多。
如果你想知道某个元素的个数的话,可以直接通过 [] 访问,如果这个元素不存在,那么将返回0,并且还可以通过 most_common() 方法返回排名靠前的几个元素。
from collections import Counter
data = [1, 3, 3, 5, 5, 5, 7, 7, 7, 7, 9, 9, 9, 9, 9]
counter = Counter(data)
print(counter[7])
print(counter[11])
print(counter.most_common(2))
输出:
4
0
[(9, 5), (7, 4)]
8. 使用f-String格式化字符串(适用于Python 3.6+)
f-String在我看来是最佳的格式化字符串方法,我们只需要在字符串前写一个f,然后在字符串内部可以直接使用大括号来嵌入变量或表达式。
data = {
"name": "Alex", "age": 18}
string = f"I'm {
data['name']} and I am {
data['age']} years old."
print(string)
输出:
I'm Alex and I am 18 years old.
这种方式更简单、更简洁、速度也更快。
9. 使用.join()拼接字符串
假如我们有一个包含不同字符串的列表,我们想把所有的字符串通过空格拼接在一起,千万不要再用 for 循环一个一个遍历然后拼接了,一种更简洁的方法是通过 .joint() 方法,它可以使用指定的字符将字符串拼接起来。
strings = ["Hello", "World", "!"]
print(" ".join(strings))
print("_".join(strings))
输出:
Hello World !
Hello_World_!
10. 使用双星号语法合并字典(适用于Python 3.5+)
如果我们有两个字典,并且希望将其合并成一个,此时我们可以使用双星号 ** 和大括号 {} 语法。
info1 = {
"name": "Alex", "age": 18}
info2 = {
"name": "Alex", "city": "Bei Jing"}
info = {
**info1, **info2}
print(info)
输出:
{'name': 'Alex', 'age': 18, 'city': 'Bei Jing'}
以上就是这篇文章跟大家分享的小技巧。
如果你觉得这篇文章对你有帮助的话,欢迎一键三连~
相关推荐
- Python Qt GUI设计:将UI文件转换Python文件三种妙招(基础篇—2)
-
在开始本文之前提醒各位朋友,Python记得安装PyQt5库文件,Python语言功能很强,但是Python自带的GUI开发库Tkinter功能很弱,难以开发出专业的GUI。好在Python语言的开放...
- Connect 2.0来了,还有Nuke和Maya新集成
-
ftrackConnect2.0现在可以下载了--重新设计的桌面应用程序,使用户能够将ftrackStudio与创意应用程序集成,发布资产等。这个新版本的发布中还有两个Nuke和Maya新集成,...
- Magicgui:不会GUI编程也能轻松构建Python GUI应用
-
什么是MagicguiMagicgui是一个Python库,它允许开发者仅凭简单的类型注解就能快速构建图形用户界面(GUI)应用程序。这个库基于Napari项目,利用了Python的强大类型系统,使得...
- Python入坑系列:桌面GUI开发之Pyside6
-
阅读本章之后,你可以掌握这些内容:Pyside6的SignalsandSlots、Envents的作用,如何使用?PySide6的Window、DialogsandAlerts、Widgets...
- Python入坑系列-一起认识Pyside6 designer可拖拽桌面GUI
-
通过本文章,你可以了解一下内容:如何安装和使用Pyside6designerdesigner有哪些的特性通过designer如何转成python代码以前以为Pyside6designer需要在下载...
- pyside2的基础界面(pyside2显示图片)
-
今天我们来学习pyside2的基础界面没有安装过pyside2的小伙伴可以看主页代码效果...
- Python GUI开发:打包PySide2应用(python 打包pyc)
-
之前的文章我们介绍了怎么使用PySide2来开发一个简单PythonGUI应用。这次我们来将上次完成的代码打包。我们使用pyinstaller。注意,pyinstaller默认会将所有安装的pack...
- 使用PySide2做窗体,到底是怎么个事?看这个能不能搞懂
-
PySide2是Qt框架的Python绑定,允许你使用Python创建功能强大的跨平台GUI应用程序。PySide2的基本使用方法:安装PySide2pipinstallPy...
- pycharm中conda解释器无法配置(pycharm安装的解释器不能用)
-
之前用的好好的pycharm正常配置解释器突然不能用了?可以显示有这个环境然后确认后可以conda正在配置解释器,但是进度条结束后还是不成功!!试过了pycharm重启,pycharm重装,anaco...
- Conda使用指南:从基础操作到Llama-Factory大模型微调环境搭建
-
Conda虚拟环境在Linux下的全面使用指南:从基础操作到Llama-Factory大模型微调环境搭建在当今的AI开发与数据分析领域,conda虚拟环境已成为Linux系统下管理项目依赖的标配工具。...
- Python操作系统资源管理与监控(python调用资源管理器)
-
在现代计算环境中,对操作系统资源的有效管理和监控是确保应用程序性能和系统稳定性的关键。Python凭借其丰富的标准库和第三方扩展,提供了强大的工具来实现这一目标。本文将探讨Python在操作系统资源管...
- 本地部署开源版Manus+DeepSeek创建自己的AI智能体
-
1、下载安装Anaconda,设置conda环境变量,并使用conda创建python3.12虚拟环境。2、从OpenManus仓库下载代码,并安装需要的依赖。3、使用Ollama加载本地DeepSe...
- 一文教会你,搭建AI模型训练与微调环境,包学会的!
-
一、硬件要求显卡配置:需要Nvidia显卡,至少配备8G显存,且专用显存与共享显存之和需大于20G。二、环境搭建步骤1.设置文件存储路径非系统盘存储:建议将非安装版的环境文件均存放在非系统盘(如E盘...
- 使用scikit-learn为PyTorch 模型进行超参数网格搜索
-
scikit-learn是Python中最好的机器学习库,而PyTorch又为我们构建模型提供了方便的操作,能否将它们的优点整合起来呢?在本文中,我们将介绍如何使用scikit-learn中的网格搜...
- 如何Keras自动编码器给极端罕见事件分类
-
全文共7940字,预计学习时长30分钟或更长本文将以一家造纸厂的生产为例,介绍如何使用自动编码器构建罕见事件分类器。现实生活中罕见事件的数据集:背景1.什么是极端罕见事件?在罕见事件问题中,数据集是...
- 一周热门
- 最近发表
-
- Python Qt GUI设计:将UI文件转换Python文件三种妙招(基础篇—2)
- Connect 2.0来了,还有Nuke和Maya新集成
- Magicgui:不会GUI编程也能轻松构建Python GUI应用
- Python入坑系列:桌面GUI开发之Pyside6
- Python入坑系列-一起认识Pyside6 designer可拖拽桌面GUI
- pyside2的基础界面(pyside2显示图片)
- Python GUI开发:打包PySide2应用(python 打包pyc)
- 使用PySide2做窗体,到底是怎么个事?看这个能不能搞懂
- pycharm中conda解释器无法配置(pycharm安装的解释器不能用)
- Conda使用指南:从基础操作到Llama-Factory大模型微调环境搭建
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)