Python函数和装饰器
生活随笔
收集整理的這篇文章主要介紹了
Python函数和装饰器
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Python函數(shù)和裝飾器
1. 函數(shù)
1.1 函數(shù)的介紹
定義:能夠?qū)崿F(xiàn)具體的某個功能""" 定義:能夠?qū)崿F(xiàn)指定功能的代碼塊例如:print('天王蓋地虎')print('小雞燉蘑菇')if 條件1:print('天王蓋地虎')print('小雞燉蘑菇') elif 條件2:print('天王蓋地虎')print('小雞燉蘑菇') elif 條件3:print('天王蓋地虎')print('小雞燉蘑菇')總結(jié):如果在開發(fā)中,某段代碼需要多次執(zhí)行,為了提高代碼的編寫效率和重復(fù)使用率, 可以把具有獨立功能的代碼塊單獨提取出來做一個封裝->函數(shù) """1.2 函數(shù)的定義和調(diào)用
1.2.1 函數(shù)的定義
函數(shù)分為:內(nèi)置函數(shù)和自定義函數(shù) 函數(shù)定義的語法格式: def 函數(shù)名():執(zhí)行代碼塊1.3 函數(shù)的調(diào)用
語法格式:函數(shù)名()1.3.1 練習(xí)
#要求:定義函數(shù),能夠完成輸出學(xué)生的姓名和年齡,并讓函數(shù)執(zhí)行 def getStuInfo(name,age): #形參 臨時占位print('我的名字是%s,今年%d'%(name,age)) #調(diào)用函數(shù) getStuInfo('李四',18) #實參 實際意義的值1.4 函數(shù)的參數(shù)
格式: def 函數(shù)名(參數(shù)1,參數(shù)2...):執(zhí)行代碼調(diào)用格式:函數(shù)名(參數(shù)1,參數(shù)2...)1.4.1 定義帶有參數(shù)的函數(shù)
#案例:求兩個數(shù)的總和def add(x,y): #x,y形參print(x+y) #調(diào)用函數(shù) add(10,5)1.4.2 練習(xí)
#定義一個函數(shù),完成前兩個數(shù)的加法運算,在對第三個數(shù)進(jìn)行減法,調(diào)用該函數(shù),完成計算并打印結(jié)果def sum(a,b,c):d = a + be = d - cprint(e) #調(diào)用函數(shù) sum(3,8,10)1.4.3 調(diào)用函數(shù)時需要注意的問題
1.形參和實參必須一一對應(yīng) 2.函數(shù)調(diào)用時參數(shù)的順序#獲取學(xué)生的姓名和年齡 def get_stu_info(name,age):print('姓名%s,年齡%d'%(name,age)) #調(diào)用函數(shù) get_stu_info('王小二',19) get_stu_info(age = 20,name='李曉紅')1.4.4 總結(jié)
形參:函數(shù)名后面的圓括號里面的東西,接受實參傳遞過來參數(shù) 實參:調(diào)用函數(shù)名后面圓括號里面的東西,傳遞參數(shù)1.5 函數(shù)的返回值return
1.5.1 函數(shù)的返回值介紹
定義:返回值:就是程序中函數(shù)完成一件事后將結(jié)果返回給調(diào)用者1.5.2 帶有返回值的函數(shù)
#求兩個數(shù)之和 def add(x,y):return x + y #調(diào)用函數(shù) print(add(10,14)) res = add(10,14) print(res)#求n個星期的天數(shù) def getWeekDay(m=7,n=2):return n * m #調(diào)用函數(shù) print(getWeekDay(2))1.6 函數(shù)的類型
1.6.1 介紹
函數(shù)根據(jù)有沒有參數(shù),有沒有返回值,可以相互組合,一共有4中 無參數(shù),無返回值 無參數(shù),有返回值 有參數(shù),無返回值 有參數(shù),有返回值1.6.2 無參數(shù),無返回值
此類函數(shù),不能接受參數(shù),也沒有返回值,一般情況下,打印提示等類似的功能,使用該類函數(shù)def print_menu():print('輸入1(求和)')print('輸入2(求差)')print('輸入3(求乘積)')print('輸入4(求商:)') #調(diào)用函數(shù) print_menu()1.6.3 無參數(shù),有返回值
此類函數(shù),不能接受參數(shù),但是可以返回某個數(shù)據(jù),一般情況,像數(shù)據(jù)采集 def getTemp():temp = 12return temp #調(diào)用函數(shù) print(getTemp())1.6.4 有參數(shù),無返回值
此類函數(shù)可以接受參數(shù),但是不可以返回數(shù)據(jù),一般情況適用于變量設(shè)置數(shù)據(jù),而不需要結(jié)果 #例如:求兩個數(shù)之和def add(a,b):print(a+b) #調(diào)用函數(shù) add(10,20)1.6.5 有參數(shù),有返回值
此類函數(shù),不僅接受參數(shù),同時可以返回某個數(shù)據(jù) #例如:求1~n之間的總和def sum(n):i = 1sum = 0 #定義一個變量接受總和while i < n:sum += ii += 1return sum #調(diào)用函數(shù) print(sum(101))1.6.7 總結(jié)
函數(shù)是否有參數(shù)和返回值,決定函數(shù)的格式(4種)1.7 函數(shù)的嵌套調(diào)用
概述:一個函數(shù)中又調(diào)用了另外一個函數(shù)-----》函數(shù)的嵌套調(diào)用函數(shù)的嵌套分為: 函數(shù)的嵌套調(diào)用和函數(shù)的嵌套定義 # def fun1(): # print('fun1') # def fun2(): # print('fun2') # def fun3(): # print('fun3') # fun3() # fun2() # #調(diào)用fun1 # fun1()#三目運算符 #比較兩個數(shù)的大小 # def max(x,y): # res = x if x > y else y # print(res) # #如果條件判斷為真,返回第一個值,或者返回第二個值 # max(100,10)def max(x,y):return x if x > y else ydef max2(a,b,c,d):res = max(a, b)res2 = max(res,c)res3 = max(res2,d)return res3 print(max2(90,10,15,1))2. 函數(shù)的參數(shù)傳遞
具體的細(xì)分:可變對象和不可變對象(值傳遞,引用傳遞)2.1 不可變對象
定義:表示該值不能發(fā)生變化#python里面那些數(shù)據(jù)類型值不能修改 #number,string,tuple #以number類型為例 # def add(num): # num = num + 10 #數(shù)字類型不可變 d本身沒變 # return num # d = 2 #定義變量,賦初始值2 # e = add(d) #把整形變量d作為函數(shù)實參傳遞 引用傳遞過去 # print(d) # print(e)def test(fun):print(id(fun)) #打印內(nèi)存地址一樣,引用了同一個內(nèi)存地址值,同一個變量 num = 10 #重新定義一個變量,內(nèi)存里面開辟新的空間print(num) temp = 20 print(id(temp)) test(temp) #把temp作為函數(shù)實參傳遞過去 傳遞過去引用2.2 可變對象
#list/dict/set #以list類型為例# def change(num): # num.append(0) # li = [] #定義一個空列表 # change(li) #把li列表作為函數(shù)實參傳遞過去 把值傳遞過去 # print(li) # # def change2(fun): # fun[2] = 100 # list = [1,3,5] #聲明了一個列表 # change2(list) #把list作為函數(shù)實參傳遞過去 把值傳遞過去 # print(list)a = 10 b = 10 b = 40 print(id(a),id(b))c = 20 d = 30 print(id(c),id(d))d = c print(id(c),id(d))def selfAdd(a):a += a #相當(dāng)于a = a + areturn a int = 1 selfAdd(int) #傳遞過去的是引用 print(int)def selfAdd2(b):b += b #b = b + breturn b ls = [1,2] selfAdd2(ls) #傳遞過去的是值 print(ls) 定義:值發(fā)生改變#可變的數(shù)據(jù)類型:list/dict/setdef change(num):num.append(0) li = [] #定義一個空列表 change(li) #把li列表作為函數(shù)實參傳遞過去 把值傳遞過去 print(li)def change2(fun):fun[2] = 100 list = [1,3,5] #聲明了一個列表 change2(list) #把list作為函數(shù)實參傳遞過去 把值傳遞過去 print(list)3 關(guān)鍵字參數(shù)
#允許函數(shù)調(diào)用時參數(shù)順序和定義時不一致 關(guān)鍵字參數(shù): **kw#案例:獲取學(xué)生的姓名,年齡等信息# def getStuInfo(name,age): # print('學(xué)生姓名%s,年齡%d'%(name,age)) # #調(diào)用函數(shù) # getStuInfo('張三豐',18) # getStuInfo(age = 20,name = '李雷') #name,age關(guān)鍵字參數(shù)def user_register(name,pwd,**kwargs):print('name=',name)print('pwd=',pwd)print('kwargs=',kwargs) #調(diào)用函數(shù) user_register('admin123',123456,email='111111@qq.com',mobile=13248301214,sex='男')#優(yōu)點:允許調(diào)用函數(shù)時比定義函數(shù)形參傳遞更多的參數(shù),簡便函數(shù)的調(diào)用 #使用場景:用戶注冊4 默認(rèn)參數(shù)(缺省參數(shù))
概述:python為了簡化函數(shù)的調(diào)用,提供默認(rèn)參數(shù)機(jī)制,調(diào)用函數(shù)時,缺省參數(shù)的值如果沒有傳入,則會被認(rèn)為是默認(rèn)值#獲取學(xué)生的登記信息 # def getStuInfo(name,sex = '男',age = 18): # print(name) # print(sex) # print(age) # #調(diào)用函數(shù) # getStuInfo('何濤') """ 默認(rèn)值一般放在形參列表后面 形參的值如果后期基本沒有變化或者有很想變化-->默認(rèn)值 """#求x的平方根 def pow(x,n = 2):r = 1while n > 0:r *= x #r = r * x = 2n -= 1return r print(pow(2))5 不定長參數(shù)
概述:一個函數(shù)能夠處理比當(dāng)初聲明時更多的參數(shù)------不定長參數(shù),聲明時一般不會命名格式: def fun(args,*args,**kwargs): args表示參數(shù)的意思 加了一個*號的變量args會存放所有未命名的變量參數(shù),----》元祖 加了**號,存放所有命名的變量參數(shù)---->字典def fun(a,b,*args,**kwargs):print(a)print(b)print(args)print(kwargs) #調(diào)用函數(shù) # fun(1,10,100,1000,10000,name='張三',age=20,sex='女')d = (9,99,999) e = {'1':'hello','2':'world'} #2.調(diào)用函數(shù) # fun(1,2,*d,**e)#3.調(diào)用方式 # fun(1,2,d,e)#4.定義方式 def fun2(*a,**b):print(a)print(b) #調(diào)用函數(shù) fun2(1,2,name='張三',age=10)#優(yōu)點:允許調(diào)用函數(shù)時比定義函數(shù)形參傳遞更多的參數(shù) #定義很靈活 #開發(fā)場景:計算器多個數(shù)相加6 匿名函數(shù)
6.1 匿名函數(shù)的概述
定義:不使用def這樣語句來定義函數(shù)使用lambda來創(chuàng)建一個匿名函數(shù)原則:用lambda關(guān)鍵字能夠創(chuàng)建小型匿名函數(shù),可以省略用def聲明函數(shù)的標(biāo)準(zhǔn)步驟 格式:lambda[args1,args2....]:expression#匿名函數(shù)的基本定義 sum = lambda args1,args2:args1 + args2 print(sum(10,20))特點: 1.lambda只是一個表達(dá)式,比函數(shù)def聲明簡單 2.lambda的主體也是一個表達(dá)式,而不是代碼塊,只能在lambda表達(dá)式中封裝簡單的邏輯 3.lambda函數(shù)有自己的命名空間,且不能訪問自由參數(shù)列表以外或者全局命名空間的參數(shù) 4. lambda函數(shù)能夠接受任何數(shù)量的參數(shù),只能返回一個表達(dá)式的值6.2 匿名函數(shù)的應(yīng)用場景
# 1.作為參數(shù)進(jìn)行傳遞 #匿名函數(shù)的應(yīng)用場景(作為參數(shù)進(jìn)行傳遞) # def fun(a,b,opt): #opt是匿名函數(shù)當(dāng)做參數(shù)傳遞 # print(a) # print(b) # print(opt(23,80)) # #調(diào)用函數(shù) # fun(1,2,lambda x,y:x+y)# 2.作為內(nèi)置函數(shù)的參數(shù) #案例:下面的數(shù)據(jù)如何排序,按照指定的name,age排序 stus = [{"name":"changsan","age":38},{"name":"bangwu","age":20},{"name":"aaowang","age":35}]#1.根據(jù)name進(jìn)行排序 stus.sort(key=lambda x:x['name']) print(stus)#2.根據(jù)age進(jìn)行排序 stus.sort(key=lambda y:y['age']) print(stus)7.偏函數(shù)(重點)
定義:函數(shù)在執(zhí)行時,要帶上所有必要的參數(shù)進(jìn)行調(diào)用。但是,有時參數(shù)可以在函數(shù)被調(diào)用之前提前獲知。這種情況下,一個函數(shù)有一個或多個參數(shù)預(yù)先就能用上,以便函數(shù)能用更少的參數(shù)進(jìn)行調(diào)用。好處:一個函數(shù)或者多個函數(shù)的參數(shù)預(yù)先就能用上,以便函數(shù)能用更少的參數(shù)進(jìn)行調(diào)用 """ 可以有效凍結(jié)一些預(yù)先定義好的參數(shù),對函數(shù)的參數(shù)做緩存,當(dāng)使用時候再解凍 比較類似前面講的斐波那契數(shù)列,知道前面幾個值,后面的值都可以推導(dǎo)出來 比如:定義一個函數(shù)傳遞3個參數(shù),但是我使用的時候可能只用部分參數(shù),其他參數(shù)暫時凍結(jié) 后面使用再隨時解凍 生活中的例子:買肉,一次吃不完,剩余的先凍起來,想吃了再隨時解凍 """ from functools import partial #求兩個數(shù)之和 def add(a,b):return a + b #調(diào)用函數(shù) # print(add(1,3)) plus = partial(add,100) #對第二個參數(shù)進(jìn)行凍結(jié),在下面plus使用 res = plus(9) # print(res) #使用場景:計算n的星期的天數(shù) """ 總結(jié):在調(diào)用add函數(shù)之前,已經(jīng)提前獲知一個參數(shù)的值,使用該參數(shù)綁定partial(add,100) 返回的是一個新的函數(shù),再重新調(diào)用 """ #好處:將函數(shù)的參數(shù)固定起來(默認(rèn)值),簡便函數(shù)的調(diào)用#案例2:求數(shù)字1010的二進(jìn)制值是多少 #print(int('1010',base = 2)) #int(參數(shù)1,參數(shù)2) 參數(shù)1字符串或者整形,默認(rèn)第二個參數(shù)不寫十進(jìn)制 # def int2(str,base): # return int(str,base) # # print(int2('1010')) # plus2 = partial(int2,base = 2) #對第二個參數(shù)進(jìn)行凍結(jié) # res = plus2('1111') # print(res)#使用場景:計算n的星期的天數(shù) def getWeekDay(n,day):return n * day a = partial(getWeekDay,7) res = a(4) print(res)8裝飾器
8.1 裝飾器的概述
定義:裝飾器本質(zhì)上就是一個python函數(shù),他可以讓其他函數(shù)在不需要做任何代碼變動的前提下,增加額外的功能,裝飾器的返回值也是一個函數(shù)對象。裝飾器的基本格式 @函數(shù)名""" 需求:初創(chuàng)公司有N個業(yè)務(wù)部門,1個基礎(chǔ)平臺部門,基礎(chǔ)平臺部門負(fù)責(zé)底層的功能如:數(shù)據(jù)庫操作,redis調(diào)用,監(jiān)控API等功能業(yè)務(wù)部門使用基礎(chǔ)功能,只需要調(diào)用基礎(chǔ)平臺的功能即可 """8.2 裝飾器的應(yīng)用場景
1.引入日志 2.函數(shù)的執(zhí)行時間統(tǒng)計 3.執(zhí)行函數(shù)前的預(yù)備處理 4.函數(shù)執(zhí)行后的清理工作 5.權(quán)限的校驗 6.緩存8.3 裝飾器的示例
from time import ctime #被修飾的裝飾器沒有參數(shù) # def timeFun(fn): #fn->foo->黑墻->wrapped->白墻 # def wrapped(): # print('%s called at %s'%(fn.__name__,ctime())) # fn() # return wrapped#被修飾的裝飾器有參數(shù) # def timeFun2(fn): # def wrapped(a,b): # print('%s called at %s' % (fn.__name__, ctime())) # fn(a,b) # return wrapped#被修飾的裝飾器帶有不定長參數(shù) # def timeFun3(fn): # def wrapped(*a,**b): # print('%s called at %s' % (fn.__name__, ctime())) # fn(*a,**b) # return wrapped#帶有返回值的裝飾器 def timeFun4(fn):def wrapped():print('%s called at %s' % (fn.__name__, ctime()))return fn()return wrapped# @timeFun #定義一個普通函數(shù) def foo():print('foo--1') #調(diào)用函數(shù) # foo() #調(diào)用裝飾器函數(shù) # f = timeFun(foo) # f()# @timeFun2 #定義普通函數(shù) def foo2(m,n):print(m+n) #調(diào)用函數(shù) # foo2(4,7)# @timeFun3 def foo3(a,b,c,d):print(a+b+c+d) #調(diào)用函數(shù) # foo3(1,4,7,9)#帶有返回值裝飾器return @timeFun4 def foo4():return 'i am foo4' #調(diào)用函數(shù) f = timeFun4(foo4) print(f())#總結(jié):裝飾器的作用:在不修改原函數(shù)代碼的前提下,給函數(shù)增加額外的功能總結(jié)
以上是生活随笔為你收集整理的Python函数和装饰器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用云服务器进行系统设置,云服务器怎
- 下一篇: python opencv 通过hsv阈