Python程序设计

news2024/9/27 5:46:00

        很多刚接触Python的同学会觉得Python就和shell语言一样,是一门脚本语言,并不需要设计,只需要关注要实现的功能。确实一门计算机语言的诞生就是为了去更好的解决当前的痛点,功能实现肯定是第一位的。但是如何在功能实现的前提下,更好的去保证软件的质量,可维护性,健壮性,这就需要开发者去学习语言的精髓,将精髓注入到程序中,这就是设计。

        本文不会过多去介绍Python具体实现的技术细节,而是在整体上去总结如何写好一个Python程序,如何让你的Python程序让后面接手的同学不会说这是一个屎山。

目录

一:命名设计

二:函数设计

三:数据结构设计

四:程序框架设计

五:文件结构设计


一:命名设计

        名字需要设计,好的命名会让你的代码可读性和可维护性直接上一个台阶,让读的人赏心悦目。之前看过一个大牛对于命名的重视,说对于程序中变量函数的命名,要像给自己的baby取名一样去重视,虽然有点夸张,但是足以看出命名规范的重要性。

        下面总结一下Python命名的原则,有的条目对于其他语言也适用:

1,有意义简洁的命名

        对于变量的命名要一眼看上去能直接知道变量的作用,对于函数的命名要清楚的知道其要实现的功能,对于类的命名要大概让读者知道该类实现的功能模块。

2,避免使用缩写

        只有在很特殊的情况下,才可以使用缩写来命名变量,不要怕名字长。因为缩写会导致代码可读性的降低,尤其是对不熟悉缩写的人而言,会让人去猜作者的意图,这样的代码读起来确实很崩溃。

3,避免使用Python的关键字

        一些Python保留字在编程过程中被Python所使用,所以不能用来命名变量。例如,一个变量的名称不能是print或者import

4,变量和函数的命名要有区分

        当一个变量名称和函数名称很相似时,就引起了歧义。为了避免这种情况的发生,应该给变量命名加上一些不同的前缀或者后缀。比如我个人的习惯,对于变量的命名后缀会加上该变量的类型,字典,如studentDict,列表,如studentList。对于函数的命名看上去更像是一个描述句,如获取学生的名字,getStudentName()

5,命名的形式

        比较常见的形式有两种,一是下划线的形式,二是驼峰式。下划线很好理解就是用下划线来连接各个段的命名,驼峰式是单词的首字母大写,整个命名中间没有下划线。

        我个人比较喜欢用驼峰式,这样看上去整个程序更加的紧凑。不管是下划线还是驼峰式,原则是整个程序用一种统一的风格,不要一会用下划线,一会用驼峰式

二:函数设计

        好的Python程序一定是有函数的设计在里面的,好多同学刚接触Python是用Python来写写脚本,实现一些简单的脚本功能,可能整个脚本加起来不过是几行或者几十行。但是如果要用Python实现了大点的功能,就一定要有函数的设计。

        函数的设计也是有规范的,不是说我def一个函数,我的程序就有函数了,我就见过一个Python函数800行,看到最后都记不起来前面实现了啥。好的函数设计会让人赏心悦目

        为什么要有函数的设计:

1. 函数是可重用的代码块,可以在程序的不同部分多次使用。

2. 函数可以接受任意数量的输入参数,并返回任意数量的输出结果。

3. 函数可以嵌套在其他函数中,从而实现更复杂的功能。

        函数的设计应该遵循以下原则

1. 函数应该尽可能简单明了,只完成一个特定的任务。

2. 函数应该有一个清晰的名称,能够描述函数的功能。

3. 函数的输入和输出应该尽可能清晰明了,以便于其他程序员理解和使用。

4. 函数应该避免使用全局变量,而是使用局部变量。

5. 函数应该避免使用副作用,即修改参数或全局变量的值。

