教小朋友學(xué) Python -- 函數(shù)與Lambda表達(dá)式

背景

到目前為止,我們已經(jīng)學(xué)習(xí)了以下四部分內(nèi)容:

今天,我們一起來(lái)學(xué)習(xí)第五部分的內(nèi)容:函數(shù)與 Lambda 表達(dá)式。


Python 基礎(chǔ)語(yǔ)法

<b>1. 函數(shù)</b>

<u>函數(shù)的定義</u>

  • 函數(shù)以def關(guān)鍵詞開(kāi)頭,后接函數(shù)名和圓括號(hào)()。
  • 函數(shù)執(zhí)行的代碼以冒號(hào)起始,并且縮進(jìn)。
  • return [表達(dá)式] 結(jié)束函數(shù),選擇性地返回一個(gè)值給調(diào)用方。不帶表達(dá)式的return相當(dāng)于返回None。
def functionname(parameters):
    "函數(shù)_文檔字符串"
    function_suite
    return [expression]

<u>函數(shù)的調(diào)用</u>

Sample01:

def printme(str):
    print(str)


printme("我要調(diào)用用戶自定義函數(shù)!")  # 我要調(diào)用用戶自定義函數(shù)!
printme("再次調(diào)用同一函數(shù)")  # 再次調(diào)用同一函數(shù)
temp = printme('hello') # hello
print(temp)  # None

Sample02:

def add(a, b):
    print(a + b)


add(1, 2)  # 3
add([1, 2, 3], [4, 5, 6]) # [1, 2, 3, 4, 5, 6]

<u>函數(shù)文檔</u>

def MyFirstFunction(name):
    "函數(shù)定義過(guò)程中name是形參"
    # 因?yàn)門(mén)a只是一個(gè)形式,表示占據(jù)一個(gè)參數(shù)位置
    print('傳遞進(jìn)來(lái)的{0}叫做實(shí)參,因?yàn)門(mén)a是具體的參數(shù)值!'.format(name))


MyFirstFunction('老馬的程序人生')  # 傳遞進(jìn)來(lái)的老馬的程序人生叫做實(shí)參,因?yàn)門(mén)a是具體的參數(shù)值!
print(MyFirstFunction.__doc__)  # 函數(shù)定義過(guò)程中name是形參
help(MyFirstFunction)

# Help on function MyFirstFunction in module __main__:
# MyFirstFunction(name)
#    函數(shù)定義過(guò)程中name是形參

<u>關(guān)鍵字參數(shù)</u>

  • 使用關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時(shí)參數(shù)的順序與聲明時(shí)不一致,因?yàn)?Python 解釋器能夠用參數(shù)名匹配參數(shù)值。
def printinfo(name, age):
    print('Name:{0},Age:{1}'.format(name, age))


printinfo(age=8, name='小馬')  # Name:小馬,Age:8

<u>默認(rèn)參數(shù)</u>

  • 調(diào)用函數(shù)時(shí),默認(rèn)參數(shù)的值如果沒(méi)有傳入,則被認(rèn)為是默認(rèn)值。
def printinfo(name, age=8):
    print('Name:{0},Age:{1}'.format(name, age))


printinfo('小馬')  # Name:小馬,Age:8
printinfo('小馬', 10)  # Name:小馬,Age:10

<u>不定長(zhǎng)參數(shù)</u>

def functionname([formal_args,] *var_args_tuple ):
    "函數(shù)_文檔字符串"
    function_suite
    return [expression]
  • 加了星號(hào)(*)的變量名會(huì)存放所有未命名的變量參數(shù)。
def printinfo(arg1, *vartuple):
    print(arg1)
    for var in vartuple:
        print(var)


printinfo(10)  # 10
printinfo(70, 60, 50)

# 70
# 60
# 50

<u>函數(shù)的返回值</u>

Sample01:

def add(a, b):
    return a + b


print(add(1, 2))  # 3
print(add([1, 2, 3], [4, 5, 6]))  # [1, 2, 3, 4, 5, 6]

Sample02:

def back():
    return [1, '小馬的程序人生', 3.14]


print(back())  # [1, '小馬的程序人生', 3.14]

Sample03:

def back():
    return 1, '小馬的程序人生', 3.14


print(back())  # (1, '小馬的程序人生', 3.14)

Sample04:

def printme(str):
    print(str)

temp = printme('hello') # hello
print(temp) # None
print(type(temp))  # <class 'NoneType'>

<u>變量作用域</u>

  • Python 中,程序的變量并不是在哪個(gè)位置都可以訪問(wèn)的,訪問(wèn)權(quán)限決定于這個(gè)變量是在哪里賦值的。
  • 定義在函數(shù)內(nèi)部的變量擁有局部作用域,該變量稱為局部變量。
  • 定義在函數(shù)外部的變量擁有全局作用域,該變量稱為全局變量。
  • 局部變量只能在其被聲明的函數(shù)內(nèi)部訪問(wèn),而全局變量可以在整個(gè)程序范圍內(nèi)訪問(wèn)。
