篇二 python函數(shù)

20200206

##命名空間(namespace)

指的是變量存儲(chǔ)的位置崇裁,每一個(gè)變量都需要存儲(chǔ)到指定的命名空間中

每一個(gè)作用域都會(huì)有一個(gè)它對(duì)應(yīng)的命名空間

全局命名空間首懈,用來(lái)保存全局變量,函數(shù)命名空間用來(lái)保存函數(shù)中的變量

命名空間實(shí)際上就是一個(gè)字典脊髓,是一個(gè)專門(mén)用來(lái)存儲(chǔ)變量的字典。

locals()用于獲取當(dāng)前作用域的命名空間

r如果在全局作用域中調(diào)用locals()則獲取全局命名空間,如果在函數(shù)作用域中調(diào)用locals()

返回一個(gè)字典

示例代碼:

scope=locals()

print(scope)

print(scope['a'])

在函數(shù)內(nèi)部locals()會(huì)獲取函數(shù)的命名空間押赊,使用globals()獲取全局命名空間。

可以使用locals()可以來(lái)操控函數(shù)的命名空間包斑,但是不建議這么操作流礁。

##遞歸

1.基線條件(問(wèn)題可以被分解為的最小問(wèn)題,當(dāng)滿足基線條件時(shí)罗丰,遞歸就不再執(zhí)行了)

2.遞歸條件(將問(wèn)題繼續(xù)分解的條件)

遞歸編寫(xiě)起來(lái)容易神帅,不容易閱讀。

循環(huán)編寫(xiě)起來(lái)難萌抵,容易閱讀找御。

問(wèn)題:求解10的階乘

示例代碼:

def factorial1(n):

'''

求解任意數(shù)的階乘

參數(shù):

n要求階乘的數(shù)字

'''

????result=n

????for i in range(1,n):

????????result*=i

????????return? result

def factorial2(n):

'''

求解任意數(shù)的階乘

參數(shù):

n要求階乘的數(shù)字

'''

#基線條件元镀,判斷n是否為1,若為1霎桅,不再繼續(xù)栖疑。

????if n==1:

????????return 1

????return? n*factorical2(n-1)

函數(shù)power為任意數(shù)字做冪運(yùn)算

def power(n,i):

????if i==1:

????????return n

????ruturn n*power(n,i-1)

判斷回文字符串,是的話返回ture,反之flase

def huiwen(str):

????if len(s)<2:

????????return ture

????elif s[0]!=s[-1]:

????????return false

????return huiwen(s[1:-1])

##高階函數(shù)

在python中滔驶,函數(shù)是一等對(duì)象

一等對(duì)象一般都會(huì)具有如下特點(diǎn):

對(duì)象在運(yùn)行時(shí)創(chuàng)建

能賦值給變量或作為數(shù)據(jù)結(jié)構(gòu)中的元素

能作為參數(shù)傳遞

能作為返回值返回

高階函數(shù)至少要符合以下兩個(gè)條件:

接收函數(shù)作為參數(shù)或者函數(shù)作為返回值的函數(shù)

實(shí)際上是將函數(shù)中保存的代碼傳輸至函數(shù)中

應(yīng)用場(chǎng)景:

定義函數(shù)遇革,可以將指定列表中的所有的偶數(shù),保存到一個(gè)新的列表中進(jìn)行返回

def fn(lst):

#創(chuàng)建新列表

????new_list=[]

#對(duì)列表進(jìn)行篩選

????for n in lst:

????????if n%2==0:

????????????new_list.append(n)

????????return new_list

#定義一個(gè)函數(shù)揭糕,用來(lái)檢查一個(gè)任意的數(shù)字是否為偶數(shù)

def fn2(i):

? ? if i%2==0:

? ? ? ? return True

? ? return False

#定義一個(gè)函數(shù)澳淑,用來(lái)檢查一個(gè)任意的數(shù)字是否大于5

def fn3(i):

? ? if i>5:

? ? ? ? return True

? ? return False

def fn(func,lst):

? ? # 創(chuàng)建新列表

? ? new_list = []

? ? # 對(duì)列表進(jìn)行篩選

? ? for n in lst:

? ? ? ? if func(n):

? ? ? ? ? ? new_list.append(n)

? ? return new_list

#filter()可以從序列這種過(guò)濾出符合條件的元素,保存到一個(gè)新的序列中

參數(shù):

1.函數(shù)插佛,根據(jù)該函數(shù)來(lái)過(guò)濾序列(可迭代的結(jié)構(gòu))

