09函數(shù)返回值,作用域,遞歸,匿名

一.返回值的作用:

(1)返回值的作用,函數(shù)里面的數(shù)據(jù)傳遞到外面。
(2)要不要返回值:
就看產(chǎn)生了新的數(shù)據(jù)沒(méi)有,函數(shù)里面產(chǎn)生新的值,就需要返回值。
(3)初學(xué)著怎么確定需不需要返回值:
實(shí)現(xiàn)函數(shù)的功能完成后會(huì)不會(huì)產(chǎn)生新的數(shù)據(jù)。
(4)怎么確定返回值:
聲明函數(shù)的時(shí)候哦,return后面的值就是函數(shù)的返回值。默認(rèn)值是None
(5)return 是關(guān)鍵值,只能出現(xiàn)在函數(shù)體中,
(6)return 作用:確定函數(shù)的返回值,結(jié)束函數(shù)。執(zhí)行函數(shù)體的時(shí)候,如果遇到return函數(shù)直接結(jié)束,同時(shí)將return后面的值作為返回值。
(7)實(shí)例:

def pr():
    print(111)
    print(2222)
    return #這個(gè)返回了值,函數(shù)結(jié)束,后面就不執(zhí)行了。
    print(333)

(8)怎么獲取函數(shù)的返回值:
獲取函數(shù)調(diào)用的表達(dá)式就是函數(shù)的返回值。
函數(shù)調(diào)用的語(yǔ)句就叫函數(shù)表達(dá)式。
普通數(shù)據(jù)能做的事情,函數(shù)調(diào)用表達(dá)式都是可以做的。
(9)獲取函數(shù)的返回值
函數(shù)調(diào)用的表達(dá)式可以把值賦給變量。
(10)完整的函數(shù)的調(diào)用的過(guò)程:
執(zhí)行的過(guò)程:
1.先回到函數(shù)聲明的位置,
2.傳參,保證每個(gè)參數(shù)都有值,
3.執(zhí)行函數(shù)體,
4.確定返回值:執(zhí)行完函數(shù)體后有沒(méi)有遇到return,如果遇到了后面就是返回值,沒(méi)有遇到都是None
5.回到函數(shù)調(diào)用表達(dá)式的值才是返回值。
(11)內(nèi)存的變化:函數(shù)的調(diào)用的過(guò)程中系統(tǒng)會(huì)在棧中開辟一個(gè)獨(dú)立的內(nèi)存區(qū)間,專門用來(lái)保存在函數(shù)中聲明的變量和數(shù)據(jù),形參也是保存在棧的專用區(qū)間,單函數(shù)結(jié)束的時(shí)候內(nèi)存的空間會(huì)銷毀。
銷毀之前返回,返回值。

def hanshu(a, b):
    c = a + b
    return c


value_sum = hanshu(12, 13)
print(value_sum)

def hanshu(b):
    print(b)
    return b*2
a=hanshu(3)#這個(gè)函數(shù)會(huì)調(diào)用函數(shù)這種打印3,在打印返回值6
print(a)

def hanshu(a):
    b=a
    return b

print(hanshu([12].copy()))#copy這個(gè)函數(shù)就是有返回值的,而append()是沒(méi)有返回值的。如果是.append()就沒(méi)有返回值。
print(hanshu([12].append(12)))#copy這個(gè)函數(shù)就是有返回值的,而append()是沒(méi)有返回值的。如果是.append()就沒(méi)有返回值None
函數(shù)對(duì)列表,字典,字符串進(jìn)行操作的時(shí)候,如果這個(gè)函數(shù)本身是有返回值的,那么就是有返值

二。

1.變量的作用域,變量可以使用的范圍。
2根據(jù)變量聲明后使用的。范圍不一樣,分為全局,和局部。
(1)全局變量
沒(méi)有聲明在函數(shù)中的和列中的變量都是全局變量。
作用域:從聲明開始到文件結(jié)束任何地方都是可以使用的。
聲明在函數(shù)和類外面的都是全局變量。

a = 10
for x in range(a):
    print(a)


def hanshu():
    print(a)


hanshu()
for b in range(4):  # b也是全局變量。
    pass

