Python入門課程系列:
- Python學(xué)習(xí) day1:認(rèn)識Python
- Python學(xué)習(xí) day2:判斷語句與循環(huán)控制
- Python學(xué)習(xí) day3:高級數(shù)據(jù)類型
函數(shù)就是最基本的一種代碼抽象的方式
1. 函數(shù)基礎(chǔ)
- 函數(shù):是一系列python語句的組合,可以在程序中運(yùn)行一次或者多次,一般是完成具體的獨(dú)立的功能。
- 使用函數(shù)的意義:最大化復(fù)用代碼以及最小化冗余代碼。
- 函數(shù)的定義:
def 函數(shù)名(參數(shù)列表):#參數(shù)可以是0-N個
函數(shù)體[一系列的python語句,表示獨(dú)立的功能] - 函數(shù)的調(diào)用:本質(zhì)上就是去執(zhí)行函數(shù)定義里面的代碼塊,在調(diào)用函數(shù)之前必須先定義

print('小李的身高是%f'%1.63)
print('小李的體重是%d'%45)
print('小李的愛好是%s'%'學(xué)習(xí)')
print('小李的專業(yè)是%s'%'計(jì)算機(jī)')
#如果需要反復(fù)打印如上信息,就可以把它包裝成函數(shù)
def printInfo(): #下面是函數(shù)的說明文檔,一般在函數(shù)第一行,敲三個單引號即可添加。
'''
這個函數(shù)是用來打印個人信息的,是對小李信息顯示的組合
:return:
''' #添加好之后按住command,將鼠標(biāo)放在函數(shù)名字上即可顯示。
print('小李的身高是%f' % 1.63)
print('小李的體重是%d' % 45)
print('小李的愛好是%s' % '學(xué)習(xí)')
print('小李的專業(yè)是%s' % '計(jì)算機(jī)')
pass
printInfo() #函數(shù)調(diào)用
printInfo() #多次調(diào)用
printInfo()
??2. 函數(shù)參數(shù)