2.需要過(guò)濾的序列(可迭代的結(jié)構(gòu))

返回值:

過(guò)濾后的新序列(可迭代的結(jié)構(gòu))

print(list(filter(fn,l)))

##匿名函數(shù)lamba

lambda函數(shù)表達(dá)式專門(mén)來(lái)創(chuàng)建一些簡(jiǎn)單的函數(shù)杠巡,是創(chuàng)建函數(shù)的又一種方式.

語(yǔ)法:lambda 參數(shù)列表:返回值

匿名函數(shù)一般都是作為參數(shù)使用,在其他地方一般不會(huì)使用

def fn5(a,b):

? ? return a+b

#也可以將匿名函數(shù)賦值給一個(gè)變量雇寇,一般不會(huì)這么做

lambda a,b:a+b

filter(fn5,l)

filter(lambda a,b:a+b,l)

map()函數(shù)可以對(duì)對(duì)象中所有元素做指定的操作氢拥,然后添加到一個(gè)新的對(duì)象中進(jìn)行返回。

map(lambda i:i+1,l)

#定義一個(gè)函數(shù)锨侯,用來(lái)檢查一個(gè)任意的數(shù)字是否為偶數(shù)

def fn2(i):

????if i%2==0:

????????return True

? ? return False

#定義一個(gè)函數(shù)嫩海,用來(lái)檢查一個(gè)任意的數(shù)字是否大于5

def fn3(i):

????if i>5:

????????return True

? ? return False

def fn(func,lst):

# 創(chuàng)建新列表

? ? new_list = []

# 對(duì)列表進(jìn)行篩選

? ? for nin lst:

????????if func(n):

????????????new_list.append(n)

????????return new_list

##匿名函數(shù)lamba

lambda函數(shù)表達(dá)式專門(mén)來(lái)創(chuàng)建一些簡(jiǎn)單的函數(shù),是創(chuàng)建函數(shù)的又一種方式:

def fn5(a,b):

return a+b

#也可以將匿名函數(shù)賦值給一個(gè)變量囚痴,一般不會(huì)這么做

lambda a,b:a+b

filter(fn5,l)

filter(lambda a,b:a+b,l)

map()函數(shù)可以對(duì)對(duì)象中所有元素做指定的操作叁怪,然后添加到一個(gè)新的對(duì)象中進(jìn)行返回。

##sort

該方法用來(lái)對(duì)列表中的元素進(jìn)行排序

sort()默認(rèn)是直接比較列表中元素的大小

sort()可以接收一個(gè)關(guān)鍵字參數(shù)深滚,key

key作為函數(shù)的一個(gè)參數(shù)奕谭,當(dāng)設(shè)置了函數(shù)作為參數(shù)

每次都會(huì)一列表中的一個(gè)元素作為參數(shù)來(lái)調(diào)用函數(shù),并且使用函數(shù)的返回值來(lái)比較元素的大小

l=['a','vv','cccc','dddddd']

l.sort(key=len)

print(l)

l.sort()

print(l)

sorted()

這個(gè)函數(shù)和sort()的用法基本一致痴荐,但是sorted()可以對(duì)任意的序列進(jìn)行排序

sorted排序不會(huì)影響原來(lái)的序列血柳,而是返回一個(gè)新的序列

print(sorted(l,key=len))

##閉包

函數(shù)作為返回值返回

通過(guò)閉包可以創(chuàng)建一些只有當(dāng)前函數(shù)能訪問(wèn)的變量

形成閉包的條件

1.函數(shù)的嵌套

2.將函數(shù)作為返回值進(jìn)行返回

3.內(nèi)部函數(shù)必須使用外部函數(shù)的變量

使用閉包主要是想隱藏不想讓他人看到的數(shù)據(jù)

def fn():

#函數(shù)內(nèi)部定義一個(gè)函數(shù)

? ? def inner():

????????print('wo')

????return inner

#r是一個(gè)函數(shù),是調(diào)用fn()后的返回的函數(shù)

#這個(gè)函數(shù)是在fn()內(nèi)部定義的生兆,并不是全局函數(shù)

#所以這個(gè)函數(shù)總是能訪問(wèn)到fn()函數(shù)內(nèi)的變量

r=fn()

print(r)

#求多個(gè)數(shù)的平局值

nums=[11,2,34,33]

print(sum(nums)/len(nums))

def make_average()

????nums=[]

????def average(n):

????????nums.append(n)

????????return sum(nums)/len(nums)

return average

##裝飾器

創(chuàng)建幾個(gè)函數(shù)

def add(a,b):

