第二十四節,自定義函數
函數是將要實現的功能寫在函數裏,在要使用此功能的地方調用此函數便可實現功能,這樣大大減小編程重複書寫一樣的代碼,在多個要使用一樣功能的地方調用函數便可不須要重複寫一樣的代碼
函數式編程最重要的是加強代碼的重用性和可讀性python
函數的定義主要有以下要點:編程
def:表示函數的關鍵字
函數名:函數的名稱,往後根據函數名調用函數
函數體:函數中進行一系列的邏輯計算,如:發送郵件、計算出 [11,22,38,888,2]中的最大數等...
參數:爲函數體提供數據
return:返回值:當函數執行完畢後,能夠給調用者返回數據。函數式編程
1,定義函數,調用函數函數
函數須要先定義函數功能,而後在要使用此函數更能的地方調用韓式ui
2.自定義函數寫好後,函數名加()表示執行函數,函數名不加()號表示指向函數spa
定義函數無參code
無參就是不往函數裏傳參數,通常用固定死了的一個功能函數orm
#!/usr/bin/env python # -*- coding:utf-8 -*- #定義函數無參 def huo(): a = 3 + 2 + 5 print(a) #調用函數 huo() #輸出 10
定義函數有參server
有參就是要往函數裏傳參數進去使用,能夠傳一個參數,或者多個參數blog
書寫格式是:在定義函數裏面,寫上形式參數來接收實際參數,(形式參數至關於變量),在調用函數裏寫上實際參數來指向定義函數裏的形式參數
實際參數和形式參數的對應順序是從第一個位置對等順序,因此有幾個形式參數,就要傳幾個實際參數
傳入的實際參數能夠是數字,字符串,列表,字典等任意類型
#!/usr/bin/env python # -*- coding:utf-8 -*- #定義函數有參 #接收調用函數裏的實際參數 def huo(b,c,d): #用接收到的實際參數來進行運算 a = b + c + d print(a) #調用函數 #在調用函數裏傳入實際參數 huo(1,2,3) #輸出 6
注意:若是在調用函數的時候,傳值的實際參數和定義函數形的式參數,不從第一個順序對應,也就是想自定義對應順序,就必須在調用函數裏傳入形式參數=實際參數
#!/usr/bin/env python # -*- coding:utf-8 -*- #!/usr/bin/env python # -*- coding:utf-8 -*- #定義函數有參 #接收調用函數裏的實際參數 def huo(b,c,d): #用接收到的實際參數來進行運算 a = b + c + d print(a) #調用函數 #在調用函數裏傳入實際參數 huo(d = 1,b = 2,c = 3) #輸出 6
定義函數有參(默認值)
就是在定義函數裏的形式參數=一個默認值(實際參數)的,當調用函數的時候若是傳值了就會替換默認值,若是沒傳值就是默認值
注意:若是有默認值的形式參數必定要放在最後的位置,不然會出錯
# -*- coding:utf-8 -*- #定義函數有參 #接收調用函數裏的實際參數 #b有默認值=2 def huo(c,d,b=2): #用接收到的實際參數來進行運算 a = b + c + d print(a) #調用函數 #在調用函數裏傳入實際參數 #默認參數沒傳值 huo(d = 1,c = 3) #輸出 6
定義函數(關鍵字return)
return:返回值:當函數執行完畢後,能夠給調用者返回數據。
注意:在程序執行自定義函數的時候只要遇到return,函數裏面下面的代碼不在執行了
舉例1
返回函數裏的運算結果
#!/usr/bin/env python # -*- coding:utf-8 -*- #定義函數有參 #接收調用函數裏的實際參數 def huo(b,c,d): #用接收到的實際參數來進行運算 a = b + c + d #返回函數裏的結果 return a #調用函數 #在調用函數裏傳入實際參數 print(huo(1,2,3))#將函數返回結果打印出來 #輸出 6
舉例2
#!/usr/bin/env python # -*- coding:utf-8 -*- #定義函數有參 #接收調用函數裏的實際參數 def huo(b,c,d): #用接收到的實際參數來進行運算 a = b + c + d #返回函數裏的結果 return a #調用函數 #在調用函數裏傳入實際參數 sou = huo(1,2,3)#將函數返回結果賦值給一個變量 #將函數返回結果打印出來 print(sou) #輸出 6
檢查運行自定義函數時裏面是否有錯
try:獲取代碼是否有錯
except:若是代碼有錯執行這裏面的
#!/usr/bin/env python # -*- coding:utf-8 -*- def shi(a,b): #獲取代碼是否有錯誤(注意若是使用了這個就不會顯示紅字的錯誤信息) try: a = a + c print(a) #若是代碼有錯就執行except裏面的 except: #自定義錯誤提示 print("文件3.py,自定義函數錯誤,行號3") shi(1,2) #返回錯誤提示
示例:自定義函數傳參發送郵件
代碼說明
""" import smtplib from email.mime.text import MIMEText from email.utils import formataddr #郵件內容 msg = MIMEText('郵件內容', 'plain', 'utf-8') #發件人名稱和發件人郵箱 msg['From'] = formataddr(["玉秀文化傳播",'15284816568@163.com']) #收件人名稱和收件人郵箱 msg['To'] = formataddr(["林貴秀",'729088188@qq.com']) #郵件主題 msg['Subject'] = "主題" #發件郵箱smtp設置 server = smtplib.SMTP("smtp.163.com", 25) #發件人郵箱和登錄密碼設置 server.login("15284816568@163.com", "adc8868") #發件人郵箱,收件人郵箱 server.sendmail('15284816568@163.com', ['729088188@qq.com',], msg.as_string()) server.quit() """
示例:
#!/usr/bin/env python # -*- coding:utf-8 -*- #發件人信息 a = "15284816568@163.com"#發件人郵箱 b = "玉秀文化傳播有限公司"#發件人名稱 c = "adc8868"#發件人郵箱密碼 #收件人信息 d = "729088188@qq.com"#收件人郵箱 e = "林貴秀"#收件人名稱 #郵件信息 f = "玉秀文化傳播有限公司招聘函"#郵件主題 g = "您好!感謝您參加我公司的招聘,咱們很榮幸的通知您,您以被我公司錄取,請及時參加公司培訓" #自定義函數 def you_xiang(a,b,c,d,e,f,g): import smtplib from email.mime.text import MIMEText from email.utils import formataddr #郵件內容 msg = MIMEText(g, 'plain', 'utf-8') #發件人名稱和發件人郵箱 msg['From'] = formataddr([b,a]) #收件人名稱和收件人郵箱 msg['To'] = formataddr([e,d]) #郵件主題 msg['Subject'] = f #發件郵箱smtp設置 server = smtplib.SMTP("smtp.163.com", 25) #發件人郵箱和登錄密碼設置 server.login(a, c) #發件人郵箱,收件人郵箱 server.sendmail(a, [d,], msg.as_string()) server.quit() #調用函數 you_xiang(a,b,c,d,e,f,g)
自定義函數(動態參數)一個*元組類型 非約束參數名稱 *args
在自定義函數的時候形式參數加上一個*號
調用函數的時候就能夠傳入多過實際參數,傳入的實際參數會自動組成元組元素
#!/usr/bin/env python # -*- coding:utf-8 -*- #定義動態參數函數,一個星* def f1(*a): print(a) #調用函數 f1(123,456,789) #輸出 (123, 456, 789)
自定義函數(動態參數)兩個**字典類型 非約束參數名稱 *kwargs
在自定義函數的時候形式參數加上兩個**號
調用函數的時候就能夠傳入多過實際參數,注意:傳入的實際參數必須是鍵值對,傳入的實際參數會自動組成字典元素
#!/usr/bin/env python # -*- coding:utf-8 -*- #定義動態參數函數,兩個* def f1(**a): print(a) #調用函數 f1(k1=123,k2=456,k3=789) #輸出 {'k1': 123, 'k3': 789, 'k2': 456}
自定義函數(兩種動態參數和普通參數的結合應用)普通型,元組型,字典型 (萬能參數)
注意:若是是結合應用,普通型寫在第一位,一個*元組型寫在第二位,兩個**字典型寫在最後
說明:
第一個形式參數是普通參數,因此第一個傳入實際參數會自動賦值給第一個形式參數
第二個形式參數是*b一個星元組類型,因此後面的字符會自動組合成元組賦值給第二個形式參數,鍵值對除外
第三個形式參數是**c兩個星字典類型,因此鍵值對會自動組合成字典賦值給第三個形式參數
#!/usr/bin/env python # -*- coding:utf-8 -*- #定義動態參數函數的結合應用 def f1(a, *b, **c): print(a) print(b) print(c) #調用函數 f1(111,123,456,789,k1=123,k2=456,k3=789) #輸出結果 #111 #(123, 456, 789) #{'k3': 789, 'k1': 123, 'k2': 456}
將函數傳入的列表元素轉換成元組元素
其餘集合類型同理(字典除外)
# -*- coding:utf-8 -*- #將函數的傳入的列表元素轉換成元組元素 #定義函數 def f1(*args): print(args) a = [123,456,789] #調用函數普通傳值,會把這個列表總體轉換成元組的一個元素,如([123, 456, 789],) f1(a) #調用函數加一個*傳值,會把這個列表的每一個元素轉換成元組的元素,如(123, 456, 789) f1(*a) #輸出結果 #([123, 456, 789],) #(123, 456, 789)
將函數傳入的字典元素轉換成字典元素
#!/usr/bin/env python # -*- coding:utf-8 -*- #將函數的傳入的字典元素轉換成字典元素 #定義函數 def f1(**kwargs): print(kwargs) a = {"k1": 123, "k2": 456,"k3": 789} #調用函數加兩個**傳值,會把這個字典的每一個元素轉換成字典的元素,如{'k1': 123, 'k2': 456, 'k3': 789} f1(**a) #輸出結果 #{'k1': 123, 'k2': 456, 'k3': 789}
全局變量和局部變量
全局變量能夠在局部裏使用,局部變量不能夠在全局使用
全局變量:就是在函數外設置的變量,是在整個文件代碼中可使用的
局部變量:就是定義函數裏面設置的變量,只能在定義函數內部使用,要想整個文件代碼中可使用就必須轉換成全局變量
#!/usr/bin/env python # -*- coding:utf-8 -*- def f1(a,b): #將c變量轉換成全局變量 global c c = a + b print(c) f1(5,6) #將轉換成全局變量的c加11 a1 = c + 11 print(a1) #最後輸出 #11 #22
lambda 表達式建立簡單的函數
建立方式:函數名稱(有點像變量名稱),lambda(表達式關鍵字),形式參數,:功能模塊
#!/usr/bin/env python # -*- coding:utf-8 -*- #lambda 表達式 #lambda 表達式建立簡單的函數 #建立方式:函數名稱(有點像變量名稱),lambda(表達式關鍵字),形式參數,:功能模塊 """列1""" f1 = lambda a,b:a + b #lambda 表達式定義函數 f2 = f1 (1,2) #調用函數 print(f2) """列2""" av = lambda a:a #lambda 表達式定義函數 av1 = av("你好") #調用函數 print(av1)