10.11 day10函數(shù)的應(yīng)用

1.匿名函數(shù)

"""
1.普通函數(shù):
def 函數(shù)名(參數(shù)列表):
函數(shù)體

2.匿名函數(shù):
函數(shù)名 = lambda 參數(shù)列表:返回值

說明:
函數(shù)名 --> 變量名
lambda --> 關(guān)鍵字
參數(shù)列表 --> 參數(shù)名1肄梨,參數(shù)名2....
: - > 固定的
返回值 --> 相當(dāng)于只有一個(gè)return語(yǔ)句的函數(shù)體

匿名函數(shù)的調(diào)用和普通函數(shù)一樣:函數(shù)名(實(shí)參列表)

# 寫一個(gè)匿名函數(shù),功能是求兩個(gè)數(shù)的和
sum1 = lambda num1,num2:num1 + num2
# sum1 = lambda num1=10,num2=20:num1+num2
print(sum1(1,2))
# print(sum1(num1=100,num2=23))

sum3 = lambda *nums:sum(nums)
print(sum3(1,2,3))
# 相當(dāng)于上面的匿名函數(shù)
# def sum1(num1,num2):
#     return num1+num2

# 練習(xí):請(qǐng)1+2+3+...+n的和
sum2 = lambda n:sum(range(n+1))
print(sum2(100))

# 練習(xí):讀程序
funcs = []
for item in range(1,5):
    funcs.append(lambda x:x*item)
"""
item = 1~4
item = 1 [lambda x:x*item]
item = 2 [lambda x:x*item,lambda x:x*item]
item = 3 [lambda x:x*item,lambda x:x*item,lambda x:x*item]
item = 4 [lambda x:x*item,lambda x:x*item,lambda x:x*item,lambda x:x*item]

"""
print(funcs[0](2))  # 2*4 8
print(funcs[1](2))  # 2*4 8

2.變量的作用域

"""
1.變量的作用域
變量的作用域指得是變量能夠使用的范圍

2.全局變量和局部變量
全局變量:聲明在函數(shù)和類的外面的變量都是全局變量隐解,作用域是從聲明開始囤锉,到整個(gè)py文件結(jié)束咕晋。任何地方都可以使用

3.局部變量:聲明在函數(shù)和類中的變量都是局部變量赞厕。申明在函數(shù)的局部變量慷暂,作用域是從聲明開始到整個(gè)函數(shù)結(jié)束

"""

# 全局變量
a = 10
for x in range(a):
    print(x)
def asd(num):
    print(a)

# ----------
# 局部變量
def fun1():
    aa = 100 # 局部變量
    print(aa)
    for x in range(5):
        print(aa + "x")

"""
4.global關(guān)鍵字
在函數(shù)中說明一個(gè)變量是全局變量
只能在函數(shù)中使用
"""

name = 'abc'
def func2():
    global age
    age = 18
    global name  # 說明當(dāng)前函數(shù)中的name是全局變量name
    name = 'aaa'
    print(name)
func2()
print(name)

"""
5.nonlocal關(guān)鍵字
想要在局部的局部中修改局部變量的值
"""

def func3():
    abc = 100
    def func4():
        nonlocal abc
        abc = 200
        print('f4:',abc)
    func4()
    print('f3: ,abc')
func3()
0
1
2
3
4
5
6
7
8
9
aaa
aaa
f4: 200
f3: ,abc

3.函數(shù)作為變量

"""
聲明函數(shù)就是聲明一個(gè)類型是function的變量蜈项,函數(shù)名實(shí)質(zhì)就是變量名芹关。

