【python】函数重构

函数重构

    • 函数重构
    • pycharm函数重构步骤
    • 函数重构练习

函数重构

函数重构是指对现有函数进行修改和优化的过程。重构的目的是改善代码的可读性、可维护性和灵活性,同时保持其功能不变。函数重构通常包括以下步骤:

  1. 理解函数的功能和目的。了解函数的作用和期望结果,确定重构的目标。

  2. 检查函数的代码质量。查看函数的代码是否清晰、简洁、可读,有无可改进之处。

  3. 提取重复的代码。如果函数中有重复的代码块,可以将其提取为单独的函数或方法,避免重复编写代码。

  4. 简化函数逻辑。如果函数的逻辑过于复杂,可以将其拆分成多个较小的函数,每个函数只负责一部分逻辑。

  5. 优化函数参数。检查函数的参数是否过多或过少,是否有不必要的参数,可以考虑重新设计参数,使函数的接口更清晰和简洁。

  6. 修改函数的命名。函数的命名应该准确地描述函数的功能和作用,可以根据函数的具体功能和语义重新命名。

  7. 添加注释和文档。为函数添加合适的注释和文档,使其他开发人员能够更容易地理解和使用函数。

  8. 运行测试用例。确保重构后的函数仍然能够正确地完成其功能,并通过运行测试用例进行验证。

通过函数重构,可以改善代码的质量和可维护性,提高开发效率和代码的可读性。同时,重构还可以帮助发现和修复代码中的潜在问题和bug。函数重构是指对现有函数进行修改和优化的过程。重构的目的是改善代码的可读性、可维护性和灵活性,同时保持其功能不变。函数重构通常包括以下步骤:

  1. 理解函数的功能和目的。了解函数的作用和期望结果,确定重构的目标。

  2. 检查函数的代码质量。查看函数的代码是否清晰、简洁、可读,有无可改进之处。

  3. 提取重复的代码。如果函数中有重复的代码块,可以将其提取为单独的函数或方法,避免重复编写代码。

  4. 简化函数逻辑。如果函数的逻辑过于复杂,可以将其拆分成多个较小的函数,每个函数只负责一部分逻辑。

  5. 优化函数参数。检查函数的参数是否过多或过少,是否有不必要的参数,可以考虑重新设计参数,使函数的接口更清晰和简洁。

  6. 修改函数的命名。函数的命名应该准确地描述函数的功能和作用,可以根据函数的具体功能和语义重新命名。

  7. 添加注释和文档。为函数添加合适的注释和文档,使其他开发人员能够更容易地理解和使用函数。

  8. 运行测试用例。确保重构后的函数仍然能够正确地完成其功能,并通过运行测试用例进行验证。

通过函数重构,可以改善代码的质量和可维护性,提高开发效率和代码的可读性。同时,重构还可以帮助发现和修复代码中的潜在问题和bug。

pycharm函数重构步骤

  1. 选择要重构的函数,在PyCharm中打开该函数所在的文件。
  2. 鼠标右键点击函数名称或者函数体,选择"Refactor",然后选择"Extract"。
  3. 在弹出的菜单中选择"Function",然后输入新的函数名称。
  4. 在弹出的对话框中,选择要提取的代码块,包括函数参数和函数体内的代码。
  5. 点击"OK"按钮,PyCharm将会自动在当前文件中创建一个新的函数,并将选中的代码块移动到新的函数中。
  6. 在原来的位置上,会生成一个函数调用语句,调用新创建的函数。
  7. 检查新创建的函数是否正确,如果需要修改参数或者函数体内的代码,可以在新创建的函数中进行修改。
  8. 如果需要修改函数调用处的参数,可以在原来的位置上修改函数调用语句。
  9. 确保重构后的代码没有错误,并且与之前的代码功能一致。
  10. 提交代码变更,完成函数重构。

函数重构练习

学生信息管理系统是一个控制台应用,它使用 Python 编写,包含以下功能:

  1. 查询所有信息:通过 select_all 函数实现,它遍历学生列表并打印每个学生的学号、姓名、年龄和分数。

  2. 新增信息:由 add_one 函数负责,提示用户输入学生的学号、姓名、年龄和分数,然后将这些信息存储在一个字典中,并检查学号是否已经存在于学生列表中,以避免重复。

  3. 修改信息update_one 函数用于根据学号修改学生的分数。如果学号存在,则更新其分数;否则,给出错误提示。

  4. 删除信息:通过 delete_one 函数,根据学号删除学生信息。如果学号不存在,给出错误提示。

  5. 退出exit_system 函数用于安全地关闭程序。

  6. 主菜单data_manager 函数作为系统的主入口点,显示菜单供用户选择,并根据用户的选择调用相应的函数。此外,它还处理了非法输入的情况。

