1 . 函數(shù)的概念
如果在開發(fā)程序時漱办,某塊代碼需要多次調(diào)用或者復(fù)用性高,為了提高編寫的效率以及代碼的重用婉烟,把具有獨立功能的代碼塊組織為一個小模塊娩井,這就是函數(shù)
2 . 函數(shù)的定義和調(diào)用
- 定義函數(shù)的格式:
//使用def定義函數(shù)
def 函數(shù)名():
代碼
demo:
def print_triangle():
print("*")
print("*"*2)
print("*"*3)
print("*"*4)
- 函數(shù)的調(diào)用格式:
函數(shù)名()
demo:
//定義完函數(shù)后,函數(shù)是不會自動執(zhí)行的似袁,需要手動調(diào)用
print_triangle()
3 . 函數(shù)的類型
3.1 無參數(shù)洞辣,無返回值
使用場景:打印提示類似的功能
def test():
print("====")
test() #調(diào)用之后便會打印====
3.2 無參數(shù),有返回值的函數(shù)
使用場景:保存數(shù)據(jù)
def getsum():
return 100
temp = getsum()
print("當前數(shù)值為:%d"%(temp)) #當前數(shù)值為:100
3.3有參數(shù)昙衅,無返回值
使用場景:以需求為主
//定義帶有參數(shù)的函數(shù)
def test(a,b):
print("%d"%(a + b))
#調(diào)用帶有參數(shù)的函數(shù)(調(diào)用時扬霜,需要在小括號中,傳遞數(shù)據(jù))
test(11,123) #134
3.4 有參數(shù)而涉,有返回值
使用場景:像數(shù)據(jù)處理并需要結(jié)果的應(yīng)用
** 就是程序中函數(shù)完成一件事情后著瓶,最后給調(diào)用者的結(jié)果**
demo1:
#定義函數(shù)
def sum(a,b):
return a + b
#調(diào)用函數(shù),順便保存函數(shù)的返回值,再打印
print("sum = %d"%(sum(11,11))) #sum = 22
demo2:求和以及求平均值
def sumNum(num):
result = 0
i = 1
while i<= num:
result = result + i
i+=1
return result
r = sumNum(100)
print("1-50的和為:%d"%(r)) #1-50的和為:5050
def sum3Num(a,b,c):
return a +b + c
def aveeage3Num(a,b,c):
sumResult = sum3Num(a,b,c)
result = sumResult /3
return result
r = aveeage3Num(11,12,13)
print("三個數(shù)的平均值:%d"%(r)) #三個數(shù)的平均值:12
函數(shù)的嵌套使用(打印5行-----)
- 笨方式demo
def print_line():
print("-"*5)
def print_5_line():
print("-" * 5)
print("-" * 5)
print("-" * 5)
print("-" * 5)
print("-" * 5)
print_5_line()
- 優(yōu)雅方式
def print_line():
print("-"*5)
def print_5_line():
i= 0
while i < 5:
print_line()
i += 1
print_5_line()
** 小總結(jié) **
- 定義時小括號中的參數(shù)啼县,用來接收參數(shù)用的材原,稱為 “形參”
- 調(diào)用時小括號中的參數(shù),用來傳遞給函數(shù)用的季眷,稱為 “實參”
4. 局部變量與全局變量
4.1 局部變量
- 局部變量:定義在函數(shù)內(nèi)部的變量
- 部變量的作用:臨時保存數(shù)據(jù)需要在函數(shù)中定義變量來進行存儲
- 不同的函數(shù)余蟹,可以定義相同的名字的局部變量,但是各用個的不會產(chǎn)生影響
4.2 全局變量
在函數(shù)外邊定義的變量
全局變量能夠在所有的函數(shù)中進行訪問
如果在函數(shù)中修改全局變量瘟裸,那么就需要使用global進行聲明客叉,否則出錯
如果全局變量的名字和局部變量的名字相同,那么使用的是局部變量的话告,小技巧強龍不壓地頭蛇
在函數(shù)中不使用global聲明全局變量時不能修改全局變量的本質(zhì)是不能修改全局變量的指向兼搏,即不能將全局變量指向新的數(shù)據(jù)。
對于不可變類型的全局變量來說沙郭,因其指向的數(shù)據(jù)不能修改佛呻,所以不使用global時無法修改全局變量。
對于可變類型的全局變量來說病线,因其指向的數(shù)據(jù)可以修改吓著,所以不使用global時也可修改全局變量。
demo
aa = 10
def test1():
print(aa)
def test2():
print(aa)
test1()
test2()
運行結(jié)果:
10
10
** 修改全局變量**
aa = 10
def test1():
aa = 100
print('test1修改前:aa = %d'%(aa))
global aa
aa = 111
print('test1修改后:aa = %d' % (aa))
def test2():
print('test2:aa = %d' % (aa))
test1()
test2()
打印結(jié)果:
5. 遞歸函數(shù)
5.1 什么是遞歸函數(shù)
如果一個函數(shù)在內(nèi)部不調(diào)用其它的函數(shù)送挑,而是自己本身的話绑莺,這個函數(shù)就是遞歸函數(shù)。
- 計算階乘n! = 1 * 2 * 3 * ... * n
方式一(使用while方式):
def sumNumber(num):
i = 1
result = 1
while i<= num:
result *=i
i+=1
return result
result = sumNumber(4)
print(result)
階乘的規(guī)律
1! = 1
2! = 2 × 1 = 2 × 1!
3! = 3 × 2 × 1 = 3 × 2!
4! = 4 × 3 × 2 × 1 = 4 × 3!
...
n! = n × (n-1)!
方式二(使用遞歸方式):
def sumNumber1(num):
if num >1:
result = num * sumNumber1(num -1)
else:
result = 1
return result
result1 = sumNumber1(4)
print(result1) #24
6. 匿名函數(shù)
6.1 什么是匿名函數(shù)
用
lambda
關(guān)鍵詞能創(chuàng)建小型匿名函數(shù),這種函數(shù)省略了用def聲明函數(shù)的標準步驟lambda
函數(shù)能接收任何數(shù)量的參數(shù)但只能返回一個表達式的值匿名函數(shù)不能直接調(diào)用print惕耕,因為
lambda
需要一個表達式
6.2語法
lambda [arg1 [,arg2,.....argn]]:expression
6.3 demo
#函數(shù)作為參數(shù)傳遞
def fun(a,b,c):
print("a= %d"%a)
print("a= %d" %b)
print("result = %d"%c(a,b))
f = fun(5,2,lambda x,y:x+y)
#作為內(nèi)置函數(shù)的參數(shù)
student = [
{"name":"zhangsan", "age":18},
{"name":"lisi", "age":19},
{"name":"wangwu", "age":17}
]
# 按name排序:
student.sort(key = lambda x:x['name'])
print(student)
# 按age排序:
student.sort(key = lambda x:x['age'])
print(student)
打印結(jié)果:
7. 函數(shù)使用注意事項
7.1 自定義函數(shù)
- 無參數(shù)纺裁、無返回值
def 函數(shù)名():
語句
- 無參數(shù)、有返回值
def 函數(shù)名():
語句
return 需要返回的數(shù)值
注意:
一個函數(shù)到底有沒有返回值,就看有沒有return欺缘,因為只有return才可以返回數(shù)據(jù)栋豫。
在開發(fā)中往往根據(jù)需求來設(shè)計函數(shù)需不需要返回值。
函數(shù)中谚殊,可以有多個return語句丧鸯,但是只要執(zhí)行到一個return語句,那么就意味著這個函數(shù)的調(diào)用完成嫩絮。
- 有參數(shù)丛肢、無返回值
def 函數(shù)名(形參列表):
語句
注意:
在調(diào)用函數(shù)時,如果需要把一些數(shù)據(jù)一起傳遞過去絮记,被調(diào)用函數(shù)就需要用參數(shù)來接收
參數(shù)列表中變量的個數(shù)根據(jù)實際傳遞的數(shù)據(jù)的多少來確定
- 有參數(shù)摔踱、有返回值
def 函數(shù)名(形參列表):
語句
return 需要返回的數(shù)值
7.2 調(diào)用函數(shù)
- 格式
函數(shù)名(實參)
- 調(diào)用時,到底寫不寫 實參
- 如果在定義時有形參怨愤,那么在調(diào)用的時候就應(yīng)該傳遞參數(shù)
- 調(diào)用時,實參的個數(shù)和先后順序應(yīng)該和定義函數(shù)中要求的一致
- 如果調(diào)用的函數(shù)有返回值蛹批,那么就可以用一個變量來進行保存這個值
7.3 作用域
- 局部變量:在一個函數(shù)中定義的變量撰洗,只能在本函數(shù)中用
- 全局變量:在函數(shù)外定義的變量,可以在所有的函數(shù)中使用