当前位置: 首页 > news >正文

50个简洁的提示提高代码可读性和效率(0-10)

这篇文章整理了50个简洁的提示,可以提高您的代码可读性和效率。这些提示来自个人项目、彻底的代码审查和与资深开发人员的启发性讨论。

无论您是新手还是经验丰富的开发人员,这篇文章都应该能够帮助您学到一些东西。

这个列表包括常见的Python模式、核心概念和最佳实践。
由于没有特定的顺序,请随时直接跳转到您感兴趣的部分。

不再废话,让我们来看看吧👀

1 — 三元操作符

Python中的三元操作符提供了一种内联方式来编写条件表达式。当您需要根据条件为变量分配一个值时,它们特别有用。

age = 25
status = "成年人" if age >= 18 else "未成年人"print(status)
# 成年人

在这个示例中,如果年龄大于或等于18,status变量的值将是"成年人",否则将是"未成年人"。

当它们用于列表推导式时,三元操作符非常有用

scores = [100, 46, 54, 23, 20, 99]
threshold = 50
results = ["通过" if score > threshold else "未通过" for score in scores]print(results)    
# ['通过', '未通过', '通过', '未通过', '未通过', '通过']

或者用于lambda函数:

scores = [100, 46, 54, 23, 20, 99]
threshold = 50results = map(lambda score: "通过" if score > threshold else "未通过", scores)
print(results)    
# ['通过', '未通过', '通过', '未通过', '未通过', '通过']

2 — 上下文管理器

想象一下,您用Python打开一个文件,在文件中写入了一些行,然后在您甚至无法关闭它之前发生了异常。

虽然这对于初学者开发人员来说似乎不是什么问题,但它会占用一个永远不会被清除的内存资源(文件描述符),并且可能会阻止部分数据被写入。

上下文管理器可以帮助您避免这种情况。它们用于管理资源,并确保这些资源被正确初始化和清理。

它们通过封装资源管理的逻辑在上下文管理器对象内,有助于编写更可读和可维护的代码。

→ 最常见的上下文管理器是使用open创建的

with open('file.txt', 'r') as file:# 如果在这里发生了任何错误data = file.read()

open()函数返回一个文件对象,它充当上下文管理器。当with语句内部的块退出时,它会自动关闭文件,确保正确的清理。

您还可以在其他情况下使用上下文管理器来处理:

👉 数据库连接:

import psycopg2with psycopg2.connect(database='mydb') as conn:cursor = conn.cursor()cursor.execute('SELECT * FROM table')results = cursor.fetchall()

在这个示例中,psycopg2库的connect()方法返回一个连接对象,它充当上下文管理器,当块退出时会自动关闭连接。

👉 锁定资源:

import threading
lock = threading.Lock()def some_function():with lock:# 临界代码段

在这里,threading模块的Lock()对象被用作上下文管理器,以确保一次只有一个线程可以访问关键代码段。

3 — 创建自己的上下文管理器!

有时您可能需要定义自己的上下文管理器。

为此,您需要定义一个实现__enter__()和__exit__()方法的类:

  • enter()在with块启动时调用
  • exit()在执行离开with代码块时调用

以下是一个测量代码块执行时间的自定义上下文管理器示例:

示例1:计时器

import timeclass Timer:def __enter__(self):self.start_time = time.time()def __exit__(self, exc_type, exc_val, exc_tb):elapsed_time = time.time() - self.start_timeprint(f"执行时间:0.0556秒")

这个示例非常简单。让我们看看另一个模仿open行为的示例。

示例2:自定义文件打开器

class WritableFile:def __init__(self, file_path):self.file_path = file_pathdef __enter__(self):print("打开文件")self.file_obj = open(self.file_path, mode="w")return self.file_objdef __exit__(self, exc_type, exc_val, exc_tb):if self.file_obj:self.file_obj.close()print("文件成功关闭")

虽然这些示例相当简单,但它们应该为您提供一个构建更高级上下文管理器的起点代码段,其中执行适当的资源清理。

4 — 枚举

如果您想要迭代一个序列并同时跟踪每个项目的索引,那么应该使用enumerate函数。

它通过消除手动管理单独的索引变量,使代码更加简洁。

fruits = ['苹果', '香蕉', '橙子']
for index, fruit in enumerate(fruits):print(f"索引:{index},水果:{fruit}")# 索引:0,水果:苹果
# 索引:1,水果:香蕉
# 索引:2,水果:橙子

5 — Zip

zip函数允许同时迭代多个序列:

