Python的风格应该是怎样的?除语法外,有哪些规范?

news2024/11/18 15:44:11

写代码不那么pythonic风格的,多多少少都会让人有点难受。

什么是pythonic呢?简而言之,这是一种写代码时遵守的规范,主打简洁、清晰、可读性高,符合PEP 8(Python代码样式指南)约定的模式。

Python社区发展几十年,已经沉淀出一套更加科学规范的代码书写法则,该踩的坑都帮你踩过了,按这个来基本不会出什么错。

下面举几个不那么pythonic的代码案例,虽然不会出错,但十分不建议这样写。

1、函数、变量命名无意义、不规范

很多人图省事,使用a、aa、bbb这样无意义的变量名、函数名,这样在编程中会大大降低代码的可读性,也影响代码质量。

def a(revenue, cost):  
    """  
    计算销售利润率。  
    :param revenue: 销售额(或总收入)  
    :param cost: 成本  
    :return: 销售利润率(以百分比表示)  
    """  
    if revenue <= 0 or cost < 0:  
        return "错误:销售额必须大于0,成本不能为负数。"  
    aa = revenue - cost  
    bbb = (aa / revenue) * 100  
    return bbb

更有初学者使用中文来作为变量名,虽然在语法上是允许的,但会引起歧义,不符合代码规范

年龄 = 30
名字 = "张三"
print("{}的年龄是{}".format(名字,年龄))

2、不善于使用函数和类,重复写代码

Python是鼓励用函数和类去封装一些重复用的功能,这样能增加代码的可读性,也减少不必要的劳动,但一些人就是喜欢写很长的代码,导致看着很冗余。

在Python中大家可以把一个复杂的功能,用多个函数去分解,一个函数代码行数最好不要超过十行,如果确实需要很多代码,那就进行分解,多写几个函数来实现。

比如以下的函数,用来实现csv文件的读取、行去重、空值剔除、保存等功能。

import csv  

def process_csv(input_file, output_file):  
    """  
    读取CSV文件,去重,剔除空值,并保存到新文件。  
    :param input_file: 输入的CSV文件路径  
    :param output_file: 输出的CSV文件路径  
    """  
    # 读取CSV文件  
    with open(input_file, mode='r', newline='', encoding='utf-8') as file:  
        reader = csv.reader(file)  
        rows = [row for row in reader if row]  # 剔除空行  

    # 去重  
    unique_rows = []  
    for row in rows:  
        # 将行转换为元组以用于集合去重  
        unique_rows.append(tuple(row))  

    # 剔除空值  
    processed_rows = [[cell for cell in row if cell] for row in unique_rows]  

    # 转换回列表以写入CSV文件  
    processed_rows = [[str(cell) for cell in row] for row in processed_rows]  

    # 写入新的CSV文件  
    with open(output_file, mode='w', newline='', encoding='utf-8') as file:  
        writer = csv.writer(file)  
        writer.writerows(processed_rows) 

当你看到这个函数,是不是觉得有点冗长,一个函数实现了四个功能,不易阅读也不利于重复利用。

如果把它拆分成四段函数,分别实现读取、行去重、空值剔除、保存这四个功能,就会更加清晰。

import csv  

def read_csv(file_path):  
    """  
    读取CSV文件并返回行的列表。  

    :param file_path: CSV文件路径  
    :return: CSV文件行的列表  
    """  
    with open(file_path, mode='r', newline='', encoding='utf-8') as file:  
        reader = csv.reader(file)  
        return [row for row in reader if row]  # 剔除空行  

def remove_duplicates(rows):  
    """  
    去除行列表中的重复行。  

    :param rows: 行的列表  
    :return: 去重后的行列表  
    """  
    return list(set(tuple(row) for row in rows))  

def remove_empty_values(rows):  
    """  
    从行列表中剔除含有空值的行。  

    :param rows: 行的列表  
    :return: 剔除空值后的行列表  
    """  
    return [[cell for cell in row if cell] for row in rows]  

def write_csv(file_path, rows):  
    """  
    将行列表写入CSV文件。  

    :param file_path: CSV文件路径  
    :param rows: 要写入的行列表  
    """  
    with open(file_path, mode='w', newline='', encoding='utf-8') as file:  
        writer = csv.writer(file)  
        writer.writerows(rows)  

