day11總結(jié)-匿名函數(shù)冕末、實(shí)參高階函數(shù)及變量作用域

匿名函數(shù)

1.什么是匿名函數(shù)

沒有函數(shù)名的函數(shù)就是匿名函數(shù)

2.語法

變量名 = lambda 形參列表:返回值 --根據(jù)實(shí)際情況剂买,前面的'變量名='可以不要(并非省略)

3.說明

lambda:關(guān)鍵字气笙,固定寫法

形參列表:可以設(shè)置默認(rèn)值得哆,不可以通過'冒號(hào)+類型名'的方式來說明參數(shù)類型(因?yàn)楹秃竺娴拿疤?hào)沖突)梁剔,只能用默認(rèn)值來設(shè)定參數(shù)類型虽画,其他和普通函數(shù)的形參列表一樣。

":" :固定寫法

返回值:相當(dāng)于普通函數(shù)中return后面的語句荣病,只能有一條語句(不能是帶有return的語句)码撰,因此有多行代碼的普通函數(shù),匿名函數(shù)無法實(shí)現(xiàn)

def func(n1,n2):
    return n1+n2

lambda n1,n2=0:n1+n2
lambda:print('hello world')   #參數(shù)可以為空

4.調(diào)用

變量名(實(shí)參列表):前面的變量名不一定要指定个盆,可以是通過任何方式獲取到的類型是function的值

在聲明時(shí)也可以同時(shí)調(diào)用:

(lambda n:n+1)(3)

Python中脖岛,聲明函數(shù)可以是看成聲明類型名為function的變量朵栖;匿名函數(shù)可以看成是function類型的數(shù)據(jù)(類似100是int類型的數(shù)據(jù))

a = lambda:print('hello world')    #a為變量,可以出現(xiàn)在列表柴梆,字典以及各種語句中
print(type(a))    #<class 'function'>
b = ['abc',1,2,'c',a]
print(b[-1])    #結(jié)果為<function <lambda> at 0x00665228>

c = ['abc',1,2,lambda x,y:x+y]
print(c[-1](10,20))    #30

d = (lambda n:n+1)(3)
print(d)    #4

函數(shù)作為變量

python中陨溅,聲明函數(shù)其實(shí)就是在聲明一個(gè)類型是function的變量,函數(shù)名就是變量名轩性。所以普通變量能做的事声登,函數(shù)都能做。

如下函數(shù)揣苏,func1是類型為function的變量悯嗓,它里面存的數(shù)據(jù)是一個(gè)函數(shù)

def func1(n):
    return n*n
#也可以寫為:
func1 = lambda n:n*n

print(func1,type(func1),func1(10))

普通變量能做的函數(shù)都能做

  • 給其他變量賦值
a = lambda n:n*2
b = a
  • 可以作為列表,元祖的元素卸察,字典的value脯厨,不能作為key及集合的元素,因?yàn)閒unction可變
def a(n):
    return n*2
b = [ 1,2,3,a]
print(b[-1](3))  #6
  • 作為其他函數(shù)的實(shí)參(實(shí)參高階函數(shù)或閉包)
def x(y):
    y('abc')

x(print)    #結(jié)果顯示:'abc'(print打印出來的坑质,函數(shù)調(diào)用值為None)

實(shí)參高階函數(shù)應(yīng)用:sort方法的使用

列表.sort(key):key需要傳一個(gè)類型是function的值(函數(shù))合武,要求這個(gè)函數(shù)有一個(gè)參數(shù)和一個(gè)返回值;

? 參數(shù)指向的是列表中的每個(gè)元素涡扼,返回值是排序的時(shí)候的比較對(duì)象稼跳。

nums = ['19','90','78','9','87']
nums.sort()
print(nums)     #['19', '78', '87', '9', '90'],按字符串大小排序
#若要按數(shù)字大小比較排序:
print(nums.sort(key=lambda x:int(x))) #['9', '19', '78', '87', '90']

類似的還有max()吃沪,min()汤善。

nums = ['14', '40', '73', '9', '85']


def fn1(x):
    return x[0]   # 返回值決定列表中的元素按什么進(jìn)行排序


nums.sort(key=fn1)
print(nums)    # ['14', '40', '73', '85', '9']
nums.sort(key=lambda item: int(item))
print(nums)   # ['9', '14', '40', '73', '85']


students = [
    {'name': 'xiaoming', 'age': 23, 'score': 90},
    {'name': 'huahu', 'age': 30, 'score': 70},
    {'name': 'zhangsan', 'age': 19, 'score': 100},
]
students.sort(key=lambda item: item['age'])
print(students)

students.sort(key=lambda item: item['score'])
print(students)

students.sort(key=lambda item: item['name'][-1])
print(students)

