1鸠蚪、函數(shù)的概念
- 函數(shù)就是對實現(xiàn)某一特定功能的代碼段的封裝 (類似于機器)
2、函數(shù)的分類(誰定義的)
系統(tǒng)函數(shù) - 系統(tǒng)已經(jīng)定義了,程序可以直接使用的函數(shù)茅信;比如:print盾舌、input、type蘸鲸、ord妖谴、chr、len等等酌摇。
自定義函數(shù) - 程序員自己定義使用的函數(shù)膝舅。
一、函數(shù)的參數(shù)
- 位置參數(shù)和關(guān)鍵字參數(shù)(實參分類)
1窑多、位置參數(shù)
實參直接寫(直接將多個數(shù)據(jù)用逗號隔開)仍稀,讓實參和形參從位置上一一對應(yīng)
def func1(a, b, c):
print(f'a:{a}, b:, c:{c}')
2埂息、 關(guān)鍵字參數(shù)
以:形參名1=值1,形參名2=值2,.... 的形式傳參
func1(a=20, b=30, c=40)
3技潘、位置參數(shù)和關(guān)鍵字參數(shù)混合
要求: 位置參數(shù)必須在關(guān)鍵字參數(shù)的前面
func1(10, c=30, b=20) # a:10, b:20, c:30
func1(10, 20, c=30) # a:10, b:20, c:30
# func1(a=10, 20, 30) # SyntaxError: positional argument follows keyword argument
4、參數(shù)默認值(形參)
定義函數(shù)的時候可以以: 形參名=值 的形式給參數(shù)賦默認值, 調(diào)用函數(shù)的時候有默認值的參數(shù)可以不用傳參
注意:
沒有默認值的參數(shù)必須放在有默認值參數(shù)的前面
5千康、不定長參數(shù)(定義)
定義參數(shù)的時候參數(shù)個數(shù)不確定就可以使用不定長參數(shù)
- 在形參前加 *
帶一個*的形參享幽,本質(zhì)就是一個元組,對應(yīng)的實參會作為這個元組的元素拾弃。
這種不定長參數(shù)的函數(shù)只能用位置參數(shù)
傳參
- 在形參前加 **
帶兩個*的形參值桩,本質(zhì)就是一個字典,對應(yīng)的實參會作為這個字典的值砸彬。
這種不定長參數(shù)的函數(shù)只能用關(guān)鍵字
參數(shù)傳參
# 例子:定義一個函數(shù)可以求多個數(shù)的和
def yt_sum(*num):
sum1 = 0
for x in num:
sum1 += x
print(sum1)
yt_sum(10, 20)
yt_sum(1, 2, 3, 4, 5)
# 在形參前加 **
def yt_sum2(**num):
print(num)
yt_sum2(a=10, b=20)
二颠毙、函數(shù)的返回值
- 返回值是從函數(shù)里面?zhèn)鬟f到函數(shù)外面的數(shù)據(jù),return 關(guān)鍵字后面的表達式的值砂碉。
- return - 關(guān)鍵字蛀蜜,只能出現(xiàn)在函數(shù)體中
? a.將數(shù)據(jù)從函數(shù)內(nèi)容扔到函數(shù)的外部
? b. 結(jié)束函數(shù)(執(zhí)行函數(shù)的時候只要遇到return函數(shù)直接結(jié)束
- 表達式 :可以一個都沒有(相當于 None),可以有一個(返回值就是指定數(shù)據(jù))增蹭,也可以有多個(本質(zhì)返回的是一個元組)
注意:
如果一個函數(shù)中沒有return(或者執(zhí)行函數(shù)體的時候沒有遇到 return)那么這個函數(shù)的返回值就是 None
三滴某、全局變量和局部變量
函數(shù)調(diào)用過程中內(nèi)存的變化
:每次在調(diào)用函數(shù)的時候,系統(tǒng)會自動為這個函數(shù)創(chuàng)建一個獨立的棧區(qū)間滋迈,用來保存函數(shù)運行過程中產(chǎn)生的數(shù)據(jù)(函數(shù)的參數(shù)霎奢;函數(shù)中聲明的變量);當函數(shù)調(diào)用結(jié)束后這個棧區(qū)間會自動銷毀饼灿。(壓棧)
1幕侠、全局變量
- 沒有定義在函數(shù)里面或者類里面的變量就是全局變量
- 作用域:從定義開始到程序結(jié)束的任何位置都可以使用
a = 10
print(a)
# 變量a、b碍彭、c都是全局變量
for b in range(5):
c = 10
print('b循環(huán)中', b, c)
print('b循環(huán)外:', b, c)
2晤硕、局部變量
- 定義在
函數(shù)中
的變量就是局部變量(形參是局部變量悼潭,注意:定義函數(shù)的時候給形參賦的默認值其實是保存在堆里面的)(類里面的變量叫屬性) - 作用域:從定義開始到函數(shù)結(jié)束的任何位置都可以使用
def func3():
# 變量x是局部變量
x = 100
print(x)
for _ in range(3):
print('x2:', x)
3. global 和 nonlocal
1) global:
-
在函數(shù)中聲明指定的變量是全局變量作用:
a. 在函數(shù)中修改全局變量的值
b. 在函數(shù)中定義一個全局變量
注意:
聲明必須放在使用變量前
name = '張三'
def change():
# 在函數(shù)中修改全局變量name的值
global name
print(name)
name = '李四'
# 在函數(shù)中定義全局變量 age
global age
age = 18
change()
print(name)
print(age)
2、nonlocal(了解)
如果希望在局部的局部中去修改局部變量的值舞箍,就可以用 nonlocal 進行說明
def func4():
m = 100
def func5():
nonlocal m
m = 200
print('m1:', m)
func5()
print('m2:', m)
func4()
四舰褪、匿名函數(shù)
函數(shù)名 = lambda 形參列表:返回值
# 定義一個匿名函數(shù)求兩個數(shù)的和
x = lambda num1, num2: num1+num2
# 調(diào)用匿名函數(shù)
print(x(100, 200))
#寫一個匿名函數(shù)用來判斷指定的年齡是否成年般婆,根據(jù)情況返回成年或未成年
is_adult = lambda age: '成年' if age >= 18 else '未成年'
print(is_adult(87))
五串稀、遞歸函數(shù)
- 在函數(shù)內(nèi)調(diào)用函數(shù)本身的函數(shù)就是遞歸函數(shù)(自己調(diào)用自己)
- 循環(huán)能做的事情遞歸都可以做(能用循環(huán)最好不用遞歸属提,因為每調(diào)用一次函數(shù)就會開辟一個內(nèi)存存儲新的數(shù)據(jù))
# 2.用遞歸計算斐波那契數(shù)列第20個數(shù):1馅闽,1,2武鲁,3故源,5隙咸,8立砸,13掖疮,21,34颗祝,...
def series(n):
# 1.找臨界值
if n == 1 or n == 2:
return 1
return series(n-1) + series(n-2)
print(series(20))