系统使用一个名为 stu_dic 的列表来存储学生信息,其中每个学生的信息都保存在一个字典中。

# 写一个控制台版的学生信息管理系统
# 菜单的输出print
#  菜单
#  1、查询所有信息
#  2、新增信息
#  3、修改信息
#  4、删除信息
#  5、退出
# 菜单的选择input
# 当输入1时,遍历stu
# 当输入2时,输入需要新增的信息(学号、姓名、年龄、得分),将数据插入到stu
# 3时,根据id修改得分
# 4时,根据id删除该条信息
# 5,结束
# 除了5以外的任意功能操作结束后需要返回主菜单界面
# 定义一个学生信息列表,每个学生信息包括学号、姓名、年龄和分数
import sys# 初始化学生信息列表
d1 = {"id": 1, "name": "zl", "age": 20, "score": 100}
d2 = {"id": 2, "name": "jwj", "age": 21, "score": 95}
d3 = {"id": 3, "name": "zff", "age": 24, "score": 90}
stu_dic = [d1, d2, d3]# 打印所有学生信息
def select_all(stu):"""打印学生列表中的所有学生信息。参数:stu -- 学生信息列表。"""print("学号\t姓名\t年龄\t分数")for i in stu:for j in i.values():print(j, end="\t")print()# 根据姓名查询并打印学生信息
def select_one(stu):"""根据输入的姓名查询并打印学生信息。参数:stu -- 学生信息列表。"""temp_name = input("请输入要查询的学生姓名:")for i in stu:if i["name"] == temp_name:print("学号\t姓名\t年龄\t分数")for j in i.values():print(j, end="\t")print()breakelse:print("查无此人")# 添加学生信息
def add_one(stu):"""添加学生信息到列表中。参数:stu -- 学生信息列表。"""while True:print("请输入学号、姓名、年龄、分数")# 输入并构建一个新的学生信息temp_id = input("学号:")temp_name = input("姓名:")temp_age = input("年龄:")temp_score = input("分数:")if temp_id.isdigit() and temp_age.isdigit() and temp_score.isdigit():temp_info = {"id": int(temp_id),"name": temp_name,"age": int(temp_age),"score": int(temp_score),}if temp_info["id"] in [i["id"] for i in stu]:print("学号已存在,请重新输入")breakelse:# 将新学生信息添加到学生信息列表中stu.append(temp_info)else:print("输入错误,请重新输入")# 询问用户是否继续添加continue_check = input("是否继续添加?y/n:")# 如果用户不打算继续添加,则退出循环if continue_check == "n":break# 修改学生信息
def update_one(stu):"""根据输入的学号修改学生信息中的分数。参数:stu -- 学生信息列表。"""# 修改学生分数temp_id = input("请输入要修改的学号:")temp_score = input("请输入修改后的分数:")if temp_id.isdigit() and temp_score.isdigit():temp_id = int(temp_id)temp_score = int(temp_score)for i in stu:if i["id"] == temp_id:# 找到对应学号的学生,修改其分数i["score"] = temp_scoreprint("修改成功")breakelse:print("学号不存在")else:print("输入错误,请重新输入")# 删除学生信息
def delete_one(stu):"""根据输入的学号删除学生信息。参数:stu -- 学生信息列表。"""# 删除学生信息temp_id = input("请输入要删除的学号:")if temp_id.isdigit():temp_id = int(temp_id)for i in stu:if i["id"] == temp_id:# 找到对应学号的学生,从列表中删除stu.remove(i)print("删除成功")breakelse:print("学号不存在")else:print("输入错误,请重新输入")# 退出系统
def exit_system():"""退出学生信息管理系统。"""print("退出系统成功")sys.exit()# 主菜单函数,提供学生信息管理的各种选项
def data_manager(stu):"""学生信息管理系统的主菜单函数。参数:stu -- 学生信息列表。"""while True:print("""#  菜单
#  1、查询信息
#  2、新增信息
#  3、修改分数
#  4、删除信息
#  5、退出系统""")# 获取用户的选择number = int(input("请输入序号:"))# 根据用户的选择执行不同的操作if number == 1:# 查询所有学生信息print("""1. 查询所有学生信息2. 查询单个学生信息
""")select_number = input("请输入序号:")if select_number.isdigit():select_number = int(select_number)if select_number == 1:select_all(stu)elif select_number == 2:select_one(stu)else:print("输入错误,请重新输入")else:print("输入错误,请重新输入")elif number == 2:add_one(stu)elif number == 3:update_one(stu)elif number == 4:delete_one(stu)elif number == 5:# 退出系统exit_system()else:# 如果用户输入了无效的选项print("输入错误,请重新输入")# 启动学生信息管理系统主菜单
data_manager(stu_dic)

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

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

相关文章

OSPF.综合实验

1、首先将各个网段基于172.16.0.0 16 进行划分 1.1、划分为4个大区域 172.16.0.0 18 172.16.64.0 18 172.16.128.0 18 172.16.192.0 18 四个网段 划分R4 划分area2 划分area3 划分area1 2、进行IP配置 如图使用配置指令进行配置 ip address x.x.x.x /x 并且将缺省路由…

Sortable.js板块拖拽示例

图例 代码在图片后面 点赞❤️关注&#x1f64f;收藏⭐️ 页面加载后显示 拖拽效果 源代码 由于js库使用外链&#xff0c;所以会加载一会儿 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&qu…

【Go系列】 Go的错误处理

承上启下 上一篇文章中介绍了struct和interface&#xff0c;在Go语言中&#xff0c;是没有Class这个概念的&#xff0c;我们可以通过Struct和方法的组合&#xff0c;来实现Class。我们通过Struct嵌套来实现继承这样的一种机制&#xff0c;并且不用设置虚函数这样的特殊说明。同…

如何防止第三方DLL注入自己的进程?

PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY 结构 struct _PROCESS_MITIGATION_BINARY_SIGNATURE_POLICY {union {DWORD Flags;struct {DWORD MicrosoftSignedOnly : 1;DWORD StoreSignedOnly : 1;DWORD MitigationOptIn : 1;DWORD AuditMicrosoftSignedOnly : 1;DWORD Audit…

C语言 ——— 实用调试技巧(Visual Studio)

目录 Debug 和 Release 的区别 F10 --- 逐过程调试 & F11 --- 逐语句调试 F9 --- 新建/切换断点 & F5 --- 开始调试 shift F5 & ctrl F5 Debug 和 Release 的区别 Debug&#xff1a;通常为调试版本&#xff0c;它包含调试信息&#xff0c;并且不作任何优化…

一 GD32 MCU 开发环境搭建

GD32 系列为通用型 MCU &#xff0c;所以开发环境也可以使用通用型的 IDE &#xff0c;目前使用较多的是 KEIL、 IAR 、 GCC 和 Embedded Builder &#xff0c;客户可以根据个人喜好来选择相应的开发环境。 目录 1、使用 Keil 开发 GD32 目前市面通用的MDK for ARM版本有Kei…

华为OD机试真题2024版-路口最短时间问题

题目描述 假定街道是棋盘型的&#xff0c;每格距离相等&#xff0c;车辆通过每格街道需要时间均为 timePerRoad&#xff1b; 街道的街口&#xff08;交叉点&#xff09;有交通灯&#xff0c;灯的周期 T(lights[row][col]) 各不相同&#xff1b; 车辆可直行、左转和右转&…

企业网三层架构

企业网三层架构&#xff1a;是一种层次化模型设计&#xff0c;旨在将复杂的网络设计分成三个层次&#xff0c;每个层次都着重于某些特定的功能&#xff0c;以提高效率和稳定性。 企业网三层架构层次&#xff1a; 接入层&#xff1a;使终端设备接入到网络中来&#xff0c;提供…

Python爬虫教程第二篇:进阶技巧与实战案例

Python爬虫教程第二篇&#xff1a;进阶技巧与实战案例 在上一篇教程中&#xff0c;我们学习了Python爬虫的基础概念、基本流程以及一个简单的入门实践案例。本篇教程将带领大家进一步探索Python爬虫的进阶技巧&#xff0c;并提供一个实战案例&#xff0c;帮助大家提升爬虫技能…

Android12 MultiMedia框架之GenericSource extractor

前面两节学习到了各种Source的创建和extractor service的启动&#xff0c;本节将以本地播放为例记录下GenericSource是如何创建一个extractor的。extractor是在PrepareAsync()方法中被创建出来的&#xff0c;为了不过多赘述&#xff0c;我们直接从GenericSource的onPrepareAsyn…

Mojolicious命令行工具:自动化Web开发的瑞士军刀

Mojolicious是一个高性能的、基于Perl的Web开发框架&#xff0c;它提供了一整套工具来简化Web开发流程。其中&#xff0c;Mojolicious的命令行工具集是其强大功能的一部分&#xff0c;允许开发者快速生成项目模板、运行开发服务器、执行各种开发任务等。本文将详细介绍Mojolici…

qt 自定义信号号槽 简单举例

在Qt中&#xff0c;自定义信号和槽是一种非常灵活的方式来处理对象之间的通信。以下是一个简单的例子&#xff0c;展示了如何定义和使用自定义的信号和槽。 首先&#xff0c;我们定义一个名为MyClass的类&#xff0c;该类继承自QObject&#xff0c;并声明一个自定义信号和一个…

13_Shell系统函数

13_Shell系统函数和自定义函数 一、系统函数 basename 获取文件名 #!/bin/bash#basename 相对路径文件名 basename ./1.sh#basename 绝对路径文件名 basename /tmp/1.sh#basename 去除文件后缀名 basename /tmp/1.sh .shdirname 获取文件所在目录名 #!/bin/bash#dirname 相对路…

Redis持久化RDB,AOF

目 录 CONFIG动态修改配置 慢查询 持久化 在上一篇主要对redis的了解入门&#xff0c;安装&#xff0c;以及基础配置&#xff0c;多实例的实现&#xff1a;redis的安装看我上一篇&#xff1a; Redis安装部署与使用,多实例 redis是挡在MySQL前面的&#xff0c;运行在内存…

Week 6-杨帆-学习总结

- 46 语义分割和数据集 语义分割概念 语义分割是一种计算机视觉任务&#xff0c;其目标是将图像分割成属于不同语义类别的区域。与目标检测不同&#xff0c;语义分割关注的是像素级别的标注和预测&#xff0c;能够识别并理解图像中每一个像素的内容。这使得语义分割在理解图像…

产品经理-研发流程-敏捷开发-迭代-需求评审及产品规划(15)

敏捷开发是以用户的需求进化为核心&#xff0c;采用迭代、循序渐进的方法进行软件开发。 通俗来说&#xff0c;敏捷开发是一个软件开发流程&#xff0c;是一个采用了迭代方法的开发流程 简单来说&#xff0c;迭代就是把一个大产品拆分出一些最小的实现单位。完成不同的迭代就最…

机器学习筑基篇,Jupyter Notebook 精简指南

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 0x00 Jupyter Notebook 简明指南 描述&#xff1a;前面我们已经在机器学习工作站&#xff08;Ubuntu 24.04 Desktop Geforce RTX 4070Ti SUPER&#xff09;中安装 Anaconda 工具包&#xff0c;其…

老物件线上3D回忆展拓宽了艺术作品的展示空间和时间-深圳华锐视点

在数字技术的浪潮下&#xff0c;3D线上画展为艺术家们开启了一个全新的展示与销售平台。这一创新形式不仅拓宽了艺术作品的展示空间&#xff0c;还为广大观众带来了前所未有的观赏体验。 3D线上画展制作以其独特的互动性&#xff0c;让艺术不再是单一的视觉享受。在这里&#x…

数据处理-Matplotlib 绘图展示

文章目录 1. Matplotlib 简介2. 安装3. Matplotlib Pyplot4. 绘制图表1. 折线图2. 散点图3. 柱状图4. 饼图5. 直方图 5. 中文显示 1. Matplotlib 简介 Matplotlib 是 Python 的绘图库&#xff0c;它能让使用者很轻松地将数据图形化&#xff0c;并且提供多样化的输出格式。 Ma…

如何定义版本号--语义化版本

前言 版本号(version number)是版本的标识号。每一个操作系统&#xff08;或广义的讲&#xff0c;每一个软件&#xff09;都有一个版本号。版本号能使用户了解所使用的操作系统是否为最新的版本以及它所提供的功能与设施。 例如在Python项目依赖中会看到 requires-python &q…