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

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

写代码不那么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风格的规范,需要大家注意,建议按照约定俗成的方法去写,第一原则是可读性强,可读性强,可读性强。

相关文章:

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

写代码不那么pythonic风格的&#xff0c;多多少少都会让人有点难受。 什么是pythonic呢&#xff1f;简而言之&#xff0c;这是一种写代码时遵守的规范&#xff0c;主打简洁、清晰、可读性高&#xff0c;符合PEP 8&#xff08;Python代码样式指南&#xff09;约定的模式。 Pyth…...

net core mvc 数据绑定 《1》

其它的绑定 跟net mvc 一样 》》MVC core 、framework 一样 1 模型绑定数组类型 2 模型绑定集合类型 3 模型绑定复杂的集合类型 4 模型绑定源 》》》》 模型绑定 使用输入数据的原生请求集合是可以工作的【request[],Querystring,request.from[]】&#xff0c; 但是从可读…...

python为姓名注音实战案例

有如下数据&#xff0c;需要对名字注音。 数据样例&#xff1a;&#x1f447; 一、实现过程 前提条件&#xff1a;由于会用到pypinyin库&#xff0c;所以一定得提前安装。 pip install pypinyin1、详细代码&#xff1a; from pypinyin import pinyin, Style# 输入数据 names…...

MATLAB中的艺术:用爱心形状控制坐标轴

在MATLAB中&#xff0c;坐标轴控制是绘图和数据可视化中的一个重要方面。通过精细地管理坐标轴&#xff0c;我们不仅可以改善图形的视觉效果&#xff0c;还可以赋予图形更深的情感寓意。本文将介绍如何在MATLAB中使用坐标轴控制来绘制一个爱心形状&#xff0c;并探讨其背后的技…...

基于mybatis-plus创建springboot,添加增删改查功能,使用postman来测试接口出现的常见错误

1 当你在使用postman检测 添加和更新功能时&#xff0c;报了一个500错误 查看idea发现是&#xff1a; Data truncation: Out of range value for column id at row 1 通过翻译&#xff1a;数据截断&#xff1a;表单第1行的“id”列出现范围外值。一般情况下&#xff0c;出现这个…...

Java:Object操作

目录 1、Object转List对象2、Object转实体对象 1、Object转List对象 List<User> userList MtUtils.ObjectToList(objData, User.class);/*** Object对象转 List集合** param object Object对象* param clazz 需要转换的集合* param <T> 泛型类* return*/ public s…...

Java-并发基础

启动线程的方式 只有&#xff1a; 1、X extends Thread;&#xff0c;然后X.start 2、X implements Runnable&#xff1b;然后交给Thread运行 有争议可以可以查看 Thread源码的注释&#xff1a; There are two ways to create a new thread of execution.Callable的方式需要…...

速盾:网页游戏部署高防服务器有什么优势?

在当前互联网发展的背景下&#xff0c;网页游戏的市场需求不断增长&#xff0c;相应地带来了对高防服务器的需求。高防服务器可以为网页游戏部署提供许多优势&#xff0c;下面就详细介绍一下。 第一&#xff0c;高防服务器具有强大的抗DDoS攻击能力。DDoS攻击是目前互联网上最…...

【从0开始自动驾驶】ros2编写自定义消息 msg文件和msg文件嵌套

【从0开始自动驾驶】ros2编写自定义消息 msg文件和msg文件嵌套 详细解答和讨论请私信在工作空间内新建一个功能包在msg内创建对应的msg文件创建名为TestMsg.msg的文件创建名为TestSubMsg.msg的文件&#xff08;在前一个msg文件中引用&#xff09;修改CmakeList.txt修改package.…...

docker 部署 Seatunnel 和 Seatunnel Web

docker 部署 Seatunnel 和 Seatunnel Web 说明&#xff1a; 部署方式前置条件&#xff0c;已经在宿主机上运行成功运行文件采用挂载宿主机目录的方式部署SeaTunnel Engine 采用的是混合模式集群 编写Dockerfile并打包镜像 Seatunnel FROM openjdk:8 WORKDIR /opt/seatunne…...

【易上手快捷开发新框架技术】nicegui标签组件lable用法庖丁解牛深度解读和示例源代码IDE运行和调试通过截图为证

传奇开心果微博文系列 序言一、标签组件lable最基本用法示例1.在网页上显示出 Hello World 的标签示例2. 使用 style 参数改变标签样式示例 二、标签组件lable更多用法示例1. 添加按钮动态修改标签文字2. 点击按钮动态改变标签内容、颜色、大小和粗细示例代码3. 添加开关组件动…...

从HarmonyOS Next导出手机照片

