Python四大函數(shù) 變量,引用,匿名,遞歸

一. 局部和全局變量
1、局部變量
(1)含義:就是在函數(shù)內(nèi)部定義的變量(作用域僅僅局限在函數(shù)的內(nèi)部)不同的函數(shù)可以定義相同的局部變量,但是各自用各自的 不會產(chǎn)生影響
(2)作用:為了臨時的保存數(shù)據(jù) 需要在函數(shù)中定義來進行存儲
2、全局變量:可以被所有函數(shù)調(diào)用
3、突發(fā)情況
當(dāng)全局變量和局部變量出現(xiàn)重復(fù)定義的時候,程序會優(yōu)先執(zhí)行使用函數(shù)內(nèi)部定義的變量(地頭蛇)
如果在函數(shù)的內(nèi)部要想對全局變量進行修改的話 必須使用global 關(guān)鍵字進行聲明
對于可變類型(dict、list)來講,全局變量要想在函數(shù)中修改的話,我們不需要用global關(guān)鍵字去聲明的(因為對象的內(nèi)存地址不會改變)
4、代碼演示
c=3#c為全局變量,可以被所有函數(shù)調(diào)用a=2def Test():b=2#b為局部變量,只能在函數(shù)內(nèi)被調(diào)用global a#局部變量變?yōu)槿肿兞?/span>a=4print('{}'.format(a))passdefTest2():c=4print('{}'.format(c))pass Test2()print(c)#c沒有發(fā)生改變說明全局變量在函數(shù)中無法修改Test()print(a)#a發(fā)生了改變說明聲明全局變量 后才可以修改# 可變類型列表,字典 dict list,可以在函數(shù)中修改listA=[]print(type(listA))def demoList():listA.append('python')#向空列表里面添加數(shù)據(jù)passdemoList() print(listA)#發(fā)現(xiàn)輸出數(shù)據(jù)了# 不可變類型str tuple number【int、float、complex】
二. 引用
在python中,值是靠引用來傳遞來的,可以用id()查看一個對象的引用是否相同,id是值保存在內(nèi)存中那塊內(nèi)存地址的標(biāo)識。
可變類型列表和字典:函數(shù)調(diào)用全局變量后地址不會變化
代碼演示
li=[]print('原來的地址{}'.format(id(li)))def Test(n):li.append([1,3,'chen'])print(id(n))print('內(nèi)部的{}'.format(n))passprint(id(li))Test(li)#輸出我們發(fā)現(xiàn)地址是一樣的print('外部的變量對象{}'.format(li))#不可變類型a=1def func(x):print('x剛開始的地址{}'.format(id(x)))x=2print('x的值修改之后地址{}'.format(id(x)))#改變類型后地址發(fā)生了變化print(x)pass#調(diào)用函數(shù)print('a的地址:{}'.format(id(a)))func(a)print(a)
三. 匿名函數(shù)
1、介紹:使用lambda關(guān)鍵字去創(chuàng)建函數(shù)
沒有名字的函數(shù)
2、匿名函數(shù)冒號后面的表達式有且只有一個
注意:是表達式,而不是語句
3、自帶return,而這個return的結(jié)果就是表達式計算后的結(jié)果
4、缺點:lambda只能是單個表達式,不是一個代碼塊,lambda的設(shè)計就是為了滿足簡單函數(shù)的場景
僅僅能封裝有限的邏輯,復(fù)雜邏輯實現(xiàn)不了,必須使用def來處理
5、代碼演示
M=lambda x,y:x+yprint(M(2,3))#M相當(dāng)于一個調(diào)用函數(shù)#可以使用if-else語句,三元運算Test=lambda x,y:x if x>y else y#意思就是調(diào)用x和y兩個變量,如果x大于y就取x否則取yprint(Test(2,3))# 也可以單個參數(shù)使用Test=lambda x:(x**2)print(Test(10))
四. 遞歸
簡單理解:自己調(diào)用自己
必須有一個明確的結(jié)束條件
優(yōu)點:邏輯簡單、定義簡單
缺點:容易導(dǎo)致棧溢出,內(nèi)存資源緊張,甚至內(nèi)存泄漏
下列代碼是求階乘:以循環(huán)的方式去實現(xiàn)
def jiecheng(n):result=1for item in range(1,n+1):# range左閉右開,所以要加一 result*=itempassreturn resultprint(jiecheng(5))# 遞歸的方式實現(xiàn)def factorial (n):if n == 1:return 1return n * factorial (n-1)print(factorial(5))
原文鏈接:
https://blog.csdn.net/weixin_46654114/article/details/116379272
(版權(quán)歸原作者所有,侵刪)
![]()

點擊下方“閱讀原文”查看更多