(2)局部變量:聲明在函數(shù)中的變量就是局部變量。
作用域:聲明開始到函數(shù)結(jié)束(形參,聲明在函數(shù)中的變量)
(3)global和nonlocal
注意:這兩個(gè)關(guān)鍵字只能用于函數(shù)體中。
1.global 用于全局
如果在外面定義一個(gè)變量,在函數(shù)更改后,使用后,再出函數(shù)使用還是原來(lái)的變量
原因是:函數(shù)中那個(gè)并沒(méi)有改變外面的而是創(chuàng)建了一個(gè)和外面那個(gè)一樣的變量。
使用:在函數(shù)中給變量賦值前加: global 變量名 (然后 換行) 變量=值
作用:在函數(shù)聲明全局變量。

a1=100

def func():
    a1=200
    print(a1)----這個(gè)打印的是200
    
func()
print(a1)---這個(gè)打印的是100
```python
a1 = 100
def func():
    global a1
    a1 = 200
    print(a1) #- ---這個(gè)時(shí)候是200


func()
print(a1) #- --這個(gè)也是200,global使用后就是全局的了。

a1 = 100


def func():
    global a1
    a1 = 200
    print(a1)  # - ---這個(gè)時(shí)候是200


func()
print(a1)  # - --這個(gè)也是200,global使用后就是全局的了。

(2)nonlocal
使用的方法:在函數(shù)中變量賦值前加:nonlocal 變量名
作用:在函數(shù)的局部中修改局部的變量的值。

def func5():
    a2=200
    def func6():
        #這里的a2必須在上層聲明過(guò)的
        # nonlocal a2
        a2=100
        print(a2)#---這個(gè)還是打印的是
    func6()
    print(a2)
func5()

def outer():
    num = 10
    def inner():
        nonlocal num   # nonlocal關(guān)鍵字聲明
        num = 100
        print(num)
    inner()
    print(num)
outer()

三。匿名函數(shù)

匿名函數(shù)還是函數(shù),除了聲明的語(yǔ)法以外其他語(yǔ)法基本都適用于匿名函數(shù)
(1)聲明匿名函數(shù)
就相當(dāng)于
lambda 參數(shù)列表 :返回值
def (參數(shù)列表):
return 返回值

(2)說(shuō)明
lambda-關(guān)鍵字,固定的寫法
--形參:參數(shù)名1,參數(shù)名2
:---不產(chǎn)生縮進(jìn)。
返回值--相當(dāng)于普通函數(shù)中的return語(yǔ)句。
(3)用處 -- 功能簡(jiǎn)單就用
匿名函數(shù)的調(diào)用和普通的沒(méi)有區(qū)別。
func1 = lambda num1, num2: num2 + num1
print(func1(12, 23))
func2 = lambda a, b, c: print(a, b, c)
fun3 = lambda *nums: sum(nums)
print(fun3(4))
注意不支持類型的說(shuō)明。
練習(xí):寫一個(gè)匿名函數(shù)判斷的是否是閏年

func5 = lambda year: (year % 400 == 0) or (year % 400 == 0 and year % 100 != 0)
print(func5(2018))

四。

聲明函數(shù)的時(shí)候調(diào)用函數(shù)本身,這樣的函數(shù)就是遞歸函數(shù)
遞歸可以使用循環(huán)的效果。
原則上除了死循環(huán),其他的循環(huán)遞歸都可以實(shí)現(xiàn)

ef func1():
    print("=========")
    func1()

func1()

2.遞歸怎么用:
"""
遞歸的套路:
a.設(shè)置臨界值--循環(huán)結(jié)束的條件(保證函數(shù)結(jié)束)

b.找關(guān)系-----找f(n)和f(n-1)的關(guān)系。
c.假設(shè)函數(shù)的功能已經(jīng)實(shí)現(xiàn),通過(guò)f(n-1)去實(shí)現(xiàn)f(n)的功能。
"""

遞歸函數(shù)計(jì)算1+2+3..100
def ytsum(n):
    if n==1:
        return 1
    # 找關(guān)系
    #用f(n-1)實(shí)現(xiàn)f(n)的功能。
    # f(n)1+2+3....100
    # f(n-1)1+2+3+....(n-1)
    return ytsum(n-1)+n
print(ytsum(900))
遞歸求斐波那契:
def fibo(n):
   """遞歸函數(shù)
   輸出斐波那契數(shù)列"""
   if n == 1 or n==2  :
       return n
   else:
       return(fibo(n-1) + fibo(n-2))
print(fibo(9))
練習(xí)
def f(n):
    if n==1:
       print("*")
       return
    #關(guān)系:實(shí)現(xiàn)f(n-1)的功能后再打印N顆星
    else:
        f(n-1)
        print(n*"*")
最后編輯于
?著作權(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ù)。

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