摘要:默認參數設置默認參數時,有幾點要注意一是必選參數在前,默認參數在后,否則的解釋器會報錯二是如何設置默認參數。注意此處,獲得的其實是的拷貝,函數內對的改變不會影響到。使用遞歸函數需要注意防止棧溢出。
總是在最前面的叨逼叨
最近總是在想“成長”這兩個很常常被提起的事情,這對于一個已經25歲的半中年而言,已經是一個不太能高頻提起的詞。
但是,最近一些事情吧,總讓我覺得我的生長期似乎比正常人來的晚了些,一些屬于青春期的標志,比如叛逆,比如和家長吵架等等最近才發生在我的身上。
而在這些所謂的斗爭中,其實最核心不過是,我在被迫成長。溫室里躲久了,似乎也會害怕外面的風吹雨打,但是如果這把年紀了還不走,這輩子是否就這樣安穩不起波瀾的一輩子呢?
會在小小的格子間里,抱怨著工作的各種奇怪癥狀,吐槽著奇奇怪怪的喜歡吃糖很大聲的同事。
但是似乎這并不是我想要的,所以每當我寫這些叨逼叨的時候,其實就是給自己打雞血的時候,愿我們都心愿達成!
最近嘗試開始刷leetcode題目,用Python刷。
然鵝被吊打的不要不要的,要開始回頭看起數據結構和算法啦~
但是基礎還是很重要滴,所以2018年的最后一個小目標呢,就是在2019年來臨之前刷完正在看的Python教程。
Python的函數定義非常簡單,但靈活度卻非常大。除了正常定義的必選參數外,還可以使用默認參數、可變參數和關鍵字參數,使得函數定義出來的接口,不但能處理復雜的參數,還可以簡化調用者的代碼。
位置參數
這個是我們很熟悉的朋友,在以往的語法中都很了解了,在調用函數的時候,按順序賦值。
默認參數
設置默認參數時,有幾點要注意:
一是必選參數在前,默認參數在后,否則Python的解釋器會報錯;
二是如何設置默認參數。
當函數有多個參數時,把變化大的參數放前面,變化小的參數放后面。變化小的參數就可以作為默認參數。
定義默認參數要牢記一點:默認參數必須指向不變對象!
可變參數
參數個數不確定的時候,我們考慮使用list或者tuple傳參。
1.當我們有不定個數的參數時候,在位置參數前加上*,在函數內部接收到的就是一個tuple。這樣就可以傳入任意個數的參數。
2.當我們已經有一個list的時候,可以這么干↓Python允許你在list或tuple前面加一個*號,把list或tuple的元素變成可變參數傳進去
可變參數可以傳入0個或任意個參數。
關鍵字參數
關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict。
def person(name,age,**kw): print("name:",name,"age:",age,"others:",kw)
**kw用來接受任意個數的關鍵詞參數,它也可以啥都沒有
和可變參數類似,也可以先組裝出一個dict,然后,把該dict轉換為關鍵字參數傳進去。
注意此處,kw獲得的dict其實是extra的拷貝,函數內對kw的改變不會影響到extra。
命名關鍵字參數
我們在關鍵字參數中,只有在函數內才能檢查kw到底傳入哪些參數。
如果需要限制關鍵字參數的名字,就需要命名關鍵字參數,并用*隔開。
def person(name, age, *, city, job): print(name, age, city, job)
如果函數定義中已經有了一個可變參數,后面跟著的命名關鍵字參數就不再需要一個特殊分隔符*了:
def person(name, age, *args, city, job): print(name, age, args, city, job)
命名關鍵字參數必須傳入參數名,這和位置參數不同。
命名關鍵字參數可以有缺省值,從而簡化調用。在具有默認值的時候,可不傳入相關參數
使用命名關鍵字參數時,要特別注意,如果沒有可變參數,就必須加一個作為特殊分隔符。如果缺少,Python解釋器將無法識別位置參數和命名關鍵字參數。
參數組合
在Python中定義函數,可以用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數都可以組合使用。遞歸函數
但是請注意,參數定義的順序必須是:**必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
其實以前學遞歸的時候,第一個想到的是那個故事:
從前有座山,山里有座廟,廟里有個老和尚和小和尚,有一天老和尚跟小和尚說:我給你講個故事吧。從前有座山,山里有座廟,廟里有個老和尚和小和尚....
但是遞歸不是死循環,總有一天還是會出來的,雖然用的是自己的套路。(很土的說法吧hhh)
來個正經的定義吧:在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。
比如計算階乘n!
用遞歸可以醬紫寫↓
遞歸函數的優點是定義簡單,邏輯清晰。理論上,所有的遞歸函數都可以寫成循環的方式,但循環的邏輯不如遞歸清晰。
使用遞歸函數需要注意防止棧溢出。解決遞歸調用棧溢出的方法是通過尾遞歸優化,事實上尾遞歸和循環的效果是一樣的,所以,把循環看成是一種特殊的尾遞歸函數也是可以的。
尾遞歸是指,在函數返回的時候,調用自身本身,并且,return語句不能包含表達式。這樣,編譯器或者解釋器就可以把尾遞歸做優化,使遞歸本身無論調用多少次,都只占用一個棧幀,不會出現棧溢出的情況。
上面的代碼的return中帶了乘法表達式,所以不符合尾遞歸。
看了下廖老師的修改優化后的代碼
def fact(n): return fact_iter(n, 1) def fact_iter(num, product): if num == 1: return product return fact_iter(num - 1, num * product)
在這次的計算中,每次都會把num - 1和producct的結果計算出來后再進行調用fact_iter函數,所以棧不會增長。
廖老師給了兩個方法的棧對比圖,雖然懵逼中,但是還是學習到了。
希望自己寫的時候可以順順利利。
未優化前↓
優化后↓
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42857.html
摘要:一點點小刀刀晚上收到了某招聘軟件的的消息,心里慌的不行。所以在上面的代碼中,我們可以考慮把改為來更好的看出繼承關系。定義方法,在被用于循環時返回迭代對象,循環會不斷的調用方法拿到下一個值,直到終止。 一點點小刀刀 晚上收到了某招聘軟件的HR的消息,心里慌的不行。因為很想換崗位了,可是當機會來的時候,我卻只能表示能力不行。所以要速速的加油了!!! 開始學習的分割 日常一點點小雞血!請不要...
摘要:叨逼叨默認每天都要刷兩道題。今天目標已完成。經過昨天的那題數組題,我換了一種方式。之前我采用的是下標來定位,用來刪除重復項。這次采用了數組內的每一項來單獨做對比,用來進行刪除操作。這個判定很重要其中的是后面進行修改的,是必須的判定。 叨逼叨 默認每天都要刷兩道題。今天目標已完成。 第一題 26. 刪除排序數組中的重復項難度:簡單類型:數組 給定一個排序數組,你需要在原地刪除重復出現的元...
摘要:前面的一些碎碎念兩天的耽擱,思考了下,雖然需要全面基礎的學習,但是重點還是應該放在實戰上。更簡潔的版本是如果文件很小,一次性讀取最方便如果不能確定文件大小,反復調用比較保險如果是配置文件,調用最方便。 前面的一些碎碎念 兩天的耽擱,思考了下,雖然需要全面基礎的學習,但是重點還是應該放在實戰上。所以后續要速速的推倒這個教程了,用一些數據來實行一些分析:) 認真學習的分割線 打打打打雞血!...
摘要:刷題第三天正式刷題第三天。注意空字符串可被認為是有效字符串。錯誤的一次是因為沒有考慮空字符串,當存在為的時候,結果應該為。第二題加一難度簡單類型給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。 刷題第三天 正式刷題第三天。之前看了個說法,挺認可的。就是不要太在意一天的能呈現的價值,但是要在意累計的價值。之前很多時候我會對今天一天沒有完成的計劃而沮喪,事實上,算法的實踐...
摘要:第二題漢明距離難度簡單兩個整數之間的漢明距離指的是這兩個數字對應二進制位不同的位置的數目。給出兩個整數和,計算它們之間的漢明距離。第三題買賣股票的最佳時機難度簡單給定一個數組,它的第個元素是一支給定股票第天的價格。 寫在前面 這幾天斷斷續續做了題目,也在慢慢體會一些數據思維。終于不用邊做視頻邊寫題目啦~開心~把這幾天的題解發一下~ 認真做題的分割線 第一題 977. 有序數組的平方難度...
閱讀 2954·2021-11-11 16:55
閱讀 515·2021-09-27 13:36
閱讀 1073·2021-09-22 15:35
閱讀 2908·2019-08-30 12:46
閱讀 3125·2019-08-26 17:02
閱讀 1826·2019-08-26 11:56
閱讀 1295·2019-08-26 11:47
閱讀 423·2019-08-23 17:01