1&#xff09;打开DevEco Studio开发工具 2&#xff09;插入USB数据线&#xff0c;连接手机 3&#xff09;在DevEco Studio开发工具&#xff0c;通过View -> Tool Windows -> Device File Browser打开管理工具 4&#xff09;选择storage -> cloud -> 100->fi…...

[Docker学习笔记]Docker的原理Docker常见命令

文章目录 什么是DockerDocker的优势Docker的原理Docker 的安装Docker 的 namespaces Docker的常见命令docker version:查看版本信息docker info 查看docker详细信息我们关注的信息 docker search:镜像搜索docker pull:镜像拉取到本地docker push:推送本地镜像到镜像仓库docker …...

【ESP 保姆级教程】小课设篇 —— 案例:20240507_esp01s+UNO的智能浇水系统

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2024-09-30 ❤️❤️ 本篇更新记录 2023-09-30 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…...

如何设置MySQL分布式架构主键ID,为什么不能使用自增ID或者UUID做主键?

MySQL分布式架构主键ID的设置方法 雪花算法&#xff08;Snowflake&#xff09; 原理&#xff1a;雪花算法是一种生成分布式唯一ID的算法。它由64位二进制数组成&#xff0c;结构如下&#xff1a;1位符号位&#xff08;固定为0&#xff09; 41位时间戳&#xff08;表示从一个固…...

服务器虚拟化详解

服务器虚拟化详解 服务器虚拟化是一种将物理服务器资源转化为虚拟服务器资源的技术&#xff0c;它允许在一台物理服务器上运行多个虚拟服务器&#xff0c;每个虚拟服务器都拥有独立的操作系统、应用程序和资源配置。这种技术极大地提高了服务器的利用率、灵活性和可扩展性&…...

医疗陪诊APP开发实战:从互联网医院系统源码开始

本文将从互联网医院系统源码出发&#xff0c;深入探讨医疗陪诊APP的开发实战。 一、从互联网医院系统源码入手 开发医疗陪诊APP的基础在于互联网医院系统的源码。互联网医院系统通常包括以下几个模块&#xff1a; 1.用户管理&#xff1a;用户注册、登录、信息管理等功能。 …...

jenkins 构建报错ERROR: Error fetching remote repo ‘origin‘

问题描述 修改项目的仓库地址后&#xff0c;使用jenkins构建报错 Running as SYSTEM Building in workspace /var/jenkins_home/workspace/【测试】客户端/client-fonchain-main The recommended git tool is: NONE using credential 680a5841-cfa5-4d8a-bb38-977f796c26dd&g…...

初识C#(三)- 数组

我有17栋楼&#xff0c;在不同地域&#xff0c;都是不同价格租出去给不同的人~ 文章目录 前言一、数组1.1 我有17栋楼 - 数组的声明1.2 包租公&包租婆 - 数组赋值1.3 每个月都要交租的苦逼租客 - 数组的使用 二、字符串2.1 字符串的使用方法 总结 前言 本篇笔记重点描述C#…...

黑马智数Day3

渲染基础Table列表 封装接口&#xff1a; export function getCardListAPI(params) {return request({url: /parking/card/list,params}) } 具体实现&#xff1a; import { getCardListAPI } from /apis/cardexport default {data() {return {// 请求参数params: {page: 1,pa…...

【Java】再一次踩了整数溢出的坑

【Java】再一次踩了整数溢出的坑 一、起因原题示例 1示例 2提示 我的代码提交结果 二、思考修改后的代码如下 三、知识点1. int m l ((r - l) / 2)解释 2. if (m < x / m)解释 四、结尾 一、起因 我在做【力扣】69.x 的平方根 一题的时候&#xff0c;明明觉得逻辑没问题&…...

Windows开发工具使用技巧大揭秘:让编码效率翻倍的秘籍!

【ACM出版|厦大主办|EI稳定检索】第五届计算机科学与管理科技国际学术会议&#xff08;ICCSMT 2024&#xff09;_艾思科蓝_学术一站式服务平台 更多学术会议请看&#xff1a;学术会议-学术交流征稿-学术会议在线-艾思科蓝 目录 引言 1. 快捷键大全&#xff1a;加速你的编码…...

CSS外边距

元素的外边距&#xff08;margin&#xff09;是围绕在元素边框以外&#xff08;不包括边框&#xff09;的空白区域&#xff0c;这片区域不受 background 属性的影响&#xff0c;始终是透明的。 为元素设置外边距 默认情况下如果不设置外边距属性&#xff0c;HTML 元素就是不会…...

C++ set,multiset与map,multimap的基本使用

1. 序列式容器和关联式容器 string、vector、list、deque、array、forward_list等STL容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间一般没有紧密的关联关系&#xff0c;比如交换一下&#xff0c;他依旧是序列式容器。顺…...