names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
for name, age in zip(names, ages):print(f"姓名:{name},年龄:{age}")# 姓名:Alice,年龄:25
# 姓名:Bob,年龄:30
# 姓名:Charlie,年龄:35

作为有趣的用例,zip还可以从两个列表创建一个字典,其中键来自第一个列表,值来自第二个列表。

keys = ['a', 'b', 'c']
values = [1, 2, 3]
my_dict = dict(zip(keys, values))
print(my_dict)# {'a': 1, 'b': 2, 'c': 3}

6 — 使用sorted对复杂对象进行排序

sorted函数允许您根据某些属性对复杂对象进行排序。

要访问要排序的属性值,您必须使用自定义的key函数。

假设您要根据"age"键对这些人进行排序。

people = [{'name': 'Alice', 'age': 25},{'name': 'Bob', 'age': 30},{'name': 'Charlie', 'age': 20}
]
只需将key参数设置为指向age值。sorted_people = sorted(people, key=lambda x: x['age'])
print(sorted_people)# [{'name': 'Charlie', 'age': 20}, {'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]

如果将字典替换为对象,它的工作方式也是一样的:

class Person:def __init__(self, name, age):self.name = nameself.age = agepeople = [Person('Alice', 25),Person('Bob', 30),Person('Charlie', 20)
]
sorted_people = sorted(people, key=lambda x: x.age)
print([person.name for person in sorted_people])print(sorted_people)# ['Charlie', 'Alice', 'Bob']

7 — 使用生成器节省内存

Python生成器是一种可迭代类型,可用于即时生成一系列值,而不必将它们全部存储在内存中。它们使用yield关键字定义,而不是return。

这是一个计算斐波那契数的简单生成器。

def fibonacci_generator():a, b = 0, 1while True:yield aa, b = b, a + b

调用这个函数实际上不会运行它。它创建并返回一个生成器对象。

fib = fibonacci_generator()fib 
# <generator object fibonacci_generator at 0x7fea39c31890>

这个生成器对象仅在传递给next函数时生成斐波那契值。

next(fb)
# 0
next(fb)
# 1
next(fb)
# 1
next(fb)
# 2

或者使用for循环迭代(在底层基本上调用了next函数)。

这是内存高效的,因为它避免了预先生成整个(无限)序列。

生成器的一个自然用例是逐行(或分块)读取大型数据集

def read_large_file(filename):with open(filename, 'r') as file:for line in file:yield line#逐行处理而不是加载整个文件
file_generator = read_large_file('large_file.txt')for line in file_generator:process_line(line)  #处理

8 — 使用f-strings改进字符串格式化!

f-strings改进了字符串格式化语法:它们是字符串文字,以f开头,包含用于替换为其值的表达式的花括号。

语法非常简单。

name = "Alice"
age = 25
print(f"你好{name},你今年{age}岁!")  # 你好Alice,你今年25岁!

甚至可以用它来计算任意表达式,比如函数调用:

def add_numbers(a, b):return a + bx = 5
y = 3
print(f"{x}{y}的和是{add_numbers(x, y)}。")  # 输出:5和3的和是8。

带有特定精度的浮点数:

pi = 3.14159265359
print(f"π的值约为{pi:.2f}。")  
# 输出:π的值约为3.14。

对象。

class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person("Bob", 25)
print(f"姓名:{person.name},年龄:{person.age}")  
# 输出:姓名:Bob,年龄:25

字典(在字典键周围使用简单的引号)

data_scientist = {'name': 'Ahmed BESBES', 'age': 32}
f"This data scientist is {data_scientist['name']}, aged {data_scientist['age']}."

这个数据科学家是Ahmed BESBES,年龄是32岁。
9 — 使用迭代器协议构建可迭代对象
您是否曾经想知道简单的for循环在幕后是如何工作的?

答案不在for循环本身,而是在被迭代的对象中(也称为可迭代对象)。这些可以是列表、字典或集合。

事实上,可迭代对象支持迭代器协议并实现__iter__()__next__()双下划线方法。

这些双下划线方法是使得可以迭代一组元素或执行自定义迭代的核心方法。

下面是一个自定义迭代器的示例,它接受一个数字列表并在运行时生成它们的平方:

class SquareIterator:def__init__(self, numbers):self.numbers = numbersself.index = 0def __iter__(self):return selfdef __next__(self):if self.index >= len(self.numbers):raise StopIterationsquare = self.numbers[self.index] ** 2self.index += 1return square

