一豆挽、匿名函數(shù)
匿名函數(shù)本質(zhì)還是函數(shù)闸拿,之前函數(shù)的所有內(nèi)容仍然適用。
1掐隐、匿名函數(shù)的聲明
函數(shù)名 = lambda 參數(shù)列表:返回值
2、說明
函數(shù)名:本質(zhì)是一個變量存儲右邊的函數(shù)线欲。(可無)
lambda:聲明匿名函數(shù)的關(guān)鍵字。
參數(shù)列表:參數(shù)名1,參數(shù)名2参萄,......
冒號:固定寫法。
返回值:表達(dá)式的值就是返回值煎饼。
#用匿名函數(shù)計算兩個數(shù)的和
my_sum = lambda x, y: x + y
print(my_sum(1,2))
3
3讹挎、調(diào)用
匿名函數(shù)的調(diào)用和普通函數(shù)一樣:函數(shù)名(實參)
#1、寫一個匿名函數(shù)吆玖,獲取指定數(shù)字列表筒溃,指定下標(biāo)的值得1/2
x = lambda list1,index:list1[index]/2
print(x([1,2,3,4,5],3))
# 2、獲取一個列表所有元素的和和平均值(sum函數(shù)可以計算一個序列的和)
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)用過程是一個壓棧的過程:
每次調(diào)用一個函數(shù)沾乘,系統(tǒng)就會在內(nèi)存區(qū)域中的棧區(qū)間取開辟空間怜奖,保存函數(shù)調(diào)用產(chǎn)生的數(shù)據(jù)。當(dāng)函數(shù)調(diào)用完成后翅阵,對應(yīng)的棧區(qū)間會自動銷毀歪玲。
函數(shù)調(diào)用時產(chǎn)生的棧區(qū)間中保存的數(shù)據(jù)有:形參、函數(shù)中聲明變量
二怎顾、函數(shù)作用域
作用域:指的是一個變量能夠使用的范圍
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)實現(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)實現(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í)二:計算斐波那契數(shù)列1,1,2,3,5,8...第n個數(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é)果和運行過程:
def func():
a = []
for i in range(5):
a.append(lambda x:x*i) #先把匿名函數(shù)存進(jìn)去踢涌,沒有計算返回值通孽。
return a #返回func()值時,開始計算列表內(nèi)的數(shù)斯嚎,此時 i = 4利虫,所以列表內(nèi)所有匿名函數(shù) i值都為4
aa = func()
print(aa[0](2), aa[2](2), aa[3](2))
結(jié)果:
8 8 8