Python開發【第三篇】:Python函數


set

    無序,不重復,可嵌套。

函數

    創建函數:

    1、def關鍵字,創建函數

    2、函數名

    3、()

    4、函數體

    5、返回值

發郵件函數

  1. def sendmail():
  2.     import smtplib
  3.     from email.mime.text import MIMEText
  4.     from email.utils import formataddr
  5.     #三個參數:第一個為文本內容,第二個 plain 設置文本格式,第三個 utf-8 設置編碼
  6.     msg = MIMEText('郵件內容','plain','utf-8')
  7.     msg['From'] = formataddr(["發件人名稱",'發件人郵箱'])
  8.     msg['To'] = formataddr(["哈哈",'收件人郵箱'])
  9.     msg['Subject'] = "郵件主題"
  10.    
  11.     server = smtplib.SMTP("smtp地址",端口)
  12.     #需要在開啟SMTP,否則發送失敗
  13.     server.login("發件人郵箱","密碼")
  14.     server.sendmail('發件人郵箱',['收件人郵箱'],msg.as_string())
  15.     server.quit()
  16. sendmail()

函數中的return

  1. def f1():
  2.     print(123)
  3.     #在函數中,一旦執行return,函數執行過程立即終止
  4.     return "111"
  5.     print(456)
  6.    
  7. r = f1()
  8. print(r)

函數的默認返回值None

  1. def f2():
  2.     print(123)
  3.    
  4. r = f2()
  5. print(r)

普通參數

  1. #形參【形式參數】:xx
  2. def sendmail(xx,content):
  3.     import smtplib
  4.     from email.mime.text import MIMEText
  5.     from email.utils import formataddr
  6.     #捕獲異常
  7.     try:
  8.         msg = MIMEText(content,'plain','utf-8')
  9.         msg['From'] = formataddr(["Golden",'發件人地址'])
  10.         msg['To'] = formataddr(["哈哈",'收件人地址'])
  11.         msg['Subject'] = "主題"
  12.    
  13.         server = smtplib.SMTP("smtp.126.com",25)
  14.         server.login('發件人地址','密碼')
  15.         server.sendmail('發件人地址',[xx],msg.as_string())
  16.         server.quit()
  17.     except:
  18.         #發送失敗
  19.         return False
  20.     else:
  21.         #發送成功
  22.         return True
  23.    
  24. #實際參數:收件人1\收件人2
  25. # ret = sendmail("收件人1")
  26. # ret = sendmail("收件人2")
  27.    
  28. while True:
  29.     em = input("請輸入收件人郵箱地址:")
  30.     result = sendmail(em,"你好")
  31.     if result == True:
  32.         print("發送成功")
  33.     else:
  34.         print("發送失敗")

默認參數

  1. def send(xx,content,hh="ok"):
  2.     print(xx,content,hh)
  3.     print("發送郵件成功:",xx,content)
  4.     return True
  5.    
  6. send("hahaha",'hello')
  7. send("hahaha",'hello','bbbb')

注意:如果需要給某個參數指定默認值,該參數必須放在參數列表的最后。

指定參數

  1. def send(xx,content):
  2.     print(xx,content)
  3.     return True
  4.    
  5. send("hahaha","hello")
  6. send(content="hahaha",xx="hello")

動態參數:*

  1. def f1(*args):
  2.     print(args,type(args))
  3.    
  4. f1(11,22,33,"haha","hello")
  5.    
  6. li = [12,23,33,"hahaha","hi"]
  7. f1(li)
  8. f1(*li)

注意:*默認將傳入的參數全部放置在元組中,f1(*li)。

動態參數:字典(**)

  1. def f1(**args):
  2.     print(args,type(args))
  3.    
  4. f1(n1="alex",kk=18)
  5. dic = {'k1':'v1','k2':'v2'}
  6. f1(**dic)

注意:**默認將傳入的參數全部放置在字典中,f1(**dic)。

萬能參數

  1. def f1(*args,**kwargs):
  2.     print(args)
  3.     print(kwargs)
  4.    
  5. f1(11,22,33,44,k1='v1',k2='v2')

注意:*args,**kwargs順序不能改變。

動態參數實現format功能

  1. s = "i am {0},age {1}".format("alex",18)
  2. print(s)
  3.    
  4. s1 = "i am {0},age {1}".format(*["alex",19])
  5. print(s1)
  6.    
  7. s2 = "i am {name},age {age}".format(age=20,name='alex')
  8. print(s2)
  9.    
  10. dic ={'name':'alex','age':21}
  11. s3 = "i am {name},age {age}".format(**dic)
  12. print(s3)