def discounts(price, rate):
    final_price = price * rate
    return final_price


old_price = float(input('請(qǐng)輸入原價(jià):'))  # 98
rate = float(input('請(qǐng)輸入折扣率:'))  # 0.9
new_price = discounts(old_price, rate)
print('打折后價(jià)格是:%.2f' % new_price)  # 88.20
  • 當(dāng)內(nèi)部作用域想修改外部作用域的變量時(shí),就要用到globalnonlocal關(guān)鍵字了。
num = 1


def fun1():
    global num  # 需要使用 global 關(guān)鍵字聲明
    print(num)  # 1
    num = 123
    print(num)  # 123


fun1()
print(num)  # 123

<u>內(nèi)嵌函數(shù)</u>

def outer():
    print('outer函數(shù)在這被調(diào)用')

    def inner():
        print('inner函數(shù)在這被調(diào)用')

    inner()  # 該函數(shù)只能在outer函數(shù)內(nèi)部被調(diào)用


outer()
# outer函數(shù)在這被調(diào)用
# inner函數(shù)在這被調(diào)用

<u>閉包</u>

  • 是函數(shù)式編程的一個(gè)重要的語(yǔ)法結(jié)構(gòu),是一種特殊的內(nèi)嵌函數(shù)。
  • 如果在一個(gè)內(nèi)部函數(shù)里對(duì)外層非全局作用域的變量進(jìn)行引用,那么內(nèi)部函數(shù)就被認(rèn)為是閉包。
  • 通過(guò)閉包可以訪問(wèn)外層非全局作用域的變量,這個(gè)作用域稱為閉包作用域。
def funX(x):
    def funY(y):
        return x * y

    return funY


i = funX(8)
print(type(i))  # <class 'function'>
print(i(5))  # 40
  • 如果要修改閉包作用域中的變量則需要 nonlocal 關(guān)鍵字
def outer():
    num = 10

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

    inner()
    print(num)


outer()

# 100
# 100

<u>遞歸</u>

  • 如果一個(gè)函數(shù)在內(nèi)部調(diào)用自身本身,這個(gè)函數(shù)就是遞歸函數(shù)。

Sample01:n! = 1 x 2 x 3 x ... x n

循環(huán):

n = 5
for k in range(1, 5):
    n = n * k
print(n)  # 120

遞歸:

def factorial(n):
    if n == 1:
        return 1
    return n * fact(n - 1)


print(factorial(5)) # 120

Samp02:斐波那契數(shù)列 f(n)=f(n-1)+f(n-2), f(0)=0 f(1)=1

循環(huán):

i = 0
j = 1
lst = list([i, j])
for k in range(2, 11):
    k = i + j
    lst.append(k)
    i = j
    j = k
print(lst)  # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

遞歸:

def recur_fibo(n):
    if n <= 1:
        return n
    return recur_fibo(n - 1) + recur_fibo(n - 2)


lst = list()
for k in range(11):
    lst.append(recur_fibo(k))
print(lst)  # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
  • 設(shè)置遞歸的層數(shù),Python默認(rèn)遞歸層數(shù)為 100
import sys

sys.setrecursionlimit(1000)

<b>Lambda 表達(dá)式</b>

<u>匿名函數(shù)</u>

  • 所謂匿名,即不再使用def語(yǔ)句定義一個(gè)函數(shù)。
  • python 使用 lambda 來(lái)創(chuàng)建匿名函數(shù)。
  • lambda 只是一個(gè)表達(dá)式,函數(shù)體比def簡(jiǎn)單很多。
  • lambda 函數(shù)擁有自己的命名空間,且不能訪問(wèn)自己參數(shù)列表之外或全局命名空間里的參數(shù)。
sumary = lambda arg1, arg2: arg1 + arg2
print(sumary(10, 20))  # 30

<u>Lambda 表達(dá)式的應(yīng)用</u>

  • filter(function, iterable) 過(guò)濾序列,過(guò)濾掉不符合條件的元素,返回一個(gè)迭代器對(duì)象,如果要轉(zhuǎn)換為列表,可以使用 list() 來(lái)轉(zhuǎn)換。
odd = lambda x: x % 2 == 1
templist = filter(odd, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(templist))  # [1, 3, 5, 7, 9]
  • map(function, iterable, ...) 根據(jù)提供的函數(shù)對(duì)指定序列做映射。
m1 = map(lambda x: x ** 2, [1, 2, 3, 4, 5])
print(list(m1))  # [1, 4, 9, 16, 25]
m2 = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
print(list(m2))  # [3, 7, 11, 15, 19]

總結(jié)

好了,到此為止有關(guān)于函數(shù)和 Lambda 表達(dá)式部分就介紹完了,小朋友們要根據(jù)上面的例子多多體會(huì),只有刻意練習(xí)才能掌握一門(mén)技術(shù),沒(méi)有捷徑的,加油??!See You!


相關(guā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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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