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