"""

def func1():
    print('====')
print(type(func1))

"""
1.變量可以給其他變量賦值
"""

a = 10
b = a
print(b*10)

list1 = [1,2]
list2 = list1
list2.append(100)
print(list2)

func1= lambda  x:print(x)
func2  =func1
func2(10)
# 聲明一個(gè)變量func11,類型是function
def func11():
    print('我是函數(shù)')
# 用一個(gè)函數(shù)給變量a賦值紧卒,a也是一個(gè)函數(shù)
a= func11
a()
# 將函數(shù)func11的返回值給b,b的值是None
b = func11()
print(b)

"""
2.函數(shù)作為列表的元素
"""

a = 10
list1 = [1,a]
print(list1,list1[1]+100)

def func22():
    print('我是函數(shù)')
    return  10
list2 = [1,func22,func22()]
print(list2)

# list2[1] 取到一個(gè)函數(shù)侥衬,通過后面加()調(diào)用函數(shù)
print(list2[1]())
# list2[2] 取到的是整數(shù)10
print(list2[2]+100)

"""
3.將函數(shù)作為參數(shù)
"""

a = 10

def func1(n):
    print(n)
func1(a)

def func11(n):
    # n = func12
    n() # func12()

def func12():
    print('hello world')

re = func11(func12)
func11(func12)

應(yīng)用:

"""
列表.sort(key=None,reverse=False)
使用sort的時(shí)候,可以通過給key賦一個(gè)函數(shù)變量跑芳,來規(guī)定列表中的元素按照什么標(biāo)準(zhǔn)來排序
這兒的函數(shù)變量要求有一個(gè)參數(shù)和一個(gè)返回值轴总,參數(shù)代表列表中的元素,返回值代表按那個(gè)要求排序
"""

list1 = [1, 32, 213, 321]
list1.sort()
print(list1)

list2 = [
    {'name': '張三', 'age': 20,'score': 90},
    {'name': '李四', 'age': 23,'score': 70},
    {'name': '王五', 'age': 12,'score': 80},
]
# 根據(jù)成績(jī)排序
# def get_age(item):
#     return item['age']
# list2.sort(key = get_age)
list2.sort(key=lambda item:item['age'])
print(list2)

list3 = [
    ('a', 20),
    (10, 3),
    ('b', 90)
]
# def get_num(s):
#     return s[1]
# list3.sort(key = get_num,reverse=True)
# print(list3)
list3.sort(key=lambda item:item[1])
print(list3)

"""
4.將函數(shù)作為返回值
"""

# 根據(jù)運(yùn)算符號(hào)博个,返回對(duì)應(yīng)的功能
def operation(operator: str):
    if operator == '+':
        def func1(*args, **kwargs):
            # 求和
            # args = (10, 20) kwargs = {'a':2, 'b': 3}
            sum1 = 0
            for item in args:
                sum1 += item
            for key in kwargs:
                sum1 += kwargs[key]
            return sum1
        return func1
    elif operator == '*':
        def func2(*args,**kwargs):
            sum1 = 1
            for item in args:
                sum1 *= item
            for key in kwargs:
                sum1 *= kwargs[key]
            return sum1
        return func2

f1 = operation('+') # f1就是有兩個(gè)不定長(zhǎng)參數(shù)怀樟,功能是求和的函數(shù)

re = f1(10, 20, a=2, b=3)
print(re)
re = operation('+')(90,98)
print(re)

print(operation('*')(10, 20, a=2, b=3))
print(operation('*')(1, 2, 3, 4))
<class 'function'>
100
[1, 2, 100]
10
我是函數(shù)
我是函數(shù)
None
[1, 10] 110
我是函數(shù)
[1, <function func22 at 0x0282A300>, 10]
我是函數(shù)
10
110
10
hello world
hello world
[1, 32, 213, 321]
[{'name': '王五', 'age': 12, 'score': 80}, {'name': '張三', 'age': 20, 'score': 90}, {'name': '李四', 'age': 23, 'score': 70}]
[(10, 3), ('a', 20), ('b', 90)]
35
188
1200
24

4.函數(shù)的調(diào)用

"""
1.補(bǔ)充:python中的函數(shù)可以有多個(gè)返回值
"""

求多個(gè)數(shù)的和以及平均值


def dx_sum(*nums):
    sum1 = sum(nums)
    average = sum1/len(nums)
    return sum1,average  # 同時(shí)返回和、平均值


a, b = dx_sum(123, 43, 123, 43, 23)
num = dx_sum(31, 231, 43, 43, 223)

print(a, b)
print(num[0], num[1])

"""
2.函數(shù)的調(diào)用過程是一個(gè)壓棧的過程

