Python中的函數

一、函數參數與返回值基礎知識

1、不要使用可變類型(list等)作為參數默認值,用None來代替。

參數默認值只會在函數定義階段被創建一次,之后無論創建多少次,函數內拿到的默認值都是同一個對象,為規避這個問題,一般會用None來代替可變默認類型對象。

2、使用標記對象,可以嚴格區分函數調用時是否提供了某個參數。

所謂標記對象,是專門定義一個獨一無二的變量類型,當用戶調用函數確實沒有傳遞某個參數時、默認值會變成這個標記對象,那么我們就可以知道服務到底有沒有傳這個變量了、而不是僅僅通過None來判斷。

3、定義僅限關鍵字參數,可以強制要求調用方提供參數名,提升可讀性。
4、函數應當擁有穩定的返回類型,不要返回多種類型。
5、適合返回None的情況——操作類函數、查詢類型函數中表示意料之外的缺失值
6、在執行失敗時,相比返回None,直接拋出異常更合適。
7、如果提前返回結果可以提升可讀性,就提前返回,不要去追求所謂的“單一出口”。

二、代碼可維護性技巧

1、不要編寫太長的函數,雖然長度沒有強制標準,但65行是一個危險的信號。
2、圈復雜度是評估函數復雜程度的常用指標,一般超過10的函數都需要重構。
3、抽象與分層思想可以幫助我們更好地構建與管理復雜的系統。
4、同一個函數內的代碼應該處于同一抽象級別

簡單來說,按照職能、數據流、業務流進行分級分類,逐一遞進,然后做模塊和函數的抽象與劃分,不要一股腦都寫在一起。
比方說通過頁面查詢后端數據,就可以分解成接口View層、請求處理與參數校驗層,以及數據查詢抽象Data層。

三、函數與狀態

1、沒有副作用的無狀態純函數比較易于理解、維護,但大多數時候“狀態”不可避免。
2、避免使用全局變量給函數增加狀態。
3、當函數狀態較為簡單時,可以使用閉包技巧

所謂閉包技巧,就是在函數內再定義一個函數,而后使用nonlocal來對外層函數的狀態記錄變量進行更新,舉例:

def counter():value = 0def _counter():# nonlocal 用來標注變量來自上層作用域,如果不標明,內層函數將無法直接的修改外層函數變量nonlocal valuevalue += 1return valuereturn _counter> c = counter()
> c()
1
> c()
2
> c2 = counter()
> c2()
1

4、當函數需要較為復雜的狀態管理時,建議定義類來管理狀態。

四、語言機制對函數的影響

1、functools.partial()可以用來快速構建偏函數。
2、functools.lru_cache()可以用來給函數添加緩存。
3、比起mapfilter,列表推導式的可讀性更強。
4、lambda函數知識一種語法糖,可以使用operator模塊等方式來替代它。
5、Python語言里的遞歸限制較多,可以的話,請盡量使用循環來替代。

參考內容:《Python工匠——案例、技巧與工程實踐》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164913.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164913.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164913.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue 2.0源碼分析-數據驅動

Vue.js 一個核心思想是數據驅動。所謂數據驅動,是指視圖是由數據驅動生成的,我們對視圖的修改,不會直接操作 DOM,而是通過修改數據。它相比我們傳統的前端開發,如使用 jQuery 等前端庫直接修改 DOM,大大簡化…

【python學習】基礎篇-常用模塊-collections模塊:數據結構,如列表、元組、字典和集合等

Python中的collections模塊提供了一些有用的數據結構,如列表、元組、字典和集合等。 以下是collections模塊中一些常用數據結構的用法: Counter類 Counter類是一個字典子類,用于計數可哈希對象。 它可以接受一個可迭代對象作為參數&#xff…

Atlassian Confluence 路徑遍歷和命令執行漏洞 (CVE-2019-3396)

漏洞描述 Confluence 是由澳大利亞軟件公司 Atlassian 開發的基于 Web 的企業 wiki。 Atlassian Confluence 6.14.2 版本之前存在一個未經授權的目錄遍歷漏洞,攻擊者可以使用 Velocity 模板注入讀取任意文件或執行任意命令。 漏洞環境及漏洞利用 啟動docker環境…

快來考試拿證書!KubeSphere 個人技能專業考試認證上線啦!

以容器技術和容器編排為基礎的云原生應用,被越來越多的企業用戶接受和使用,并且在生產環境中使用容器技術的比例逐年增加。Kubernetes 無疑已經成為容器編排的事實基礎,而依托于 Kubernetes 開發的開源容器平臺 KubeSphere 也收獲了一眾擁躉。…

vue3使用provider+ inject直接將參數由祖宗傳送給孫子

如題。在vue項目中,如果祖宗想將參數傳遞給孫子甚至更小一輩的組件,是一件麻煩事。可以通過爺爺-兒子-孫子-曾孫這樣的鏈條,一輩輩地傳承下去,但未免太繁瑣、太蠢了些;也可以通過store間接傳送,但如何觸發孫…

9-什么是迭代器,生成器,裝飾器、django的信號用過嗎?如何用,干過什么、什么是深拷貝,什么是淺拷貝,如何使用、slice操作符和list構造函數