3、使用很复杂的列表推导式,较难阅读

列表推导式可以简化列表的创建,既实用还能让代码更加美观,但列表推导式只适合创建逻辑简单的列表,对于很复杂且代码量大的列表,是不建议用列表推导式的,比如以下案例。

nested_list = [[(i * j, i + j, i - j) for j in range(1, 4)] for i in range(5, 10)]

改成如下循环函数是否更好?

def generate_nested_list(start_i, end_i):  
    nested_list = []  
    for i in range(start_i, end_i):  
        sublist = []  
        for j in range(1, 4):  
            sublist.append((i * j, i + j, i - j))  
        nested_list.append(sublist)  
    return nested_list  

4、代码行特别长,也很难阅读

一般Python代码行长度最好不要超过79,vscode和pycharm等编辑器里都有代码长度指引线,写代码时遇到它就是提示你要换行了。

连续代码(一行代码很长,需要分在多行写)中被裹着的代码(可能被 (), [], {} 包裹)应该垂直(左)对齐。

def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

其实还有很多pythonic风格的规范,需要大家注意,建议按照约定俗成的方法去写,第一原则是可读性强,可读性强,可读性强。

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

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

相关文章

线段树及应用

目录 1. 线段树基础 &#xff08;1&#xff09;什么是线段树 &#xff08;2&#xff09;线段树的拆分原理 &#xff08;3&#xff09;相关算法对比 &#xff08;4&#xff09;线段树的使用前提 &#xff08;5&#xff09;线段树建树操作 &#xff08;6&#xff09;线段树…

Unity 编辑器多开

开发多人联机的功能时大多数会遇到测试机不方便的问题。想多开同一个项目Uinty又禁止。。。因为在使用Unity Editor打开一个项目时&#xff0c;Unity Editor会在项目目录建立一个Temp目录&#xff0c;同时对里面的一个UnityLockfile文件进行加锁。SO...可以使用以下方法进行多开…

macOS 开发环境配置与应用开发

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【CSS Tricks】css动画详解

目录 引言动画关键帧序列动画各属性拆解1. animation-name2. animation-duration3. animation-delay设置delay为正值设置delay为负值 4. animation-direction5. animation-iteration-count6. animation-fill-mode7. animation-play-state8. animation-timing-function非阶跃函数…

【2025】基于Django的鱼类科普网站(源码+文档+调试+答疑)

文章目录 一、基于Django的鱼类科普网站-项目介绍二、基于Django的鱼类科普网站-开发环境三、基于Django的鱼类科普网站-系统展示四、基于Django的鱼类科普网站-代码展示五、基于Django的鱼类科普网站-项目文档展示六、基于Django的鱼类科普网站-项目总结 大家可以帮忙点赞、收…

B3621 枚举元组

1.递归的具体过程&#xff0c;一个dfs1&#xff0c;产生3个dfs2&#xff0c;一个dfs2产生3个dfs3&#xff0c;一共输出9个&#xff08;用n2&#xff0c;k3举例&#xff09; 2.要记得使用return 结束当前递归 #include<bits/stdc.h> using namespace std; int n, k, a[10…

telnet发送邮件教程:安全配置与操作指南?

telnet发送邮件的详细步骤&#xff1f;怎么用telnet命令发邮件&#xff1f; 尽管现代邮件客户端和服务器提供了丰富的功能和安全性保障&#xff0c;但在某些特定场景下&#xff0c;了解如何使用telnet发送邮件仍然是一项有价值的技能。AokSend将详细介绍如何安全配置和操作tel…

英集芯IP5911:集成锂电池充电管理和检测唤醒功能的低功耗8位MCU芯片

英集芯IP5911是一款集成锂电池充电管理、咪头检测唤醒、负载电阻插拔和阻值检测等功能的8bit MCU芯片。其封装采用QFN16&#xff0c;应用时仅需极少的外围器件&#xff0c;就能够有效减小整体方案的尺寸&#xff0c;降低BOM成本&#xff0c;为小型电子设备提供高集成度的解决方…

QT 开发日志:QT 布局管理 —— 如何使用布局器组织 UI 元素

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

探索高效免费的PDF转Word工具,开启便捷办公之旅