评估潜力无限:解读自闭症患者的工作能力评估

在星贝育园这片充满爱与希望的土地上&#xff0c;我们不仅见证了无数自闭症儿童在康复训练中的点滴进步&#xff0c;更深刻理解了他们内在潜力的无限可能。自闭症&#xff0c;这一复杂的神经发育障碍&#xff0c;常常让外界对其患者的工作能力产生误解和偏见。然而&#xff0c;…...

js 实现视频封面截图

今天给大家分享一下&#xff0c;如何实现视频封面截取功能&#xff0c;这里主要用到了 HTML5 的 canvas 相关的 api 和 js 相关的一些知识&#xff0c;话不多说&#xff0c;直接上代码&#xff1a; <template><div><div class"margin-tb-sm"><…...

Hadoop FileSystem Shell 常用操作命令

提示&#xff1a;本文章只总结一下常用的哈&#xff0c;详细的命令大家可以移步官方的文档&#xff08;链接贴在下面了哈&#x1f923;&#xff09;— HDFS官方命令手册链接。 目录 1. cat 命令&#xff1a;查看 HDFS 文件内容2. put 命令&#xff1a;将本地文件上传到 HDFS3.…...

uniapp EChars图表

1. uniapp EChars图表 &#xff08;1&#xff09;Apache ECharts 一个基于 JavaScript 的开源可视化图表库   https://echarts.apache.org/examples/zh/index.html &#xff08;1&#xff09;官网图例 &#xff08;2&#xff09;个人实现图例 1.1. 下载echart 1.1.1. 下…...

最新版ingress-nginx-controller安装 使用host主机模式

最新版ingress-nginx-controller安装 使用host主机模式 文章目录 最新版ingress-nginx-controller安装 使用host主机模式单节点安装方式多节点高可用安装方式 官方参考链接&#xff1a; https://github.com/kubernetes/ingress-nginx/ https://kubernetes.github.io/ingress-ng…...

实习问题(配置文件获取参数)

Java中用SpringBoot框架&#xff0c;当我们要获取配置文件yml里的参数时&#xff0c;用Value注解获取 如果配置文件中没有srvSealUploadPath这个参数的话&#xff0c;可以用Value("${srvSealUploadPath:data/idoc/temp}")&#xff0c;这个的意思是&#xff0c;如果配…...

怎么把网站放到空间/成都最新热门事件

2019.08.29学习整理 绑定方法与非绑定方法 绑定方法 对象绑定方法 类的绑定方法 绑定方法&#xff1a;特殊之处&#xff0c;绑定给谁就是谁来调&#xff0c;并且会把自身调过来 类的绑定方法 绑定给类&#xff0c;类来调用&#xff0c;会把类自身传过来 类的绑定方法用在什么地…...

不锈钢网站建设哪家好/海外网站推广的公司

使用tomcat搭建HTTP文件下载服务器 用简单的方法实战演练搭建http服务器(Windows上) 超简单——自己搭建ftp服务器(python nodejs)...

带做骑传奇私服网站/一键建站免费

前言 上篇文章给大家分享了前10个spark的企业面试题2020年最新Spark企业级面试题【上】&#xff0c;今天后续来了&#xff0c;来分享剩下的那个几个面试题。也祝大家找到自己喜欢的工作&#xff0c;一起加油&#xff0c;编写不易 请给老哥一个一键三连吧。 一、手写Spark-Wor…...

南通网站建/品牌传播方案

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #define SIZE(a) (sizeof(a)/sizeof(a[0]))#define HBIT(a) ((a & 0x00000080) ! 0)#define LBIT(a) ((a & 0x00000001) ! 0)int TAB[] {0x10, 0x71, 0x12, 0x10, 0x10, 0x7C, 0x00, 0x00,0x00, 0x00, …...

58同城类型网站制作/seo培训学什么

2019独角兽企业重金招聘Python工程师标准>>> 在阿里云栖开发者沙龙PHP技术专场上&#xff0c;掌阅资深后端工程师、掘金小测《Redis深度历险》作者钱文品为大家介绍了RabbitMQ的延时队列和镜像队列的原理与实践&#xff0c;重点比较了RabbitMQ提供的消息可靠与不可靠…...

网站轮播效果怎么做的/东莞seo网站制作报价

函数&#xff1a;startswith()作用&#xff1a;判断字符串是否以指定字符或子字符串开头一、函数说明语法&#xff1a;string.startswith(str, beg0,endlen(string))或string[beg:end].startswith(str)参数说明&#xff1a;string&#xff1a; 被检测的字符串str&#xff1a; …...