2018-08-30 Day9-函數(shù)基礎(chǔ)02

一、匿名函數(shù)

匿名函數(shù)本質(zhì)還是函數(shù),之前函數(shù)的所有內(nèi)容仍然適用。

1、匿名函數(shù)的聲明

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

2、說明

函數(shù)名:本質(zhì)是一個(gè)變量存儲(chǔ)右邊的函數(shù)。(可無)
lambda:聲明匿名函數(shù)的關(guān)鍵字。
參數(shù)列表:參數(shù)名1,參數(shù)名2,......
冒號(hào):固定寫法。
返回值:表達(dá)式的值就是返回值。

#用匿名函數(shù)計(jì)算兩個(gè)數(shù)的和
my_sum = lambda x, y: x + y
print(my_sum(1,2))

3
3、調(diào)用

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

#1、寫一個(gè)匿名函數(shù),獲取指定數(shù)字列表,指定下標(biāo)的值得1/2
x = lambda list1,index:list1[index]/2
print(x([1,2,3,4,5],3))

# 2、獲取一個(gè)列表所有元素的和和平均值(sum函數(shù)可以計(jì)算一個(gè)序列的和)
x = lambda list2 : (sum(list2), sum(list2)/len(list2))
sum,average = x([1,2,3,4,5,6])
print(sum,average)
#或者這樣取值
#print(x([1,2,3,4,5,6])[0])  

函數(shù)的調(diào)用過程是一個(gè)壓棧的過程:
每次調(diào)用一個(gè)函數(shù),系統(tǒng)就會(huì)在內(nèi)存區(qū)域中的棧區(qū)間取開辟空間,保存函數(shù)調(diào)用產(chǎn)生的數(shù)據(jù)。當(dāng)函數(shù)調(diào)用完成后,對(duì)應(yīng)的棧區(qū)間會(huì)自動(dòng)銷毀。
函數(shù)調(diào)用時(shí)產(chǎn)生的棧區(qū)間中保存的數(shù)據(jù)有:形參、函數(shù)中聲明變量

二、函數(shù)作用域

作用域:指的是一個(gè)變量能夠使用的范圍

1、全局變量(global)
  • 全局變量:就是聲明在函數(shù)和類外面的變量都是全局變量。
  • 全局變量作用域:從聲明開始到文件結(jié)束。
2、局部變量(local)
  • 局部變量:聲明在函數(shù)中或者類的變量就是局部變量。
  • 局部變量的作用域:從聲明開始到函數(shù)結(jié)束(類結(jié)束)。
    注意:函數(shù)的參數(shù)是聲明在函數(shù)中的局部變量,同樣不能在別的函數(shù)中使用。
# x, y, z都是局部變量
def func3(x, y):
  z = 'ab'
  • 在局部區(qū)域內(nèi)修改全局變量的值 --- global
c = 100
def func1():
    global c   #修改全局變量
    c = 200
func1()
print(c)
  • 在局部的局部中修改局部變量 --- nonlocal
def func5():
    nn = 10
    def func6():
        nonlocal nn
        nn = 20
        print('func6',nn)
    func6()
    print('func5', nn)
func5()

func6 20
func5 20

三、遞歸函數(shù)

遞歸函數(shù):在函數(shù)的函數(shù)體中調(diào)用函數(shù)本身,這樣的函數(shù)就是遞歸函數(shù)。

注意:盡量不使用,遞歸函數(shù)反復(fù)調(diào)用函數(shù),開辟空間,消耗內(nèi)存。

怎么寫遞歸函數(shù)?

(1)、找臨界值。(找到讓循環(huán)結(jié)束的值/ 找到能夠確定函數(shù)結(jié)果值)
(2)、假設(shè)函數(shù)的功能已經(jīng)實(shí)現(xiàn)的前提下,找關(guān)系 f(n)和 f(n-1)/ 當(dāng)次循環(huán)和上次循環(huán)的關(guān)系。
(3)、根據(jù) f(n)和 f(n-1)的關(guān)系,來通過 f(n-1)實(shí)現(xiàn) f(n)的效果。

練習(xí):

#練習(xí)一
#1+2+3+...+100
def my_sum(n):
    #在臨界值的位置一定要讓函數(shù)結(jié)束
    if n == 1:
        return 1
    return my_sum(n-1) + n
print(my_sum(100))

結(jié)果:
5050

#練習(xí)二:計(jì)算斐波那契數(shù)列1,1,2,3,5,8...第n個(gè)數(shù)
def fib(n):
    if n == 1 or n == 2:
        return 1
    return fib(n-1) + fib(n-2)
print(fib(5))

結(jié)果:
5

#練習(xí)三:使用遞歸完成以下效果
n = 3
#***
#**
# *
def xxx(n):
    if n == 1 :
        print('*')
        return
    print('*'*n)
    xxx(n-1)
xxx(3)

結(jié)果:
***
**
*

思考一下程序結(jié)果和運(yùn)行過程:

def func():
    a = []
    for i in range(5):
        a.append(lambda x:x*i)     #先把匿名函數(shù)存進(jìn)去,沒有計(jì)算返回值。
    return a     #返回func()值時(shí),開始計(jì)算列表內(nèi)的數(shù),此時(shí) i = 4,所以列表內(nèi)所有匿名函數(shù) i值都為4
aa = func()
print(aa[0](2), aa[2](2), aa[3](2))

結(jié)果:
8 8 8
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,565評(píng)論 0 13
  • 一、快捷鍵 ctr+b 執(zhí)行ctr+/ 單行注釋ctr+c ...
    o_8319閱讀 6,032評(píng)論 2 16
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,256評(píng)論 0 38
  • 警察主席是女人,頭銜卻是陽性,怎么辦? 今年四月份,柏林迎來了歷史上首位女警察主席。剛一上任,各方政客就對(duì)主席辦公...
    紫九九閱讀 1,913評(píng)論 4 3
  • 亞亞生日任性回饋: 自己的生日得嗨一把^_^(9月20日) 特在此向一直以來支持我的盆友們?nèi)涡曰仞仯?凡在亞亞家買...
    lucy丫丫閱讀 221評(píng)論 0 0

友情鏈接更多精彩內(nèi)容