三:数据结构设计

        接触编程的同学想必都知道下面的公式:

        数据是程序的中心。数据结构和算法两个概念间的逻辑关系贯穿了整个程序世界,首先二者表现为不可分割的关系。没有数据间的有机关系,程序根本无法设计。数据结构是底层,算法高层。数据结构为算法提供服务。算法围绕数据结构操作。

        数据结构是编程中的基础,不同的数据结构适用于不同的场景,选择合适的数据结构可以提高程序的效率和可读性。可以这么说一般的功能,设计好了数据结构,算法就是顺势而为了。

        Python常见的数据结构包括列表(List)、元组(Tuple)、字典(Dictionary)和集合(Set),我们要擅于利用这四种数据结构,灵活组合使用可以大大提高程序的效率同时降低实现的难度。

        下面我们通过形象的描述来展示他们的用途和特点,了解它们的基本操作和复杂度分析可以帮助我们更好地应用它们来处理数据

1,列表(List)就像我们的购物清单,可以记录我们要买的多种物品。我们可以随时增加或删除其中的物品,也可以根据需要对它们进行排序。

2,元组(Tuple)就像我们的收据,一旦生成就不可更改,用于存储一组固定的数据,例如一个订单的订单号和价格。

3,字典(Dictionary)就像我们的地址簿,可以通过一个关键字(例如姓名)来查找对应的值(例如电话号码)。字典可以随时添加或删除条目,也可以根据需要进行排序。

4,集合(Set)就像我们的珍藏品,可以存储多个独立的元素,但每个元素只能在集合中出现一次。集合支持常见的集合操作,例如并集、交集和差集

        Python常见的数据结构可以分为以下几类:

1,序列型数据结构:这类数据结构是有序的元素集合,可以通过索引访问。主要包括列表(List)、元组(Tuple)和字符串(String)

2,映射型数据结构:这类数据结构是基于键值对(key-value)的映射关系。主要有字典(Dict)。

3,集合型数据结构:这类数据结构中的元素是无序且不重复的。主要有集合(Set)。

4,数值型数据结构:这类数据结构用于存储相同类型的数值数据,更加节省空间。主要有数组(Array)。

        在进行大规模数据操作时,需要注意时间复杂度,选择合适的数据结构和算法以提高效率。

四:程序框架设计

        好的程序不仅要考虑功能的实现,也要考虑功能的可扩展性和可复用性。当需求变更的时候,整个程序能以最小的改动来实现新的需求或者需求的变更。这就需要程序刚开始的时候得设计出好的框架。

        好的框架具备以下的特点:

1,类的设计:类的基本作用是封装代码,我们知道python是一个面向对象的计算机编程语言,面向对象的特点就是程序内的一切皆是对象,而面向对象也有着继承、封装、多态这三大特性。类能够实现面向对象三大特性,例如封装实际上就是将多个方法或者是属性放在一个私有类之中,而这个私有类不会被其他对象所访问。继承指的就是一个类去继承另一个类的所有方法和属性,这样它就能够使用两个类的对象了。多态就是类中的方法是可以被重写的,子类将父类已经创建好的方法使用不同的参数和数据类型进行再构造就是多态。

2,类的功能单一:在大型程序中就是以类为单元,如果类的规模过大,功能不单一,在需求变更或者新的需求,想复用代码就比较困难,如果随着功能的实现或者需求的增加,类的功能不再单一的时候,得及时去拆分类,提取公共的类,保持类的功能单一,控制类的规模

3,尽量避免使用全局变量:全局变量的出现会让程序的移植性变差,全局变量使用不当也会影响程序的健壮性。

4,程序主入口尽量简洁:整个程序的入口要尽量简洁,最好整个程序的实现流程能在主入口就能体现,这会让读代码的人更加容易理解程序的流程。不要把过多具体的实现放在主入口里,影响代码的可读性。

5,设计好的数据结构:我们拿到需求的那一刻,不要急于编码,要充分理解需求,将需求转化成具体的模型,根据模型去设计功能实现所需要的数据结构。好的数据结构,能大大简化我们的功能代码,降低功能实现的难度。

