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