无论是为了方便对文档内容进行编辑、修改&#xff0c;还是为了更好地适应不同的工作和学习场景&#xff0c;将 PDF 文档转换为可编辑的 Word 格式都具有重要意义。今天我就分享几款pdf转换成word免费版工具来解决大家的困扰。 1.Foxit PDF转换大师 链接一下>>https://w…

系统架构设计师-知识产权与标准化

目录 一、保护范围与对象 二、保护期限 三、知识产权人确定 四、侵权判断 五、标准化 一、保护范围与对象 知识产权是权利人依法就下列课题享有的专有权利&#xff1a; &#xff08;一&#xff09;作品&#xff08;著作&#xff09; &#xff08;二&#xff09;发明、实用…

通过OpenScada在ARMxy边缘计算网关上实现远程监控

随着工业互联网技术的发展&#xff0c;边缘计算逐渐成为连接物理世界与数字世界的桥梁。在众多边缘计算设备中&#xff0c;ARMxy BL340系列因其强大的性能、灵活的I/O配置及广泛的适用性&#xff0c;成为了工业控制、物联网关等领域的优选方案之一。 一、ARMxy BL340系列概述 …

波导阵列天线 馈电网络2 一种使用有着多反射零点的T型结的毫米波48%带宽高增益3D打印天线阵列

摘要&#xff1a; 一种设计毫米波宽带大规模天线阵列的创新方法被提出了&#xff0c;其使用有着多个反射零点的波导T型结来构建一个H型全公共馈网。通过联合优化反射零点的性质&#xff0c;可以减弱馈网中不期望的小反射的同相叠加&#xff0c;因此提升阵列的带宽。调研了合成有…

04 B-树

目录 常见的搜索结构B-树概念B-树的插入分析B-树的插入实现B树和B*树B-树的应用 1. 常见的搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O( l o g 2 N log_2N log2​N)二分搜索树无要求O(N)二叉平衡树无要求O( l o g 2 N log_2N log2​N)哈希无要求O(1) 以…

[网络]NAT、代理服务、内网穿透、内网打洞

目录 一、NAT 1.1 NAT 技术背景 1.2 NAT IP 转换过程 1.3 NAPT&#xff08;Network Address Port Translation&#xff09; 1.地址转换表 2. NAPT&#xff08;网络地址端口转换Network Address Port Translation&#xff09; 3. NAT技术的缺陷 二、代理服务器 2.1 正向…

麒麟桌面系统安装和配置Node.js

1.官网下载tar.xz文件 Node.js — 在任何地方运行 JavaScript 2.解压 可以双击直接窗口解压&#xff0c;也可以使用如下命令进行解压&#xff1a; xz -d xxx.tar.xz&#xff1b; tar -xvf xxx.tar 可以解压到usr目录或者其他目录。 3. 配置环境 解压完毕后&#xff0c…

Redis中数据类型的使用(hash和list)

&#xff08;一&#xff09;hash哈希 我们知道redis中的数据都是以键值对的方式存储的&#xff0c;key全部都是string类型&#xff0c;而value可以是不同的数据结构&#xff0c;其中就包括hash&#xff0c;也就是说&#xff0c;key这一层组织完成后到了value仍然是hash 1.Hash…

企业级移动门户的多样化选择:为数字化转型赋能

在当今数字化转型的浪潮中&#xff0c;企业级移动门户&#xff08;Enterprise Mobile Portal&#xff09;被广泛应用于企业的日常运营中。它们为企业提供了一个集中、统一的移动应用与数据访问平台&#xff0c;帮助提升工作效率、增强实时沟通并改善员工体验。随着企业对灵活性…

Qt --- 系统相关---事件、文件操作、多线程编程、网络编程、多媒体

虽然Qt是跨平台的C开发框架&#xff0c;Qt的很多能力其实是操作系统提供的。只不过Qt封装了系统API。程序是运行在操作系统上的&#xff0c;需要系统给我们提供支撑。 事件、文件操作、多线程编程、网络编程、多媒体&#xff08;音频、视频&#xff09;。 一、事件 信号槽&a…

数学期望专题

9.29 - 10.6 更新时间约持续一周 优惠券 Coupons 题目链接&#xff1a;优惠券 Coupons 假设我们某个情况下&#xff0c;我们已经有了 k 种图案&#xff0c;在这个条件下&#xff0c;获得一个新图案需要 天&#xff0c;那我们要求的就是 。由于已经有了 k 种图案&#xff0c…