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