猜一猜輸出

  1. def f1(a1,a2):
  2.     print('+')
  3.     return a1 + a2
  4.    
  5. def f1(a1,a2):
  6.     print('*')
  7.     return a1 * a2
  8.    
  9. ret = f1(8,8)
  10. print(ret)

   

  1. def f1(a1):
  2.     a1.append(999)
  3.    
  4. li = [11,22,33,44]
  5. f1(li)
  6.    
  7. print(li)

注意:函數參數傳遞的是引用。

全局變量

  1. NAME = "alex"
  2. AGE = 22
  3.    
  4. def f1():
  5.     num = 18
  6.     NAME = "haha"
  7.     #修改全局變量:age
  8.     global AGE
  9.     AGE = 25
  10.     print(num,AGE,NAME)
  11.    
  12. def f2():
  13.     num = 19
  14.     print(num,AGE,NAME)
  15.    
  16. f1()
  17. f2()

注意:全局變量重新賦值需要用global,對於列表或字典,可修改,不可重新賦值。定義全局變量全部大寫。

函數實現登錄與注冊

  1. def login(username,password):
  2.     """
  3.     用於用戶登錄
  4.     :param username: 用戶輸入的用戶名
  5.     :param password: 用戶輸入的密碼
  6.     :return:True,登錄成功;False,登錄失敗
  7.     """
  8.     f = open("db",'r')
  9.     #逐行讀取
  10.     for line in f:
  11.         #用"|"進行分割
  12.         line_list = line.strip().split("|")
  13.         #匹配是否正確
  14.         if line_list[0] == username and line_list[1] == password:
  15.             return True
  16.     return False
  17.    
  18.    
  19. def register(username,password):
  20.     """
  21.     用戶注冊
  22.     :param username:用戶名
  23.     :param password:密碼
  24.     :return:默認返回None
  25.     """
  26.    
  27.     f = open("db",'a')
  28.     temp = "\n"+username + "|" + password
  29.     f.write(temp)
  30.     f.close()
  31.    
  32.    
  33. def main():
  34.     t = input("1:登錄;2:注冊")
  35.     if t == "1":
  36.         user = input("請輸入用戶名:")
  37.         pwd = input("請輸入密碼:")
  38.         r = login(user,pwd)
  39.         if r:
  40.             print("登錄成功")
  41.         else:
  42.             print("登錄失敗")
  43.     elif t == "2":
  44.         user = input("請輸入用戶名:")
  45.         pwd = input("請輸入密碼:")
  46.         register(user,pwd)
  47.    
  48. main()

三元運算(三目運算)

  1. if 1 == 1:
  2.     name = "alex"
  3. else:
  4.     name = "golden"
  5.    
  6. #上面代碼等價於
  7. name = "alex" if 1 == 1 else "golden"

lambda表達式

  1. def f1(a1):
  2.     return a1 + 100
  3.    
  4. #等價上面的代碼
  5. f2 = lambda a1:a1 + 100
  6.    
  7. ret = f1(10)
  8. print(ret)
  9.    
  10. r2 = f2(9)
  11. print(r2)

內置函數

  1. #abs():取絕對值
  2. n = abs(-1)
  3. print (n)
  4.    
  5. #all():所有為真,才為真
  6. #any():任何一個為真,就是真
  7. n = all([1,2,3,4,[]])
  8. print(n)
  9.    
  10. n2 = any([1,[],0,"",None])
  11. print(n2)
  12.    
  13. #ascii():自動執行對象的 _repr_方法
  14. class Foo:
  15.     def _repr_(self):
  16.         return "111"
  17. n = ascii(Foo())
  18. print(n)
  19.    
  20. #bin():轉二進制
  21. #oct():轉八進制
  22. #hex():轉十六進制
  23. print(bin(5))
  24. print(oct(9))
  25. print(hex(15))
  26.    
  27. #utf-8 一個漢字:三個字節
  28. #gbk 一個漢字:二個字節
  29.    
  30. #utf-8,一個字節八位,一個漢字三個字節
  31. s = "李傑"
  32. #字符串轉換字節類型
  33. #bytes(需要轉換的字符串,按照什么編碼)
  34. n = bytes(s,encoding="utf-8")
  35. print(n)
  36. n = bytes(s,encoding="gbk")
  37. print(n)
  38.    
  39. #字節轉化成字符串
  40. new_str = str(bytes("李傑",encoding="utf-8"),encoding="utf-8")
  41.    
  42. #1、打開文件
  43. #只讀
  44. f = open('db','r')
  45. #只寫,先清空源文件
  46. f = open('db','w')
  47. #文件存在,報錯;不存在,創建並寫內容
  48. f = open('db','x')
  49. #追加
  50. f = open('db','a')
  51. #2、操作文件
  52. #通過源碼查看功能
  53. f.read()
  54. f.write()
  55.    
  56. #3、關閉文件
  57. f.close()
  58. with open('db') as f:
  59.     pass
  60.    
  61. f = open('db','r',encoding="GBK")
  62. #f = open('db','r',encoding="utf-8")
  63. data = f.read()
  64. print(data,type(data))
  65. f.close()
  66.    
  67. f = open("db","r+",encoding="utf-8")
  68. #如果打開模式無b,則read,按照字符讀取
  69. data = f.read()
  70. #獲取當前指針的位置(字節)
  71. print(f.tell())
  72. print(data)
  73. #移動當前指針到固定位置(字節)
  74. f.seek(1)
  75. #當前指針位置開始向后覆蓋
  76. f.write("777")
  77. f.close()
  78.    
  79. f = open('db','rb')
  80. data = f.read()
  81. print(data,type(data))
  82.    
  83. f = open('db','ab')
  84. f.write(bytes("李傑",encoding="utf-8"))
  85. f.close()

