day8-函數返回值、作用域,遞歸函數

1、函數的返回值

python 中每個函數都有返回值。

a.有return:return后面的值

b.沒有return:返回值為None

注:python中每個函數調用表達式的都是有值

return:關鍵字
作用:

a.將return后面的值,返回給函數調用表達式

b.結束函數

函數的調用:

a. 先回到函數調用的位置
b. 用實參給形參賦值(傳參)
c. 執(zhí)行函數體
d. 執(zhí)行完函數體,將返回值返回給函數調用表達式
c. 回到函數調用的位置

練習:寫一個函數,求1+2+3+...+N,和不能大于10000

def my_sum2():
    sum1 = 0
    number = 1
    while True:
        if sum1 + number >= 10000:
            return sum1, number-1
            # python中函數可以有多個返回值,在return后面返回多個值,每個值之間用逗號隔開。返回值是一個元祖
        sum1 += number
        number += 1


print(my_sum2())

2、作用域

作用域:一個變量可以使用的范圍,就是這個變量的作用域(函數和類可以影響變量的作用域)

全局變量: 從聲明開始,到文件結束都可以使用

局部變量: 在函數(類)中聲明的變量是局部變量。作用域是從聲明開始到函數結束

global: 在函數中聲明一個全局變量

格式:
global 變量名
變量名 = 值

練習:聲明一個變量,統(tǒng)計一個函數調用的次數

count = 0

def my_func():
    global count
    count += 1
    print('====')

my_func()
my_func()
print('0----')
a = 10
my_func()
print(count)

輸出:====
====
0----
====
3

nonlocal:在函數中聲明函數的時候,才需要使用

def func11():
    a_11 = 10
    print('外部:', a_11)

    # python中函數里面可以聲明函數
    def func12():
        nonlocal a_11  # 使用nonlocal修飾后的變量還是局部變量
        a_11 = 100
        print('內部:', a_11)
        print('內部函數')

    func12()
    print('外部:', a_11)

輸出:
外部: 10
內部: 100
內部函數
外部: 100

3、匿名函數

匿名函數:本質是函數,以另外一種簡單的方式來聲明

匿名函數的聲明:
函數名 = lambda 參數列表:返回值 ---> 結果是一個函數變量

lambda:關鍵字

寫一個函數計算兩個數的和

my_sum2 = lambda x, y=10: x+y

print(my_sum2(10, 20))

輸出:30

調用函數表達式才會執(zhí)行函數體

for i in range(5):
    funcs.append(lambda x: x*i)

"""
i = (0, 1, 2, 3, 4)
i = 0
[lambda x:x*i,lambda x:x*i,lambda x:x*i,lambda x:x*i,lambda x:x*i]
"""

# 4? 8?
# 6? 10?
# lambda 2:2*4
print(funcs[2](2))
print(funcs[4](2))
print(i)

輸出:8
8
4

4、函數作為變量

聲明一個函數就是在聲明一個變量。
函數名可以當成變量來使用。類型是:function
可以打印,可以賦值,可以查看類型,可以作為函數的參數,可以作為函數的返回值。

函數名func1可以當成變量使用

def func1(a):
    print(a)
    return 10

print(func1, type(func1))

輸出:<function func1 at 0x0074BAE0> <class 'function'>

python中三目運算符(?:)
值1 if 表達式 else 值2 ---> 判斷表達式是否為True,為True整個表達式的結果是'值1',否則是'值2'

5.遞歸函數

1.什么是遞歸

遞歸函數:在函數的函數體中調用函數本身

理論上循環(huán)能做的事情,遞歸都可以

對遞歸的要求: 能不用就不用
函數調用的過程是一個壓棧的過程(沒調用一次函數,系統(tǒng)都要為其分配內存空間,
用來存儲函數中聲明變量和參數等,這個內存在函數調用結束后會自動銷毀)

2.怎么寫一個遞歸函數

a.找臨界值(跳出循環(huán) -> return)
b.找關系:假設當前函數對應的功能已經實現(xiàn),找到f(n)和f(n-1)的關系
c.使用f(n-1)與前面找到關系去實現(xiàn)f(n)的功能

寫一個遞歸函數實現(xiàn):1+2+3+...n

def my_sum2(n):
    # 1.找到臨界值
    if n == 1:
        return 1
    # 2.找my_sum2(n)和my_sum2(n-1)的關系:
    """
    my_sum2(n): 1+2+3+...+n-1+n
    my_sum2(n-1): 1+2+3+...+n-1
    關系: my_sum2(n) = my_sum2(n-1)+n
    """
    # 3.使用my_sum2(n-1)去實現(xiàn)my_sum2(n)的功能
    return my_sum2(n-1)+n

print(my_sum2(5))
"""
my_sum2(5)
my_sum2(5) n = 5   return 1+2+3+4+5
my_sum2(4) n = 4   return 1+2+3+4
my_sum2(3) n = 3   return 1+2+3
my_sum2(2) n = 2   return 1+2
my_sum2(1) n = 1   return 1
"""

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容