每次調(diào)用函數(shù)的時(shí)候坡倔,系統(tǒng)都會(huì)在內(nèi)存中(棧)開辟空間來存儲(chǔ)函數(shù)執(zhí)行過程中產(chǎn)生的數(shù)據(jù)(函數(shù)聲明中的變量)
當(dāng)函數(shù)調(diào)用完成后漂佩,這塊內(nèi)存會(huì)自動(dòng)銷毀脖含。

"""

355 71.0
571 114.2

5.遞歸函數(shù)

"""
1.什么是遞歸函數(shù)
遞歸函數(shù):函數(shù)中調(diào)用函數(shù)本身,這樣的函數(shù)就是遞歸函數(shù)(自己調(diào)用自己)

循環(huán)能做的事情遞歸都可以做投蝉,但實(shí)際上循環(huán)能解決的問題絕對(duì)不能選遞歸
"""

def func1():
    print('====')
    func1()

"""
2.怎么寫遞歸函數(shù)
第一步:確定臨界值(循環(huán)結(jié)束的條件)养葵,讓函數(shù)結(jié)束
第二部:找關(guān)系,假設(shè)函數(shù)的功能已經(jīng)時(shí)間瘩缆,找f(n)和f(n-1)的關(guān)系
第三步:根據(jù)關(guān)系关拒,用f(n-1)實(shí)現(xiàn)f(n)的功能
"""

"""

dx_sum(5) n = 5 5!=1 return dx_sum(4)+5
dx_sum(4) n = 4 4!=1 return dx_sum(3)+4
....
dx_sum(1) n =1 1==1 retnrn 1
"""
# 1+2+3+....100
def dx_sum(n):
    # 1.找臨界值
    if n == 1:
        return 1
    # 2.找關(guān)系
    """
    dx_sum(n) = 1+2+3+...+n
    dx_sum(n) = 1+2+3+...+n-1
    dx_sum(n) = dx_sum(n-1)+n
    
    """
    # 3.用f(n-1)實(shí)現(xiàn)f(n)的功能
    return dx_sum(n-1) + n
print(dx_sum(100))


# 用遞歸實(shí)現(xiàn)以下功能
"""
n = 3
***
**
*

n = 4
****
***
**
*

先打印4課星
f(3)

打印n顆星
f(n-1)
"""
def print_star(n):
    if n == 1:
        print('*')
        return
    print('*'*n)
    print_star(n-1)

print_star(5)

"""
n = 3
*
**
***

n = 4
*
**
***
****
"""
def print_star(n):
    if n == 1:
        print('*')
        return
    print_star(n - 1)
    print('*'*n)

print_star(5)

總結(jié):遞歸能不用,就不用S褂椤着绊!

5050
*****
****
***
**
*
*
**
***
****
*****
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市熟尉,隨后出現(xiàn)的幾起案子归露,更是在濱河造成了極大的恐慌,老刑警劉巖斤儿,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剧包,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡往果,警方通過查閱死者的電腦和手機(jī)疆液,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陕贮,“玉大人堕油,你說我怎么就攤上這事“怪” “怎么了掉缺?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)戈擒。 經(jīng)常有香客問我攀圈,道長(zhǎng),這世上最難降的妖魔是什么峦甩? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任赘来,我火速辦了婚禮,結(jié)果婚禮上凯傲,老公的妹妹穿的比我還像新娘犬辰。我一直安慰自己,他們只是感情好冰单,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布幌缝。 她就那樣靜靜地躺著,像睡著了一般诫欠。 火紅的嫁衣襯著肌膚如雪涵卵。 梳的紋絲不亂的頭發(fā)上浴栽,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音轿偎,去河邊找鬼典鸡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坏晦,可吹牛的內(nèi)容都是我干的萝玷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼昆婿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼球碉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仓蛆,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤睁冬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后看疙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痴突,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年狼荞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帮碰。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡相味,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出殉挽,到底是詐尸還是另有隱情丰涉,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布斯碌,位于F島的核電站一死,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏傻唾。R本人自食惡果不足惜投慈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冠骄。 院中可真熱鬧伪煤,春花似錦、人聲如沸凛辣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扁誓。三九已至防泵,卻和暖如春蚀之,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捷泞。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工足删, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肚邢。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓壹堰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親骡湖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贱纠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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