參數(shù):其實(shí)就是函數(shù)為了實(shí)現(xiàn)某項(xiàng)特定的功能,進(jìn)而為了得到實(shí)現(xiàn)功能所需要的數(shù)據(jù)。(簡而言之:參數(shù)就是為了得到外部數(shù)據(jù)的)
重點(diǎn):
傳參 調(diào)用 不定長參數(shù)難點(diǎn): 缺省參數(shù) 不定長參數(shù)
#進(jìn)一步去完善這樣的需求【輸出不同人的信息】,方案:通過傳入?yún)?shù)來解決
def printInfo(name,height,weight,hobbit,pro): #形參
print('%s的身高是%f' %(name,height))
print('%s的體重是%d' %(name,weight))
print('%s的愛好是%s' %(name,hobbit))
print('%s的專業(yè)是%s' %(name,pro))
pass
#調(diào)用帶參數(shù)的信息
printInfo('小劉',1.64,55,'看小說','學(xué)生') #實(shí)參
參數(shù)的分類:必選參數(shù)、默認(rèn)參數(shù)[缺省參數(shù)]、可選參數(shù)、關(guān)鍵字參數(shù)
#1. 必選參數(shù)
def sum(a,b): #形式參數(shù):只是意義上的一種參數(shù),在定義的時(shí)候是不占內(nèi)存地址的
sum=a+b
print(sum)
pass
#函數(shù)調(diào)用 在調(diào)用的時(shí)候必選參數(shù)是必須要賦值的
sum(20,15) #20,15是實(shí)際參數(shù)(實(shí)參),是實(shí)際占用內(nèi)存地址的。
#2. 默認(rèn)參數(shù)【缺省參數(shù)】
def sum1(a=20,b=30): #20和30就是默認(rèn)參數(shù),后面依然可以給a和b賦值,如果不賦值,它們也有默認(rèn)值
print('默認(rèn)參數(shù)使用=%d'%(a+b))
pass
sum1()
sum1(10) #這個值只能賦給a,如果用sum1(,10)這樣的格式,會報(bào)錯。
sum1(10,10)
#3.可選參數(shù)/可變參數(shù)/不定長參數(shù) (當(dāng)參數(shù)的個數(shù)不確定時(shí)使用,比較靈活)
def getCompute(*args): #????args接受的數(shù)據(jù)是元組類型
'''
計(jì)算累加和
:param args: 可變長的參數(shù)類型
:return:
'''
result=0
for item in args:
result+=item
pass
print('result%d'%result)
pass
getCompute(1)
getCompute(1,2)
getCompute(1,2,3)
# 4. 關(guān)鍵字可變參數(shù):使用**來定義
# ????在函數(shù)體內(nèi),參數(shù)關(guān)鍵字是字典類型 key是一個字符串
def keyfunc(**kwargs):
print(kwargs)
pass
# 調(diào)用
# keyfunc(1,2,3) 這樣是不可以傳遞的,關(guān)鍵字可變參數(shù)必須是字典類型
dictA = {'name': 'leo', 'age': 35}
keyfunc(**dictA) ##直接傳遞字典參數(shù)要帶兩個**,否則報(bào)錯
keyfunc(name='peter', age=26) ##或者直接以命名參數(shù)(鍵值對)傳入
#5. 可選參數(shù)和關(guān)鍵字可變參數(shù)的復(fù)合
#????可選參數(shù)必須放在關(guān)鍵字可選參數(shù)之前,否則會報(bào)錯
def complexfunc(*args,**kwargs):
print(args)
print(kwargs)
pass
complexfunc(1,2,3,4)
complexfunc(1,2,3,4,name='susan')
complexfunc(age=36)
??3. 函數(shù)返回值
- 概念:就是程序中函數(shù)完成一件事情后,最后給調(diào)用者的結(jié)果。如果在函數(shù)內(nèi)部有return,就可以返回實(shí)際的值,否則返回None。
- 類型:返回值可以是任意類型,取決于return后面的類型
- 用途:給調(diào)用方返回?cái)?shù)據(jù)
在一個函數(shù)體內(nèi)可以出現(xiàn)多個return值 ,但是肯定只能返回一個return。如果在一個函數(shù)體內(nèi)執(zhí)行了return,意味著函數(shù)就執(zhí)行完成退出了,return后面的代碼語句將不會執(zhí)行。
如果函數(shù)需要返回多個結(jié)果,則將需要返回的值用逗號隔開,最終會返回一個包含所有返回值的元組。

