实用Python代码优化技巧

简介: 在日常开发中,规范的代码结构可以提高代码阅读性,方便后期维护,在开源项目中尤为重要。毕竟谁也不想让人将自己的代码称为"屎山",这里将日常开发中需要注意的点进行总结。

目录

一、编写目的

二、可优化点

2.1 注释

2.2 条件语句

2.3 方法参数和返回值

2.4 异常

2.5 字典[Dict]

2.6 列表

2.7 配置

三、总结


Welcome to Code Block's blog

本篇文章主要介绍了

[实用Python代码优化技巧]

❤博主广交技术好友,喜欢文章的可以关注一下❤

一、编写目的

        在日常开发中,规范的代码结构可以提高代码阅读性,方便后期维护,在开源项目中尤为重要。毕竟谁也不想让人将自己的代码称为"屎山",这里将日常开发中需要注意的点进行总结。

       适用于 Python 初学者希望编写更高效代码的学习者,也适用于经验丰富的开发者优化现有项目的实践者。希望通过本指南,让开发者能够掌握 Python 代码优化的核心技巧,提升代码质量,减少运行时间,并增强代码的可扩展性和可维护性。  

二、可优化点

2.1 注释

       注释放在开头的原因是因为注释在开发中重要,最基本的需要在每个方法中标出该方法的功能,传递的参数、返回值的类型和解释.在Python中推荐使用"""进行标记注释,例如下面这个读取yml配置文件功能的方法:

def load_config(config_path:str)->Dict[str,Any]:
    """
        从路径中读取yml数据
        Args:
            config_path(str): yml文件的路径
        Returns:
            Dict[str,Any]: 配置文件的字典数据
    """
    with open(config_path,"r") as config_file:
        return yaml.safe_load(config_file)

image.gif

       这样做的另一个好处是在使用编辑器(VsCode)时,可以在鼠标指向调用方法可以弹出功能说明和传参等提示,方便维护和别人调用模块参数.内容如下:

(function) def load_config(config_path: str) -> Dict[str, Any]
从路径中读取yml数据
Args
config_path : str
yml文件的路径
Returns
Dict[str,Any]
配置文件的字典数据

image.gif

2.2 条件语句

       在使用条件语句时有两个可优化点,第一个是if...else....嵌套可以转变为先判断否定的参数的返回方法,这样写可读性更高.例如:

with LOCK:
        chatIds=get_chat_id_list(symbol)
        if chatId not in chatIds:
            return False
        chatIds.remove(chatId)    
        DB.update(set("chatIds", chatIds),QUERY.symbol==symbol)
        return True

image.gif

在上面的例子中,没有先判断chatId在chatIds中,而是先进行否定判断,这样可以减少else的嵌套并且使可读性更强.

第二个是在进行简单的if.....else....返回值时可以使用三元运算符形式直接返回.

if data_class is None: # 当未配置data_class时,返回默认的字典数据
    return res_json if res_json  else None

image.gif

这里在判断res_json是否为有数据时直接使用三元运算符,在无数据时返回None,简化了if....else的编写.

2.3 方法参数和返回值

       方法参数与返回值都应该标明具体的类型,因为在不标明参数类型的,Python默认使用any类型,这为后期的维护工作埋下了"炸弹",当项目结构越来越复杂时,可能自己都看不懂具体返回了什么数据.推荐进行传参和返回值的标识,无返回值的参数应该标识为None:

def send_request(url:str,headers:str)->Dict[str,Any]:

image.gif

2.4 异常

在进行异常捕获时,不要使用以下格式进行大范围的捕获:

try:
    {代码块}
except Exception as e:
    {异常输出}

image.gif

       应该详细了解自己捕获的方法会报出具体的哪些异常类型,这样做的好处时当报错时,可以清楚的看到错误数据哪个错误发出的.例如以下格式:

try:
    response=requests.get(url,headers,timeout=5)
    response.raise_for_status()
    resJson=response.json()
    return resJson
 except RequestException as e:
    print(f"RequestException:{e}")
 except (ValueError,TypeError) as e:
    print(f"Json Decoder Error:{e}")
 except Exception as e:
    print(f"Exception Error:{e}")
 return None

image.gif

这样捕获时,请求错误会被RequestException捕获,数据解析错误可以被 (ValueError,TypeError)错误捕获,通过自定义打印的字符串可以很清楚的知道因为什么报的错误,以此定位问题所在.

2.5 字典[Dict]

在使用字典取值时应该使用以下方式进行取值:

self.symbol=stats_data.get("symbol","")

image.gif

使用以上方式的好处时,可以在取值时默认值,不会发生取值异常,这会降低程序运行的稳定性.而不是直接使用以下方式进行取值:

self.symbol=stats_data["symbol"]

image.gif

2.6 列表

       当进行简单的列表的循环操作时,可以使用列表推导式进行简化,例如:

from typing import Type,T,List
def parse_list(data_list:List, cls: Type[T]):
    """
    通用方法,将列表中的每一项转换为指定的类实例。
    :param data_list: 需要转换的数据列表
    :param cls: 目标类,用于实例化列表中的每一项
    :return: 转换后的对象列表
    """
    return [cls(item) for item in data_list]

image.gif

上述代码中使用列表推导式完成了列表中整体对象的封装,而不是使用for循环每一项进行封装.

2.7 配置

       如果存在大量需要经常改动的静态字符串,如API_KEY、密码等,这些可以独立到单独的配置文件中.程序启动时从配置文件中进行读取.一些固定的字符串的如请求URL、标识、提示等需要放在一个单独的文件内进行整体管理,这样可以方便维护.

三、总结

       在 Python 开发中,良好的代码风格和优化技巧能提高代码的可读性、可维护性,并减少潜在错误。以上是我在日常开发中的一些总结,如果你有更好的优化,或其它方面的对代码规范、可读性改进的方法,欢迎在评论区留言(虚心学习)。

如果你对区块链内容感兴趣可以查看我的专栏:小试牛刀-区块链

感谢您的关注和收藏!!!!!!

image.gif 编辑

目录
相关文章
|
7月前
|
区块链 数据安全/隐私保护 Python
小试牛刀-区块链WalletConnect协议数据解密
最近在学习如何使用Wallet Connect,查阅官方文档后,发现并没有太多的中文参考资料,英文直译读起来也有一些偏差,所以这边直接采用网页Demo的方式,对WC协议有了一定了解.在此进行记录,同时希望帮助到有实现相关功能的朋友.
606 4
|
7月前
|
缓存 监控 Linux
Linux系统性能调优技巧和相关工具
Linux 作为一种应用应展和系统服务的优选操作系统,在处理性能和端到端点评估上持有出色表现。但是,在处理进程或系统处于低效状态时,性能调优就显得十分重要。本文将探讨一些 Linux 系统性能调优的常用技巧,并介绍相关工具
202 1
Linux系统性能调优技巧和相关工具
|
7月前
|
开发框架 Rust JavaScript
小试牛刀-Anchor安装和基础测试
Anchor是一个SOL链的开发框架,可以很方便的完成链上程序(Program)的编写,并且可以进行快速的前端测试。但安装时需要很多步骤,并且在测试时也有些错误需要注意。在这里对步骤和相关版本进行记录,作为记录和过程分享。
259 4
|
7月前
|
监控 安全 网络安全
网络安全工具及其使用方法:保护数字安全的第一道防线
在信息时代,网络攻击变得日益复杂且频繁,保护个人和企业数据安全的重要性日益凸显。幸运的是,各种网络安全工具为用户提供了有效的防护手段。从防火墙到密码管理器,这些工具覆盖了威胁检测、攻击防御和数据保护的方方面面。本文将介绍几款常用的网络安全工具,并提供其使用方法,以帮助您构建强大的网络安全防线。
254 1
|
缓存 Shell API
一文带你掌握nest.js访问静态资源
一文带你掌握nest.js访问静态资源
一文带你掌握nest.js访问静态资源
|
7月前
|
算法 区块链 数据安全/隐私保护
加密算法:深度解析Ed25519原理
在 Solana 开发过程中,我一直对 Ed25519 加密算法 如何生成公钥、签名以及验证签名的机制感到困惑。为了弄清这一点,我查阅了大量相关资料,终于对其流程有了更清晰的理解。在此记录实现过程,方便日后查阅。
933 1
|
7月前
|
Java 区块链 Maven
关于引入maven项目后出现‘parent.relativePath’ of POM错误时的解决方法
关于引入maven项目后出现‘parent.relativePath’ of POM错误时的解决方法
608 3
|
7月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
1343 13
|
7月前
|
监控 安全 Java
SpringBoot应用-Actuator监控
Spring Boot Actuator 是 Spring Boot 提供的一个独立模块,旨在通过简单的方式提供应用程序的监控和管理功能。Actuator 内置了多种端点(Endpoints),可以用于查看应用的健康状况、配置属性、日志级别等。
1050 1