【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.pswp.cn/web/44945.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44945.shtml
英文地址,請注明出處:http://en.pswp.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…