#例1:
def sum(a,b):
sum=a+b
return sum #將計(jì)算的結(jié)果返回給調(diào)用方
pass
print(sum(10,30)) #函數(shù)的返回值返回到調(diào)用的地方
#40
##如果沒有return sum,返回的是None
def sum(a,b):
sum=a+b
pass
print(sum(10,30))
#None
#例2-1:
def calcompute(num):
result=0
i=1
while i<=num:
result+=i
i+=1
pass
return result
pass
#調(diào)用函數(shù)
value=calcompute(10)
print(type(value)) #type是int
print(value)
#例2-2: (??注意2-1和2-2的區(qū)別,除了list還可以返回元組等)
def calcompute(num):
li=[]
result=0
i=1
while i<=num:
result+=i
i+=1
pass
li.append(result)
return li
pass
#調(diào)用函數(shù)
value=calcompute(10)
print(type(value)) #type是list
print(value)
#例2-3:返回元組
def returnTuple():
'''
返回元組類型的數(shù)據(jù)
:return:
'''
return 1,2,3
pass
A=returnTuple()
print(type(A))
#例2-4 返回字典
def returnDict():
'''
返回字典類型的數(shù)據(jù)
:return:
'''
return{'name':'測試'}
pass
A=returnDict()
print(type(A))
- 根據(jù)函數(shù)的返回值和函數(shù)的參數(shù)可以對函數(shù)進(jìn)行分類:
1.有參數(shù)有返回值
2.有參數(shù)無返回值
3.無參數(shù)有返回值
4.無參數(shù)無返回值 - python中print和return的區(qū)別
print的作用是將數(shù)據(jù)輸出到控制端
return的作用(之一)是返回計(jì)算的值,return返回的結(jié)果不能輸出到控制臺,需要通過print才能打印出來。
仔細(xì)比較下面4個例子
#例1 直接使用print打印結(jié)果
def sum(a,b):
sum=a+b
print(sum) #直接將sum結(jié)果輸出到控制端
pass
sum(10,30)
#40
#例2 沒有return語句,所以沒能給函數(shù)sum()賦值,打印出來也就是空值(None)
def sum(a,b):
sum=a+b
pass
print(sum(10,30))
#None
#例3 雖然有return,但直接調(diào)用sum()是沒有輸出結(jié)果的
def sum(a,b):
sum=a+b
return sum
pass
sum(10,30)
#例4 通過print將return返回的結(jié)果輸出到控制臺。
def sum(a,b):
sum=a+b
return sum
pass
print(sum(10,30))
#40
4. 函數(shù)嵌套使用
函數(shù)可以嵌套調(diào)用,即在一個函數(shù)內(nèi)部調(diào)用另外一個函數(shù)。內(nèi)層函數(shù)可以訪問外層函數(shù)中定義的變量,但不能重新賦值(rebind)。
#函數(shù)嵌套
def fun1():
print('--------fun1 start--------')
print('--------執(zhí)行代碼省略---------')
print('--------fun1 end-----------')
pass
def fun2():
print('--------fun2 start--------')
#調(diào)用第一個函數(shù)
fun1()
print('--------fun2 end----------')
pass
fun2() #調(diào)用函數(shù)2
小結(jié)

課后作業(yè)
- 寫函數(shù),接收n個數(shù)字,求這些參數(shù)數(shù)字的和
- 寫函數(shù),找出傳入的列表或元組的奇數(shù),并返回一個新的列表
- 寫函數(shù),檢查傳入字典的每一個value的長度,如果大于2,那么僅保留前兩個長度的內(nèi)容,并將新內(nèi)容返回給調(diào)用者。PS:字典中的value只能是字符串或列表
答案
#題1:
#接收n個數(shù)字,求這些參數(shù)數(shù)字的和
def sum(*args):
result=0
for item in args:
result+=item
pass
return result
pass
rs=sum(1,2,3) #需要用一個變量來接收return回來的值
print(rs)
print('rs={}'.format(rs)) #format格式化輸出
#6
#rs=6
# 接收一個數(shù)字,求累加和
def sum(a):
i=1
k=0
while i <= a:
k+=i
i += 1
pass
return k
pass
print(sum(6))
#題2:
#方法1.1 #比較1.1和1.2的區(qū)別
def lis(container):
list=[]
for i in container:
if i%2==1:
list.append(i)
return list
#a=lis((11,8,3,2,15)) 和下面的寫法等價(jià)
a=lis([11,8,3,2,15]) #接受一個list或元組
print(a)
# 方法1.2
A=[]
def FindOdd(*args):
for items in args:
if items%2==0:
A.append(items)
pass
return A
b=FindOdd(1,3,4,6,8) #使用不定長參數(shù),接收一個元組
print(b)
#方法1.3 使用index取下標(biāo)
def lis(container):
list=[]
index=1
for i in container:
if i%2==1:
list.append(i)
pass
index+=1
pass
return list
a=lis([1,8,6,2,7])
print(a)
#題3:
def dictFun(dicParms):
'''
處理字典類型的數(shù)據(jù)
:param kwargs: 字典
:return:
'''
result={} #空字典
for key,value in dicParms.items(): #key-value
if len(value)>2:
result[key]=value[:2] #向字典去添加數(shù)據(jù)
pass
else:
result[key]=value
pass
pass
return result
pass
#函數(shù)調(diào)用
dictObj={'name':'hua','pro':'幼兒園班長','hobby':'畫畫'} #如果有int會報(bào)錯
print(dictFun(dictObj))
#{'name': 'hu', 'pro': '幼兒', 'hobby': '畫畫'}