print(max(['10', '30', '8'], key=lambda x: int(x)))
print(max(students, key=lambda x: x['score']))
"""
['14', '40', '73', '85', '9']
['9', '14', '40', '73', '85']
[{'name': 'zhangsan', 'age': 19, 'score': 100}, {'name': 'xiaoming', 'age': 23, 'score': 90}, {'name': 'huahu', 'age': 30, 'score': 70}]
[{'name': 'huahu', 'age': 30, 'score': 70}, {'name': 'xiaoming', 'age': 23, 'score': 90}, {'name': 'zhangsan', 'age': 19, 'score': 100}]
[{'name': 'xiaoming', 'age': 23, 'score': 90}, {'name': 'zhangsan', 'age': 19, 'score': 100}, {'name': 'huahu', 'age': 30, 'score': 70}]
30
{'name': 'zhangsan', 'age': 19, 'score': 100}
"""
# =================自定義sort函數(shù)(模擬系統(tǒng)的)-了解============
def yt_sort(list1, key=None, reverse=False):
    """"""

    length = len(list1)
    if reverse:
        # 降序排列
        for x in range(0, length-1):
            for y in range(x+1, length):
                if key:
                    if key(list1[y]) > key(list1[x]):
                        list1[x], list1[y] = list1[y], list1[x]
                else:
                    if list1[y] > list1[x]:
                        list1[x], list1[y] = list1[y], list1[x]

    else:

        for x in range(0, length-1):
            for y in range(x+1, length):
                if key:
                    if key(list1[y]) < key(list1[x]):
                        list1[x], list1[y] = list1[y], list1[x]
                else:
                    if list1[y] < list1[x]:
                        list1[x], list1[y] = list1[y], list1[x]



nums = ['1', '60', '27', '9']
yt_sort(nums, key=lambda x: x[-1])
print(nums)

nums = [1, 90, 89, 9]
yt_sort(nums, reverse=True)
print(nums)
  • 作為函數(shù)的返回值
def oper(char):
    if char == '+':
        def zy_sum(*num):
            sum1 = 0
            for i in num:
                sum1 += i
            return sum1
        return zy_sum
    else:
        return None
    
print(oper('+')(1,2,3,4,5,6))    #21

思考

list1 = []
for i in range(4):
    list1.append(lambda x:x*i)
#求值
list1[0](3)
list1[1](3)
list1[2](3)    #結(jié)果都是9

注意:函數(shù)在聲明時(shí),函數(shù)體不會(huì)執(zhí)行票彪,直接跳過红淡,直到被調(diào)用時(shí),因此即使函數(shù)體有錯(cuò)誤降铸,如果不被調(diào)用則不會(huì)報(bào)錯(cuò)


作用域

作用域:變量的使用范圍在旱,分為全局變量和局部變量

全局變量

Python中除了在函數(shù)中或者類中聲明的變量,都是全局變量推掸。全局變量的作用域是從聲明開始到文件結(jié)束的任何位置都可以使用

局部變量

在函數(shù)中聲明的變量就是局部變量桶蝎,從聲明開始到函數(shù)結(jié)束都可以用

函數(shù)聲明時(shí)的形參是局部變量

不能在函數(shù)中直接修改一個(gè)全局變量的值,其結(jié)果是在函數(shù)中重新聲明一個(gè)新的變量

a = 10
def func():
    a = 22
    return a
print(a)     #10
print(func())   #22

global和nonlocal

global:若想要在一個(gè)函數(shù)中修改全局變量的值终佛,或者想要在函數(shù)中聲明一個(gè)全局變量俊嗽,使用global

語法:

global 變量名1,變量名2铃彰,...

變量名1=值1

變量名2=值2

...

注意:在函數(shù)中聲明全局變量時(shí)绍豁,不能在聲明全局變量前又聲明它為局部變量。聲明全局變量后牙捉,之后在函數(shù)中調(diào)用的此變量都視為全局變量

a=1
def func():
    a = 111      #不能在聲明全局變量前又聲明為局部變量
    global a
    a = 11
    return a
print(a)    
print(func()) #直接報(bào)錯(cuò)

nonlocal:想要在局部的局部中修改一個(gè)局部變量的值竹揍,使用nonlocal

語法:

nonlocal 變量1敬飒,變量2,...

變量名1=值1

變量名2=值2

def fun22():
    aaa = 123

    def fun222():
        nonlocal aaa
        aaa = 1000
        print('==:', aaa)

    fun222()
    print(aaa)


fun22()  
"""
==:1000
1000
"""
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芬位,一起剝皮案震驚了整個(gè)濱河市无拗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昧碉,老刑警劉巖英染,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異被饿,居然都是意外死亡四康,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門狭握,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闪金,“玉大人,你說我怎么就攤上這事论颅“タ眩” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵恃疯,是天一觀的道長(zhǎng)漏设。 經(jīng)常有香客問我,道長(zhǎng)今妄,這世上最難降的妖魔是什么愿题? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮蛙奖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杆兵。我一直安慰自己雁仲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布琐脏。 她就那樣靜靜地躺著攒砖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪日裙。 梳的紋絲不亂的頭發(fā)上吹艇,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音昂拂,去河邊找鬼受神。 笑死,一個(gè)胖子當(dāng)著我的面吹牛格侯,可吹牛的內(nèi)容都是我干的鼻听。 我是一名探鬼主播财著,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼撑碴!你這毒婦竟也來了撑教?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤醉拓,失蹤者是張志新(化名)和其女友劉穎伟姐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亿卤,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愤兵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怠噪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恐似。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖傍念,靈堂內(nèi)的尸體忽然破棺而出矫夷,到底是詐尸還是另有隱情,我是刑警寧澤憋槐,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布双藕,位于F島的核電站,受9級(jí)特大地震影響阳仔,放射性物質(zhì)發(fā)生泄漏忧陪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一近范、第九天 我趴在偏房一處隱蔽的房頂上張望嘶摊。 院中可真熱鬧,春花似錦评矩、人聲如沸叶堆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虱颗。三九已至,卻和暖如春蔗喂,著一層夾襖步出監(jiān)牢的瞬間忘渔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工缰儿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畦粮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锈玉,于是被迫代替她去往敵國(guó)和親爪飘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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