1 什么是迭代器,生成器,裝飾器 2 django的信號用過嗎?如何用,干過什么 3 什么是深拷貝,什么是淺拷貝,如何使用 3.1 淺拷貝 3.2 深拷貝 3.3 擴展(slice操作符和list構造函數) 1 什么是迭代器,生成…

14 redis全量復制與部分復制

1、設置主服務器的地址和端口 首先是在從服務器設置需要同步的主服務器信息,包括機器IP, 端口。 主從復制的開啟,完全是在從節點發起的。不需要我們在主節點做任何事情。 從節點開啟主從復制,有3種方式 配置文件:在從服務器的配…

【神印王座】龍皓晨美妝勝過月夜,魔神皇識破無視,撮合月夜阿寶

Hello,小伙伴們,我是拾荒君。 《神印王座》國漫第82集已更新,拾荒君和大多數人一樣,更新就去看了。魔神皇楓秀,威嚴凜然,突然空降月魔宮,整個宮殿都在這股無與倫比的強大氣息中顫栗。為了順利躲避魔神皇的…

稻谷飄香金融助力——建行江門市分行助力鄉村振興

7月的臺山,稻谷飄香。在大耕戶李勝業的農田里,金燦燦的稻谷翻起層層稻浪,收割機在稻浪里來回穿梭,割稻、脫粒、裝車等工序一氣呵成。空氣中彌漫著豐收的喜悅。 夏糧迎豐收的背后,是中國建設銀行江門市分行&#xff08…

遠端WWW服務支持TRACE請求

安全掃描的時候,掃出來的問題,這里不分享如何處理,就只分享下,如何找到有問題的端口。 通過命令 curl -v -X TRACE -I ip:port,這里的ip和端口就是掃描出有問題的服務器地址ip以及開放的服務端口。 觀察返回值&#x…

Python基礎:生成器(Generators)和生成器表達式(Generator Expressions)詳解

生成器(Generators)和 生成器表達式(Generator Expressions)是 Python 中用于處理迭代器和序列數據的強大工具。它們允許你按需生成值,而不是一次性生成所有值,從而節省內存和提高性能。 1. 生成器&#x…

深度強化學習筆記與無線通信應用案例

這里寫自定義目錄標題 參考資料比較和分類基礎知識16.3 有模型學習16.3.1 策略評估遞歸形式:Bellman 等式 16.3.2 策略改進16.3.3 策略迭代16.3.3 值迭代 16.4 免模型學習on-policy off-policy16.4.1 蒙特卡羅強化學習16.4.2 時序差分學習Sarsa算法:同策…

睡前隨筆記錄

一個人從出生到長大,就像一部手機從新用到舊。手機里面積累了太多的緩存,積累了太多的照片,各種app的數據,安裝了各式各樣的程序。 所以大概這就是年紀越大,記性越差的原因嗎?就像一個屋子,堆滿…

TableStructureRec: 表格結構識別推理庫來了

目錄 引言lineless_table_rec: 無線表格識別庫安裝使用結果 wired_table_rec:有線表格識別庫安裝使用結果 寫在最后 引言 TableStructureRec 倉庫是用來對文檔中表格做結構化識別的推理庫,包括來自 PaddleOCR 的表格結構識別算法模型、來自阿里讀光有線…

新版Testwell CTC++代碼覆蓋率測試工具帶來哪些新變化?

代碼覆蓋率測試工具Testwell CTC在版本10中引入了新的工具ctcreport來直接從符號和數據文件生成HTML報告。詳細的特性描述可以在測試井CTC幫助中找到。在本文檔中,描述了與前一代報告相比的改進和變化。 Adaptable Layout可調整布局 您可以選擇一個適合于項目結構的…

scanf的返回值

總所周知,scanf是C提供的庫函數的內容,而絕大多數定義的函數都會有一個返回值。 那么scanf的返回值是什么呢? 查了CPP的解釋后,返回值就是返回的是scanf讀取的數據的個數。 這個概念可能比較抽象。先看如下示例: 我們…

QT QJsonObject 插入 QByteArray十六進制數據

場景描述 有一組十六進制數使用QByteArray進行存儲;需要將其插入QJsonObject,然后通過網絡發送出去;接收到后,再轉換回QByteArray; 操作代碼 1. QByteArray轉換QString插入QJsonObject QString str ""; …

io500 壓測

目的 編譯環境 centos 7.9安裝包 yum groupinstall Development\ Tools yum install -y libevent-devel hwloc-devel libcephfs-devel.x86_64 編譯 open mpi 下載地址 https://www.open-mpi.org/software/ompi/v5.0/編譯 rpmbuild --rebuild openmpi-4.1.6-1.src.rpm安裝…

Leetcode 155. 最小棧

class MinStack {//用一個輔助棧存儲對應棧元素為棧頂時的最小值//當原棧插入一個元素時&#xff0c;輔助棧插入此值與當前輔助棧棧頂的值&#xff08;即插入前的最小值&#xff09;的較小值Stack<Integer> sta1;Stack<Integer> sta2;public MinStack() {sta1 new…

Redis(哨兵模式)

哨兵模式的定義&#xff1a; 是Redis的一種高可用解決方案&#xff0c;通過運行多個Redis實例來監控主從Redis實例的狀態&#xff0c;當主實例出現故障時&#xff0c;哨兵會自動選舉一個從實例作為新的主實例&#xff0c;從而保證系統的高可用性。哨兵模式可以監控多個主從Red…