flush()強刷:

  1. f = open("db",'a')
  2. f.write("123")
  3. #強制寫入
  4. f.flush()
  5. input("adsdds")

readable()查看文件是否可讀,返回True或False。

  1. f = open("db",'w')
  2. print(f.readable())

readline()僅讀取一行數據,當文件特別大的時候不至於導致內存撐爆。

  1. f = open("db",'r')
  2. f.readline()
  3. f.readline()

truncate()截斷,指針后面的數據清空

  1. f = open("db",'r+',encoding="utf-8")
  2. f.seek(3)
  3. f.truncate()
  4. f.close()

for循環打開的文件對象:

  1. f = open("db",'r')
  2. for line in f:
  3.     print(line)
  4. f.close()

將文件1的前十行寫入文件2:

  1. with open('db1','r',encoding="utf-8") as f1,open('db2','w',encoding="utf-8") as f2:
  2.     times = 0
  3.     for line in f1:
  4.         times += 1
  5.         if times <= 10:
  6.             f2.write(line)
  7.         else:
  8.             break

將文件的某個字符串進行替換:

  1. with open('db1','r',encoding="utf-8") as f1,open("db2",'w',encoding="utf-8") as f2:
  2.     for line in f1:
  3.         new_str = line.replace("alex","st")
  4.         f2.write(new_str)

callable()查看函數是否可以被調用,返回True或False

  1. def f1():
  2.     pass
  3. f1()
  4.    
  5. f2 = 123
  6.    
  7. print(callable(f1))
  8. print(callable(f2))

chr()與ord()

  1. r = chr(65)
  2. n = ord("B")
  3. print(r,n)

產生1個隨機大寫字母:

  1. import random
  2. i = random.randrange(65,91)
  3. print(chr(i))

產生6個隨機大寫字母:

  1. import random
  2. li = []
  3. for i in range(6):
  4.     temp = random.randrange(65,91)
  5.     c = chr(temp)
  6.     li.append(c)
  7. result = "".join(li)
  8. print(result)

隨機產生字母加數字:

  1. import random
  2. li = []
  3. for i in range(6):
  4.     r = random.randrange(0,6)
  5.     if r == 2 or r == 4:
  6.         num = random.randrange(0,10)
  7.         li.append(str(num))
  8.     else:
  9.         temp = random.randrange(65,91)
  10.         c = chr(temp)
  11.         li.append(c)
  12. result = "".join(li)
  13. print(result)

compile():將字符串編譯成python代碼

exec():執行python代碼或字符串,無返回值

eval():執行表達式,有返回值

  1. s = "print(123)"
  2. #先編譯,single、eval、exec
  3. #將字符串編譯成python代碼
  4. r = compile(s,"<string>","exec")
  5. print(r)
  6. #然后執行
  7. exec(r)
  8.    
  9. s = "8*8"
  10. ret = eval(s)
  11. print(ret)

dir()快速查看對象提供了哪些功能

  1. print(dir(dict))

divmod()計算商和余數

  1. r = divmod(97,10)
  2. print(r)

isinstance()判斷對象是否是某個類的實例

  1. s = [11,22,33]
  2. r = isinstance(s,list)
  3. print(r)

filter():函數返回True,將元素添加到結果中

map():將函數返回值添加到結果中

將列表中大於22的數輸出

  1. def f1(args):
  2.     result = []
  3.     for item in args:
  4.         if item > 22:
  5.             result.append(item)
  6.     return result
  7.    
  8. li = [11,22,33,44,55,66,78]
  9. ret = f1(li)
  10. print(ret)