__iter__()方法中,返回迭代器对象本身。当初始化迭代器时调用此方法。

__next__()方法中,定义检索迭代中下一个元素的逻辑。

当没有更多元素可以迭代时,此方法应引发StopIteration异常。(请注意,索引在这里递增以跟踪其位置)

我们可以像这样使用这个自定义迭代器:

numbers = [1, 2, 3, 4, 5]
iterator = SquareIterator(numbers)for square in iterator:print(square)# 1
# 4
# 9
# 16
# 25

10 — 创建自定义异常类以记录您的代码

我从未考虑过创建自定义异常类。我只依赖于内置的异常。

事实是,在大型代码库中使用它们会带来多重好处。

它们允许您创建更具体和有意义的异常,准确表示代码中发生的错误或异常情况。这有助于调试提高了协作:

如果您的同事开始向同一存储库推送代码,他们更容易通过具有明确消息而不是通用的ValueError异常来调试错误

这是一个自定义异常类的示例,当输入字符串长度超过阈值时引发异常。

class NameTooLongError(Exception):"""用于过长名称的自定义异常。"""def __init__(self, name, max_length):self.name = nameself.max_length = max_lengthsuper().__init__(f"名称'{name}'太长,允许的最大长度为{max_length}个字符。")def process_name(name):max_length = 10  # 允许的最大名称长度if len(name) > max_length:raise NameTooLongError(name, max_length)else:print("名称处理成功:", name)# 示例用法
try:input_name = "AVeryLongName"process_name(input_name)
except NameTooLongError as e:print("错误:", e)

本文由mdnice多平台发布

相关文章:

50个简洁的提示提高代码可读性和效率(0-10)

这篇文章整理了50个简洁的提示&#xff0c;可以提高您的代码可读性和效率。这些提示来自个人项目、彻底的代码审查和与资深开发人员的启发性讨论。 无论您是新手还是经验丰富的开发人员&#xff0c;这篇文章都应该能够帮助您学到一些东西。 这个列表包括常见的Python模式、核…...

Linux —— 进程信号

一&#xff0c;信号概念 信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断&#xff1b; 系统定义的信号 每个信号都有一个编号和一个宏定义名称&#xff08;可在signal.h查看&#xff09;&#xff1b;编号34以上的为实时信号&#xff1b; [wz192 Desktop]$ kill -…...

Android笔记 自定义控件时drawText字符串宽度的3种计算方式

String str "hello"; canvas.drawText(str, x, y, mPaint);//1. 粗略计算文字宽度&#xff1a; float width mPaint.measureText(str);//2. 计算文字的矩形&#xff0c;可以得到宽高&#xff1a; Rect rect new Rect(); mPaint.getTextBounds(str, 0, str.length(…...

ChatRWKV 学习笔记和使用指南

0x0. 前言 Receptance Weighted Key Value&#xff08;RWKV&#xff09;是pengbo提出的一个新的语言模型架构&#xff0c;它使用了线性的注意力机制&#xff0c;把Transformer的高效并行训练与RNN的高效推理相结合&#xff0c;使得模型在训练期间可以并行&#xff0c;并在推理…...

Particle Life粒子生命演化的MATLAB模拟

Particle Life粒子生命演化的MATLAB模拟 0 前言1 基本原理1.1 力影响-吸引排斥行为1.2 距离rmax影响 2 多种粒子相互作用2.1 双种粒子作用2.1 多种粒子作用 3 代码 惯例声明&#xff1a;本人没有相关的工程应用经验&#xff0c;只是纯粹对相关算法感兴趣才写此博客。所以如果有…...

golang中byte和rune的区别?

golang中byte和rune的区别&#xff1f; rune和byte在go语言中都是字符类型&#xff0c;从源码来看他们都是别名形式 // byte is an alias for uint8 and is equivalent to uint8 in all ways. It is // used, by convention, to distinguish byte values from 8-bit unsigned…...

AI图像行为分析算法 opencv

AI图像行为分析算法通过pythonopencv深度学习框架对现场操作行为进行全程实时分析&#xff0c;AI图像行为分析算法通过人工智能视觉能够准确判断出现场人员的作业行为是否符合SOP流程规定&#xff0c;并对违规操作行为进行自动抓拍告警。OpenCV是一个基于Apache2.0许可&#xf…...

MATLAB制图代码【第二版】

MATLAB制图代码【第二版】 文档描述 Code describtion: This code is version 2 used for processing the data from the simulation and experiment. Time : 2023.9.3 Author: PEZHANG 这是在第一版基础上&#xff0c;迭代出的第二版MATLAB制图代码&#xff0c;第二版的特点是…...

5.0: Dubbo服务导出源码解析

#Dubbo# 文章内容 Dubbo服务导出基本原理分析Dubbo服务注册流程源码分析Dubbo服务暴露流程源码分析服务导出的入口方法为ServiceBean.export(),此方法会调用ServiceConfig.export()方法,进行真正的服务导出。 1. 服务导出大概原理 服务导出的入口方法为ServiceBean.export…...

python自动化测试-自动化基本技术原理

1 概述 在之前的文章里面提到过&#xff1a;做自动化的首要本领就是要会 透过现象看本质 &#xff0c;落实到实际的IT工作中就是 透过界面看数据。 掌握上面的这样的本领可不是容易的事情&#xff0c;必须要有扎实的计算机理论基础&#xff0c;才能看到深层次的本质东西。 …...

lodash 之 _.isEmpty

lodash.isEmpty() 是 Lodash 库中的一个函数&#xff0c;用于检查给定值是否为空。它可以用于判断对象、数组、字符串等不同类型的值是否为空。 const _ require(lodash);console.log(_.isEmpty(null)); // 输出: trueconsole.log(_.isEmpty(undefined)); // 输出: trueconso…...

layui数据表格实现表格中嵌套表格,并且可以折叠展开

效果&#xff1a; 思路&#xff1a; 1、最外层的表格先渲染&#xff0c;在done回调中向每个tr后面插入一个用来嵌套子级表格的tr。 tr的class和table的id需要用索引 i 关联 //向每一行tr后面追加显示子table的trlet trEles $(".layui-table-view[lay-idlist] tbody tr&…...

云端笔记系统-自动化测试

文章目录 1. 思维导图编写 Web 自动化测试用例2. 创建测试项目3. 根据思维导图设计【云端笔记】自动化测试用例3.1. 准备工具类3.2. 测试注册页面3.3. 测试登陆页面3.4. 测试添加博客页3.5. 测试我的博客列表页3.6. 测试修改博客页3.7. 测试博客列表页3.8. 测试博客详情页3.9. …...

将帅要避免五个方面的弱点:蛮干、怕死、好名、冲动、溺爱民众

将帅要避免五个方面的弱点&#xff1a;蛮干、怕死、好名、冲动、溺爱民众 【安志强趣讲《孙子兵法》第28讲】 【原文】 是故屈诸侯者以害&#xff0c;役诸侯者以业&#xff0c;趋诸侯者以利。 【注释】 趋&#xff1a;归附、依附。 【趣讲白话】 所以&#xff0c;用祸患威逼诸侯…...

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书成都理工大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书成都理工大学图书馆...

vue的第3篇 第一个vue程序

一 vue的mvvm实践者 1.1 介绍 Model&#xff1a;模型层&#xff0c; 在这里表示JavaScript对象 View&#xff1a;视图层&#xff0c; 在这里表示DOM(HTML操作的元素) ViewModel&#xff1a;连接视图和数据的中间件&#xff0c; Vue.js就是MVVM中的View Model层的实现者 在M…...

线性求逆元

先暴力求出 1 n ! \frac 1 {n!} n!1​往回推出 1 i ! \frac 1 {i!} i!1​ 1 i ( i − 1 ) ! i ! \Large \frac 1 i\frac{(i-1)!}{i!} i1​i!(i−1)!​...

第一章 USB应用笔记之USB初步了解

USB应用笔记之USB初步了解 文章目录 USB应用笔记之USB初步了解前言USB的优点&#xff1a;USB版本发展USB速度以及电气接口USB传输过程USB开发抓包工具&#xff1a;USB传输方式1.控制传输特点:2.中断传输的特点3. 批量传输的特点4.实时传输&#xff08;同步传输&#xff09;的特…...

小白入门python

建议用vscode进行代码学习 vscode下载地址:Download Visual Studio Code - Mac, Linux, Windows 左侧点击扩展安装python,右下角选择python版本&#xff0c;记得配置系统环境变量&#xff0c;python在系统(cmd)的版本由环境变量优先级决定,在编程软件中由自己选择解释器...

《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.17集群(多主多从)》

一、架构图 如下图所示: 二、环境信息 1、部署规划主机名K8S版本系统版本内核版本IP地址备注k8s-master-631.24.17Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63master节点 + etcd节点k8s-master-641.24.17Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.64master节点 + …...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...