目录
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)
这样做的另一个好处是在使用编辑器(VsCode)时,可以在鼠标指向调用方法可以弹出功能说明和传参等提示,方便维护和别人调用模块参数.内容如下:
(function) def load_config(config_path: str) -> Dict[str, Any] 从路径中读取yml数据 Args config_path : str yml文件的路径 Returns Dict[str,Any] 配置文件的字典数据
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
在上面的例子中,没有先判断chatId在chatIds中,而是先进行否定判断,这样可以减少else的嵌套并且使可读性更强.
第二个是在进行简单的if.....else....返回值时可以使用三元运算符形式直接返回.
if data_class is None: # 当未配置data_class时,返回默认的字典数据 return res_json if res_json else None
这里在判断res_json是否为有数据时直接使用三元运算符,在无数据时返回None,简化了if....else的编写.
2.3 方法参数和返回值
方法参数与返回值都应该标明具体的类型,因为在不标明参数类型的,Python默认使用any类型,这为后期的维护工作埋下了"炸弹",当项目结构越来越复杂时,可能自己都看不懂具体返回了什么数据.推荐进行传参和返回值的标识,无返回值的参数应该标识为None:
def send_request(url:str,headers:str)->Dict[str,Any]:
2.4 异常
在进行异常捕获时,不要使用以下格式进行大范围的捕获:
try: {代码块} except Exception as e: {异常输出}
应该详细了解自己捕获的方法会报出具体的哪些异常类型,这样做的好处时当报错时,可以清楚的看到错误数据哪个错误发出的.例如以下格式:
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
这样捕获时,请求错误会被RequestException捕获,数据解析错误可以被 (ValueError,TypeError)错误捕获,通过自定义打印的字符串可以很清楚的知道因为什么报的错误,以此定位问题所在.
2.5 字典[Dict]
在使用字典取值时应该使用以下方式进行取值:
self.symbol=stats_data.get("symbol","")
使用以上方式的好处时,可以在取值时默认值,不会发生取值异常,这会降低程序运行的稳定性.而不是直接使用以下方式进行取值:
self.symbol=stats_data["symbol"]
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]
上述代码中使用列表推导式完成了列表中整体对象的封装,而不是使用for循环每一项进行封装.
2.7 配置
如果存在大量需要经常改动的静态字符串,如API_KEY、密码等,这些可以独立到单独的配置文件中.程序启动时从配置文件中进行读取.一些固定的字符串的如请求URL、标识、提示等需要放在一个单独的文件内进行整体管理,这样可以方便维护.
三、总结
在 Python 开发中,良好的代码风格和优化技巧能提高代码的可读性、可维护性,并减少潜在错误。以上是我在日常开发中的一些总结,如果你有更好的优化,或其它方面的对代码规范、可读性改进的方法,欢迎在评论区留言(虚心学习)。
如果你对区块链内容感兴趣可以查看我的专栏:小试牛刀-区块链
感谢您的关注和收藏!!!!!!
编辑