????r=a+b

????return r

def mul(a,b):

????r=a*b

????return r

r=add(1122,22)

print(r)

#我們不希望在不修改原函數(shù)的情況下难捌,對(duì)函數(shù)進(jìn)行擴(kuò)展

def fn():

????print('我是fn函數(shù)')

def fn2():

????print('程序開(kāi)始執(zhí)行')

????fn()

????print('程序執(zhí)行結(jié)束')


def new_add(a,b):

????print('程序開(kāi)始執(zhí)行')

????r=add(a,b)

????print('程序執(zhí)行結(jié)束')

????return r

r=new_add(11,22)

print(r)

#上邊的方式在不修改源碼的情況下,對(duì)函數(shù)進(jìn)行擴(kuò)展鸦难,但是每擴(kuò)展一個(gè)函數(shù)需要手動(dòng)創(chuàng)建一個(gè)函數(shù)

#為了解決這個(gè)問(wèn)題根吁,我們創(chuàng)建一個(gè)函數(shù),讓這個(gè)函數(shù)自動(dòng)幫助我們創(chuàng)建生產(chǎn)函數(shù)

def begin_end(old):

'''

? ? 用于對(duì)其他函數(shù)進(jìn)行擴(kuò)展合蔽,是其他函數(shù)在執(zhí)行前打印開(kāi)始執(zhí)行击敌,執(zhí)行后打印執(zhí)行結(jié)束

? ? 參數(shù):old要擴(kuò)展的函數(shù)'''

? ? def new_function(*args,**kwargs):

????????print('程序開(kāi)始執(zhí)行')

????????r = old(*args,**kwargs)

????????print('程序執(zhí)行結(jié)束')

????????return r

????#返回新函數(shù)

? ? return new_function

#像begin_end()這種函數(shù),我們成為裝飾器辈末,通過(guò)裝飾器愚争,可以在不修改原函數(shù)的情況下對(duì)函數(shù)進(jìn)行修改

#在定義函數(shù)時(shí),可以通過(guò)@裝飾器挤聘,來(lái)使用指定的裝飾器轰枝,同時(shí)可以為多個(gè)函數(shù)指定多個(gè)裝飾器

#多個(gè)裝飾器的時(shí)候,從內(nèi)往外進(jìn)行裝飾组去。

#典型用法:

@begin_end

def say_hello():

????print('大家好')

#希望函數(shù)可以在計(jì)算前鞍陨,打印開(kāi)始計(jì)算值,計(jì)算結(jié)束后打印計(jì)算完畢

#我們可以直接修改函數(shù)中的代碼完成需求从隆,但是會(huì)產(chǎn)生以下一些問(wèn)題:

#1.函數(shù)多诚撵,修改會(huì)方便

#2.后期不方便維護(hù)

#3.違反開(kāi)閉原則(OCP)? 程序的設(shè)計(jì),要求開(kāi)發(fā)對(duì)程序的擴(kuò)展键闺,要關(guān)閉對(duì)程序的修改

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寿烟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辛燥,更是在濱河造成了極大的恐慌筛武,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挎塌,死亡現(xiàn)場(chǎng)離奇詭異徘六,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)榴都,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)待锈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人嘴高,你說(shuō)我怎么就攤上這事竿音。” “怎么了拴驮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵谍失,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我莹汤,道長(zhǎng)快鱼,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任纲岭,我火速辦了婚禮抹竹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘止潮。我一直安慰自己窃判,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布喇闸。 她就那樣靜靜地躺著袄琳,像睡著了一般询件。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唆樊,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天宛琅,我揣著相機(jī)與錄音,去河邊找鬼逗旁。 笑死嘿辟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的片效。 我是一名探鬼主播红伦,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼淀衣!你這毒婦竟也來(lái)了昙读?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤膨桥,失蹤者是張志新(化名)和其女友劉穎箕戳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體国撵,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陵吸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了介牙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壮虫。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖环础,靈堂內(nèi)的尸體忽然破棺而出囚似,到底是詐尸還是另有隱情,我是刑警寧澤线得,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布饶唤,位于F島的核電站,受9級(jí)特大地震影響贯钩,放射性物質(zhì)發(fā)生泄漏募狂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一角雷、第九天 我趴在偏房一處隱蔽的房頂上張望祸穷。 院中可真熱鬧,春花似錦勺三、人聲如沸雷滚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)祈远。三九已至呆万,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間车份,已是汗流浹背谋减。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躬充,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓讨便,卻偏偏與公主長(zhǎng)得像充甚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霸褒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容