背景
到目前為止,我們已經(jīng)學(xué)習(xí)了以下四部分內(nèi)容:
- 教小朋友學(xué) Python -- 變量、運(yùn)算符與數(shù)據(jù)類型
- 教小朋友學(xué) Python -- 條件與循環(huán)
- 教小朋友學(xué) Python -- 列表與元組
- 教小朋友學(xué) Python -- 字符串與序列
今天,我們一起來(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í),就要用到
global和nonlocal關(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)圖文:
- 資料分享:數(shù)學(xué)建模資料分享 -- 圖論部分
- 資料分享:數(shù)學(xué)建模資料分享 -- 神經(jīng)網(wǎng)絡(luò)部分
- 如何利用 C# 實(shí)現(xiàn) K 最鄰近算法?
- 如何利用 C# 實(shí)現(xiàn) K-D Tree 結(jié)構(gòu)?
- 如何利用 C# + KDTree 實(shí)現(xiàn) K 最鄰近算法?
- 如何利用 C# 對(duì)神經(jīng)網(wǎng)絡(luò)模型進(jìn)行抽象?
- 如何利用 C# 實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的感知器模型?
- 如何利用 C# 實(shí)現(xiàn) Delta 學(xué)習(xí)規(guī)則?
- 如何利用 C# 實(shí)現(xiàn) 誤差反向傳播 學(xué)習(xí)規(guī)則?
- 如何利用 C# 爬取帶 Token 驗(yàn)證的網(wǎng)站數(shù)據(jù)?
- 如何利用 C# 向 Access 數(shù)據(jù)庫(kù)插入大量數(shù)據(jù)?
- 如何利用 C# + Python 破解貓眼電影的反爬蟲(chóng)機(jī)制?