五:文件结构设计

        在实现一个复杂程序时,需要编写的代码量往往很庞大。将所有的代码都放在一个文件里,显然很不合适。这时就需要将代码分割成多个文件,每个文件中放置功能相对独立的代码。在使用时,同时将多个文件中的代码导入到当前代码文件中,以实现完整的功能。这种被裁分后的仍具有独立功能的代码文件就是模块(Module)。概括地说,模块是一个支持导入功能的,以 .py 结尾的代码文件。

        当模块足够庞大时,维护起来不太方便。这就需要使用包(Package)。包可以把多个模块(.py文件)放在同一个文件夹中,以便归类与管理。概括地说,包就是放置模块的文件夹。

下面展示一个Python包的样例:

1,Python程序由包(package)、模块(module)和函数组成。包是由一系列模块组成的集合。模块是处理某一类问题的函数和类的集合

2,包就是一个完成特定任务的工具箱

3,包必须含有一个__init__.py文件,它用于标识当前文件夹是一个包

4,python的程序是由一个个模块组成的。模块把一组相关的函数或代码组织到一个文件中,一个文件即是一个模块。模块由代码、函数和类组成。导入模块使用import语句

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

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

相关文章

【人工智能】您必须了解的最佳聊天机器人框架

在本博客中,我们将讨论 7 大聊天机器人开发框架。 聊天机器人现在已成为许多企业不可或缺的一部分。他们利用聊天机器人提供客户支持服务。聊天机器人增强了人工代理以提供客户服务支持。企业每天都会收到大量查询。手动回答这些问题不仅耗时,而且还会增…

数据结构--由遍历序列构造二叉树

数据结构–由遍历序列构造二叉树 不同二叉树的中序遍历序列 中序遍历:中序遍历 左 \color{red}左 左子树、 根 \color{purple}根 根结点、中序遍历 右 \color{green}右 右子树 中序遍历序列:BDCAE 结论 : 一个中序遍历序列可能对应多种二叉树形态 \color{green}结论:一个中序…

4.4 x64dbg 绕过反调试保护机制

在Windows平台下,应用程序为了保护自己不被调试器调试会通过各种方法限制进程调试自身,通常此类反调试技术会限制我们对其进行软件逆向与漏洞分析,下面是一些常见的反调试保护方法: IsDebuggerPresent:检查当前程序是…

OpenCV 入门教程:图像读取和显示

OpenCV 入门教程:图像读取和显示 导语一、图像读取1.1、导入 OpenCV 库1.2、读取图像文件1.3、图像读取的返回值 二、图像显示2.1、创建窗口2.2、图像显示2.3、等待按键2.4、关闭窗口 三、示例应用总结 导语 在计算机视觉和图像处理领域,读取和显示图像…

非局部均值滤波(磨皮)