filter()實現

  1. #filter(函數,可迭代的對象)
  2. def f2(a):
  3.     if a > 22:
  4.         return True
  5.    
  6. li = [11,22,33,44,55,66,78]
  7. #filter內部會循環第二個參數,將每個循環元素執行第一個函數,如果函數返回值是True,就添加到ret中
  8. ret = filter(f2,li)
  9. print(list(ret))

filter()+lambda實現

  1. li = [11,22,33,44,55,66,78]
  2. ret = filter(lambda a : a > 22,li)
  3. print(list(ret))

將列表中每個元素加100

  1. def f1(args):
  2.     result = []
  3.     for i in args:
  4.         result.append(i+100)
  5.     return result
  6.    
  7. li = [11,22,33,44,55,66,78]
  8. r = f1(li)
  9. print(list(r))

map()實現

  1. #map(函數,可迭代的對象)
  2. def f2(a):
  3.     return a + 100
  4.    
  5. li = [11,22,33,44,55,66,78]
  6. result = map(f2,li)
  7. print(list(result))

map()+lambda實現

  1. li = [11,22,33,44,55,66,78]
  2. result = map(lambda a : a + 100,li)
  3. print(list(result))

hash():生成hash值

  1. s = "hhhh"
  2. print(hash(s))

max():返回最大值

min():返回最小值

sum():返回和

pow():指數計算

  1. r = pow(2,10)
  2. print(r)

reverse():反轉

round():四舍五入

sorted():排序

zip()

  1. #獲取字符串 s = "alex_is_good_guy"
  2. l1 = ["alex",22,33,44,55]
  3. l2 = ["is",22,33,44,55]
  4. l3 = ["good",22,33,44,55]
  5. l4 = ["guy",22,33,44,55]
  6.    
  7. r = zip(l1,l2,l3,l4)
  8. temp = list(r)[0]
  9. ret = '_'.join(temp)
  10. print(ret)

裝飾器

s1:

  1. def outer():
  2.     print("log")
  3.    
  4. def f1():
  5.     outer()
  6.     print("F1")
  7. def f2():
  8.     outer()
  9.     print("F2")
  10.    
  11. def f100():
  12.     outer()
  13.     print("F100")

b1:

  1. import s1
  2.    
  3. s2.f1()
  4. s2.f2()
  5. s2.f100()

裝飾器實現

s1:

  1. def outer(func):
  2.     def inner():
  3.         print("log")
  4.         return func()
  5.     return inner
  6.    
  7. @outer
  8. def f1():
  9.     print("f1")
  10.    
  11. @outer
  12. def f2():
  13.     print("f2")
  14.    
  15. @outer
  16. def f100():
  17.     print("f100")

b1:

  1. import s1
  2.    
  3. s2.f1()
  4. s2.f2()
  5. s2.f100()

在調用函數前后輸出內容

  1. def outer(func):
  2.     def inner():
  3.         print("log")
  4.         ret = func()
  5.         print("after")
  6.         return ret
  7.     return inner

求輸出內容:

一:

  1. def f1():
  2.     print("123")
  3.    
  4. def f2(xxx):
  5.     xxx()
  6.    
  7. f2(f1)

二:

  1. def f1():
  2.     print("123")
  3.    
  4. def f1():
  5.     print("234")
  6.    
  7. f1()

傳參一:

s1:

  1. def outer(func):
  2.     def inner(a):
  3.         print("log")
  4.         ret = func(a)
  5.         print("after")
  6.         return ret
  7.     return inner
  8.    
  9. @outer
  10. def f1(arg):
  11.     print(arg)
  12.     return "砍你"

b1:

  1. import s:1
  2.    
  3. s2.f1("hahahaha")

參數二:

s1:

  1. def outer(func):
  2.     def inner(*args,**kwargs):
  3.         print("log")
  4.         ret = func(*args,**kwargs)
  5.         print("after")
  6.         return ret
  7.     return inner
  8.    
  9. @outer
  10. def f1(arg):
  11.     print(arg)
  12.     return "砍你"
  13.    
  14. @outer
  15. def f2(arg1,arg2):
  16.     print(arg1,arg2)
  17.     print("f2")

b1:

  1. import s1
  2.    
  3. s2.f1("hahahaha")
  4.    
  5. s2.f2("111","222")

查詢字符串是否包含子字符串:

  1. #in方法
  2. str = "hsaoiuo kkaoioweioew"
  3. if "iowe" in str:
  4.     print("存在")
  5. else:
  6.     print("不存在")
  7.    
  8. #fand方法
  9. str = "hsaoiuo kkaoioweioew"
  10. if str.find("iowe") == -1:
  11.     print("不存在")
  12. else:
  13.     print("存在")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM