python 基礎(chǔ)知識(shí)第11講:函數(shù)的返回值、作用域、命名空間、遞歸、高級(jí)函數(shù)

1.函數(shù)的返回值

第一個(gè)案例:

# 求任意數(shù)的和
# 可以通過(guò)return 來(lái)指定函數(shù)的返回值
def fn(*nums):
    # 定義一個(gè)變量來(lái)保存結(jié)果
    result = 0
    # 遍歷元組 并將元組中的元素累加
    for n in nums:
        result += n
    # print(result)
    return result
r = fn(1,2,3)
print(r+6)
  • 返回值可以直接使用,也可以通過(guò)一個(gè)變量來(lái)接收函數(shù)返回值的結(jié)果。

第二個(gè)案例:

def fn():

    # return 100
    # return [1,2,3]
    # return 1+1
    def fn2():
        print('python')
    return fn2
r = fn()
r()
print(r)

  • return后面可以跟任意的對(duì)象,甚至可以是一個(gè)函數(shù)。

第三個(gè)案例:

def fn2():
    return
    a = 10
r = fn2()
print(r)
  • 如果僅僅寫一個(gè)return 或者 不寫return 則相當(dāng)于return None

第四個(gè)案例:

def fn3():
    print('hello')
    return
    print('abc')
r = fn3()
  • 在函數(shù)中 return后面的代碼都不會(huì)執(zhí)行, return 一旦執(zhí)行函數(shù)將自動(dòng)結(jié)束

第五個(gè)案例:return,break,continue 區(qū)別

def fn4():
    for i in range(5):
        if i == 3:
            #break # 用來(lái)退出當(dāng)前循環(huán)
            # continue # 用來(lái)跳過(guò)當(dāng)次循環(huán)
            return # 用來(lái)結(jié)束函數(shù)
        print(i)
    print('循環(huán)結(jié)束')
fn4()

由結(jié)果我們看出:

  • break 用來(lái)退出當(dāng)前循環(huán)
  • continue 用來(lái)跳過(guò)當(dāng)次循環(huán)
  • return 用來(lái)結(jié)束函數(shù)

第六個(gè)案例:fn 和 fn() 的 區(qū)別

def fn():
    return 10
print(fn) 
print(fn()) 

執(zhí)行結(jié)果分別是:
<function fn at 0x0000016C54C51268>
10

  • fn 是函數(shù)對(duì)象 實(shí)際上在打印函數(shù)對(duì)象
  • fn() 是在調(diào)用函數(shù) 實(shí)際上在打印fn()函數(shù)的返回值

2. 文檔字符串

  • help() 可以查詢python 函數(shù)中的用法
  • 語(yǔ)法 help(函數(shù)對(duì)象)
help(print)
def fn(a:int,b:str,c:bool) -> int:
    '''
    函數(shù)的參數(shù)
    :param a: 作用 ....
    :param b: 作用 ....
    :param c: 作用 ....
    :return: int
    '''
    return 10

help(fn)

3. 函數(shù)的作用域

作用域指的是變量生效的區(qū)域

  • 在Python中有2種作用域
  • 1 全局作用域
    全局作用域在程序執(zhí)行時(shí)創(chuàng)建,在程序結(jié)束時(shí)銷毀;
    所以函數(shù)以為的區(qū)域都是全局作用域;
    在全局作用域中定義的變量,都屬于全局變量,全局變量可以在程序匯總的任意位置訪問(wèn);
  • 2 函數(shù)作用域
    函數(shù)作用域在函數(shù)調(diào)用時(shí)創(chuàng)建,在調(diào)用結(jié)束時(shí)銷毀;
    函數(shù)每調(diào)用一次就會(huì)產(chǎn)生一個(gè)新函數(shù)的作用域;
    在函數(shù)作用域中定義的變量 都是局部變量,它只能在函數(shù)內(nèi)部被訪問(wèn);

示例代碼:

a = 20
b = 20
def fn():
    a = 10 #a定義在函數(shù)內(nèi)部,所以它的作用域就是函數(shù)內(nèi)部,函數(shù)外部是無(wú)法訪問(wèn)的
    print('函數(shù)內(nèi)部:','a =',a)

    print('函數(shù)內(nèi)部:', 'b =', b)
fn()
# print('函數(shù)外部:','a =',a)
print('函數(shù)內(nèi)部:','b =',b)

3.1 通過(guò)global 關(guān)鍵字改變變量的作用域

a = 20
def fn2():
    # 如果希望在函數(shù)內(nèi)部修改全局變量,則需要使用global關(guān)鍵字,來(lái)聲明變量
    global a # 聲明在函數(shù)內(nèi)部的使用a是全局變量,此時(shí)在去修改a時(shí),就是修改全局變量
    a = 10
    print('函數(shù)內(nèi)部:','a =',a)
fn2()
print('函數(shù)外部:','a =',a)

4.命名空間

命名空間實(shí)際上就是一個(gè)字典,是一個(gè)專門用來(lái)存儲(chǔ)變量的字典

  • 使用locals()來(lái)獲取當(dāng)前作用域的命名空間
  • 如果在全局作用域中調(diào)用locals()函數(shù)則獲取全局作用域命名空間;
    如果在函數(shù)作用域中調(diào)用locals()則獲取函數(shù)命名空間;
    locals() 返回的就是一個(gè)字典
a = 1
b = 2
c = 3
s = locals() # 獲取當(dāng)前的命名空間
print(s)
print(a)
print(s['a'])  # 就是s中一個(gè)一個(gè)的鍵值對(duì)
s['c'] = 200 #增加一個(gè)c的變量
print(s)
def fn4():
    a = 10
    s = locals() #在函數(shù)內(nèi)部調(diào)用locals()會(huì)獲取函數(shù)的命名空間
    s['b'] = 20 # 可以通過(guò)s來(lái)操作函數(shù)的命名空間,但是不建議這么做
    print(s['b'])
    print(s)
fn4()

一般不建議用這種方法來(lái)定義和操作變量

5. 遞歸

遞歸式的函數(shù)
遞歸簡(jiǎn)單理解就是自己去調(diào)用自己
遞歸式函數(shù)就是在函數(shù)中調(diào)用自己

5.1 遞歸的作用

遞歸式解決問(wèn)題的一種方式
遞歸式函數(shù)的兩個(gè)條件
1.基線條件
問(wèn)題可以被分解成最小的問(wèn)題,當(dāng)滿足基線條件時(shí),遞歸不在執(zhí)行了
2.遞歸條件
將問(wèn)題繼續(xù)分解的條件
看個(gè)例子:

def fn2(n):
    # 基線條件
    if n == 1:
        # 1的階乘是它本身
        return 1
    # 遞歸條件
    return  n * fn2(n-1)
print(fn2(10))

5.2 遞歸練習(xí)

  • 1 創(chuàng)建一個(gè)函數(shù) 來(lái)為任意數(shù)做任意冪運(yùn)算
def fn4(n,i):
    # 定義了一個(gè)函數(shù) 其中有2個(gè)參數(shù) n 要做冪運(yùn)算的數(shù)字 i 做冪運(yùn)算的次數(shù)
    # 基線條件 冪為1
    if i == 1:
        return n
    # 遞歸條件 2*2*2*2 = 16 2**4 2**3 2 ** 2
    return n * fn4(n,i-1)
print(fn4(2,4))
  • 練習(xí)二 創(chuàng)建一個(gè)函數(shù) 用來(lái)檢查任意的字符串是否是回文字符串,如果是返回True,不是返回False
# 回文字符串 字符串從后往前念和從前往后念是一樣的 abcba
# abcdefgfedcba
# 先檢查第一個(gè)字符和最后一個(gè)字符是否一致,如果不一致不是回文字符串
# 如果一致,則看剩余部分是否是回文字符串
# 檢查bcdefgfedcb 是不是回文
# 檢查cdefgfedc 是不是回文
# 檢查defgfed 是不是回文
# 檢查 efgfe是不是回文
# 檢查 fgf 是不是回文
# 檢查 g 是不是回文
def fn5(s):
    # 這個(gè)函數(shù)就是檢查任意一個(gè)字符串是否是回文
    # 參數(shù)s 就是我們要檢查的字符串
    # 基線條件
    if len(s) < 2:
        # 字符串的長(zhǎng)度小于2 則這個(gè)字符串一定是回文
        return True
    elif s[0] != s[-1]:
        # 第一個(gè)字符和最后一個(gè)字符不相等,不是回文
        return False
    # 遞歸條件
    return fn5(s[1:-1])
print(fn5('abcdefgfedcba'))

6.高級(jí)函數(shù)

特點(diǎn):
1.接收一個(gè)或多個(gè)函數(shù)作為參數(shù)
2.將函數(shù)作為返回值返回
滿足任意一個(gè)特點(diǎn)就是高級(jí)函數(shù)

def fn(func,lst):
    for n in lst:
        if func(n):
            new_list.append(n)
    # 返回新的列表
    return new_list
print(fn(fn4,l))

當(dāng)我們使用一個(gè)函數(shù)作為參數(shù)時(shí),實(shí)際上是將指定的代碼傳遞進(jìn)了目標(biāo)函數(shù),根據(jù)傳入的不同的函數(shù),就改變了實(shí)現(xiàn)的規(guī)則。

?著作權(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)容

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