note 根据掩膜区域与其他区域的相似程度来赋予掩膜区域像素权重 相似程度由均方差来衡量 code /*\brief 矩阵求邻和\param type1,列方向;type2,行方向 */ static void MyCumSum(Mat& src, Mat& res, int type) {if ((src.channel…

关于impacket套件中的atexec.py在使用的时候报error: unrecognized arguments: 的解决方案

定位到库文件C:\Users\LC\AppData\Local\Programs\Python\Python311\Lib\argparse.py 加一个return args就行了 用完记得改回来,不然会影响其他脚本的功能

算法分析和设计选择和判断

算法分析和设计选择和判断 目录 平时测试 1.算法概述 1.1渐进符号的概念 1.2求时间复杂度 1.3比较时间复杂度 1.4时间复杂度定义 1.5算法的有效性 1.6算法的性质 1.7顺序搜索法 1.8渐进算法分析 2.递归和分治策略 2.1归并排序 2.2归并的空间复杂度 2.3插入排序 2.4递归 2.5归并…

Docker容器与HSM整合的好处

Docker透过容器使创建、部署和运行应用程式变得更加容易。容器允许开发人员可以将一个应用程式与它所需要的所有部分封包,然后将应用程式及其组件作为一个单一的套装软体。 Docker面临的挑战 : ● 遭受特权用户滥用的风险 Docker环境或容器内的权限配置不当可能会导…

Redis常见数据结构

文章目录 前言一、Redis通用命令二、String类型三、Key的层级结构四、Hash类型五、List类型六、Set类型七、SortedSet类型 前言 Redis是一个key-value的数据库,key一般是String类型,但是value的类型多种多样 在学习Redis不同数据类型时,我们…

ChatGPT付费创作系统V2.1.0独立版 +WEB端+ H5端 + 小程序端+文心一言

ChatGPT付费创作系统V2.1.0提供最新的对应版本小程序端,上一版本增加了PC端绘画功能,绘画功能采用其他绘画接口-意间AI,本版新增了百度文心一言接口。后台一些小细节的优化及一些小BUG的处理,前端进行了些小细节优化,针…

C#学习之路-类型转换

类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。 C# 中的类型转换可以分为两种:隐式转换和显式转换。 隐式类型转换 隐式转换是指将一个较小范围的数据类型转换为较大范围的数据类型时,编译器会自动完成类型转换…

chatgpt生成pygame opengl实现旋转用图片填充的3d三角形

import pygame from pygame.locals import * from OpenGL.GL import * from OpenGL.GLU import *def draw_triangle():vertices ((0, 2, 0), # 顶点1(-2, -2, 0), # 顶点2(2, -2, 0) # 顶点3)tex_coords ((1, 2), # 顶点1的纹理坐标(1, 1), # 顶点2的纹理坐标(2, …

如何使用SU插件一键生成通道图

如何使用SU插件一键生成通道图 通道图有什么作用? 以材质ID为例,最大的作用就是在PS通过选择材质ID图上的颜色,将颜色区域转化为蒙版,进而可以调节颜色区域所对应的效果图区域,原理类似于PS自带的通道:而A…

css 3D Demo

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> <style> body{ /* 该属性必须在父或大于父的级别上添加,保证其子,孙等盒子可以以3D视角…

langchain调用chatGLM2纪实

一、科学上网要注意&#xff1a; 域名全代和全局代理&#xff08;网卡&#xff09;&#xff0c;都要打开。这样conda install特别快。 二、安装langchain 1、 conda install langchain 2、 conda install openai 注意&#xff1a; 使用pip install和conda install 是不同…

mysql如何运行 mysql 基本命令

一、 mysql如何运行 1. 成功安装mysql 点击进入–》如何安装 2. 确保mysql服务启动&#xff1a; 按下win&#xff0c;输入服务&#xff0c;然后找到mysql&#xff0c;启动服务&#xff1a; 3. 配置环境变量&#xff08;可跳过&#xff09; 点击进入–》如何配置环境变量…

SpringBoot项目出现Failed to configure a DataSource错误时解决方法

若在运行SpringBoot项目时&#xff0c;出现如下错误&#xff1a; Description:Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine a suitable driver classAction:Consider the…

1.前言和介绍

目录 前言1. 说在前面2. 介绍3. 拓展&#xff1a;vscode3.1 文件传输3.2 高效调试配置3.2.1 配置launch.json3.2.2 配置task.json3.2.3 配置settings.json3.2.4 配置c_cpp_properties.json 前言 从零学习算法部署-TensorRT篇 杜老师推出的 tensorRT从零起步高性能部署 课程&…

7、添加billboard小旗子

本节演示添加billboard小旗子&#xff0c;使用第四节click的例子&#xff0c;通过鼠标点击地图添加billboard添加小旗子。 1、修改鼠标点击事件mouseUp&#xff0c;在函数中创建BillboardCollection对象并添加到地图中。鼠标点击时获取鼠标位置&#xff0c;转换成经纬度然后添…

Mycat【Mycat分片技术(水平拆分-分表、ER表、全局表)】(五)-全面详解(学习总结---从入门到深化)

目录 Mycat分片技术_水平拆分-分表 Mycat分片技术_ER表 Mycat分片技术_全局表 Mycat分片技术_水平拆分-分表 前言 上面谈到垂直切分只是把表按模块划分到不同数据库&#xff0c;但没有解决单表大数据量的问题。 水平拆分 相对于垂直拆分&#xff0c;水平拆分不是将表做分…