一,函數的定義
1,函數mylen叫做函數名
#函數名
#必須由字母下划線數字組成,不能是關鍵字,不能是數字開頭
#函數名還是要有一定的意義能夠簡單說明函數的功能
2,def是關鍵字 (define)
3,():必須寫
4,函數體內盡量寫注釋,方便查看代碼
5,函數的調用:函數名+括號
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 def mylen(): #函數名 5 ''' 6 計算字符串長度的函數 這里寫的是注釋,方便查看代碼 7 ''' 8 s = 'hello world' 9 length = 0 10 for i in s: 11 length += 1 12 return length #函數的返回值
13 leng = mylen() #函數的調用 14 print(leng)
二,函數的返回值 return
1,函數返回值可以是任意的數據類型
2,如果有返回值:必須要用變量接收才會有效果
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 def func(): 5 b = [1,2,3] 6 return b #可以是任何數據類型 7 ret = func() #有返回值,就需要用變量來接收 8 print(ret)
3,函數可以沒有返回值,默認返回給None
函數的返回值為None有三種情況
1.不寫返回值
2.只寫一個return
3.return None (幾乎不用)
4,return的作用:結束一個函數的執行
5,函數的返回值不為None,有返回值
返回一個值(一個變量)
返回多個值(多個變量),多個值之間用逗號區分
接收:可以用一個變量接收,以元組的形式返回
也可以用多個變量接收,返回幾個就用幾個變量去接收 相當於解壓式接收
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 def func6(): 5 '''返回一個值''' 6 a =123 7 return a 8 9 def func7(): 10 '''返回多個值''' 11 a = 123 12 b = 'abc' 13 return a,b 14 15 ret = func7() 16 print(ret) 17 m,n,k = func7()
三,函數的參數
實參:函數調用的時候傳入的參數
形參:函數定義的時候括號內的參數
參數可以是任意的數據類型,可以傳送0個或者多個參數
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 def mylen(s): #參數接收:形式參數,形參 5 ''' 6 計算字符串長度的函數 ——函數的功能 7 參數s:接收要計算的字符串 ——參數的信息 8 return:要計算的字符串長度 ——返回值的信息 9 ''' 10 length = 0 11 for i in s: 12 length += 1 13 return length 14 length = mylen('hello world') #參數傳入:實際參數,實參 15 print(length)
調用時傳參數(實參)
實參,遵循 位置參數--關鍵字參數
*按照位置參數傳參:按順序定義參數
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 def my_max(a,b): #定義:位置參數 5 '''返回兩個值之間的最大值''' 6 print(a,b) 7 if a > b: 8 return a 9 else: 10 return b 11 print(my_max(10,20)) 12 print(my_max(30,20))
*按照關鍵字參數傳參:可以不按順序傳參數
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 def my_max(a,b): #定義:關鍵字參數 5 '''返回兩個值之間的最大值''' 6 print(a,b) 7 if a > b: 8 return a 9 else: 10 return b 11 print(my_max(b = 10,a = 20))
定義時候參數(形參)
形參,遵循 位置參數--默認參數
*默認參數
*不要設置可變類型的默認參數
*默認參數可以不傳,不傳用的是默認值,傳參數的話需要用關鍵字傳參,才可以覆蓋默認值
*默認值是在定義函數的時候就已經確定了的
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 def stu_info(name,sex = 'male'): #默認參數,有一個默認值 5 print('name:%s,sex:%s'%(name,sex)) 6 stu_info('alex') #默認參數可以不傳值 7 stu_info('egon','female') #如果傳值了,覆蓋默認值
關於默認參數流程
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #關於默認參數流程 5 s = 'male' 6 def stu_info(name,sex=s): #默認參數,有一個默認值 7 print('name:%s,sex:%s'%(name,sex)) 8 s = 'female' #不影響定義時sex的值 9 print(stu_info("李淑旗")) 10 #打印出來的就是male 因為開始sex=x=male,然后s是新開辟的一個空間存儲female
不要這是可變類型數據為默認參數
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #不要設置可變數據類型為默認參數 5 b = [] 6 def func(a = []): 7 a.append(1) 8 print(a) 9 # func()....打印下去你會發現這個[]列表一直在追加
動態參數
*args 接收的是實參,位置參數,將轉化成元祖返回
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #*args #按位置傳參數 5 def func(a,b,*c): #*c接收的是5,5,5,5並且輸出一個元祖包含這個4個5 *args代表把散列的元素拼成元組 6 my_sum = a+b 7 for i in c: 8 my_sum += i 9 return my_sum 10 print(func(3,2,5,5,5,5))
*kwargs 接收的是實參,關鍵字參數,將轉化成字典返回
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #**kwargs #按照關鍵字傳參數 5 def fun(a,b,**kwargs): 6 print(a,b,kwargs) 7 fun(a = 10,b = 20,cccc= 30,dddd = 50)
行參,位置順序
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #形式參數括號里面的位置順序 5 def f(a,b,*args,defult=6,**kwargs): 6 #位置參數,*args,默認參數,**kwargs 7 print(a,b,args,defult) 8 #傳參數的時候:必須先按照位置傳參數,再按照關鍵字傳參數 9 f(1,2,7,8,defult=10)
傳參時候,有時候是可變得數據類型,下面是2個方法可以將不同類型數據類型打散
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #在傳參的時候,針對列表,元祖的話,有個*t參數,避免手動傳參 5 def fun2(*args):#*args代表把散列的元素拼成元組 6 print(args) 7 t = (1,2,3,4) 8 l = [1,2,3,4] 9 # fun2(t[0],t[1],t[2],t[3]) 10 fun2(*t) #*代表把一個元組、列表拆了 11 fun2(*l) #*代表把一個元組、列表拆了 12 13 #針對字典有個**d參數,避免手動傳參 14 def fun3(**kwargs):#*args代表把按關鍵字傳來的參數拼成字典 15 print(kwargs) 16 fun3(a = 10, b = 20) 17 d = {'a': 10, 'b': 20} 18 fun3(**d) #*代表把一個字典拆了
傳參時候傳遞的是引用
# 我們之前學過字符串的format方法 msg = "{0},{1}" print(msg.format("joker","11")) print(msg.format(*["joker","11"])) msg = "{name},{age}" print(msg.format(name="joker",age="11")) print(msg.format(**{"name":"joker","age":"11"})) # 傳遞數據類型時候,其實傳遞的是引用 l = [1,2,3,4] def f1(a1): a1.append(999) f1(l) print(l) # [1, 2, 3, 4, 999] # 全局變量,通常全部大寫 name = [1,2,3,4] def f1(): global name # 直接修改 name = [111] return f1() print(name) # [111] name = [1,2,3,4] def f1(): name.append(5) # 局部不能給全局重新賦值 return f1() print(name) # [1, 2, 3, 4, 5]
相同函數名執行過程
# !/usr/bin/env python # _*_coding:utf-8_*_ # Author:Joker def f1(a1,a2): # 1 return a1 + a2 def f1(a3,a4): # 2 return a3 * a4 # 4 ret = f1(8,8) # 3 #5 print(ret) # 6 # 開始f1的空間包含指向為a1 + a2,后來變為了a3 * a4,在實參傳遞的時候,你也會發現給的是a3,a4賦值
通過126發送小郵件程序
# !/usr/bin/env python # _*_coding:utf-8_*_ # Author:Joker def sendmail(): import smtplib from email.mime.text import MIMEText from email.utils import formataddr msg = MIMEText('我正在通過PY給你發送郵件,別再睡了。','plain','utf-8') # 創建一個文本類型 msg['From'] = formataddr(['joker','jokerbj@126.com']) # 二元祖,發件人,發件地址 msg['Subject'] = "親愛的POPPY君" server = smtplib.SMTP('smtp.126.com',25) server.login('jokerbj@126.com','授權登錄密碼') # SMTP第三方授權登錄密碼 server.sendmail('jokerbj@126.com',['對方郵件地址@qq.com',],msg.as_string()) server.quit() return 1 ret = sendmail() if ret: print('email send success!')