python 全棧開發筆記 2
阿新 • • 發佈:2017-07-22
定義 dir 操作 lte 映射 密碼錯誤 fun 改密 dom
函數
函數式:將某功能代碼封裝到函數中,日後便無需重復編寫,僅調用函數即可
面向對象:對函數進行分類和封裝,讓開發“更快更好更強...”
函數式編程最重要的是增強代碼的重用性和可讀性
def xx(): print(‘xx‘) # 定義函數,放入內存當中,並不立即執行 #執行函數 xx() #調用函數,這時內存中的函數才開始執行,輸出XX
函數的定義主要有如下要點:
- def:表示函數的關鍵字
- 函數名:函數的名稱,日後根據函數名調用函數
- 函數體:函數中進行一系列的邏輯計算,如:發送郵件、計算出 [11,22,38,888,2]中的最大數等...
- 參數:為函數體提供數據
- 返回值:當函數執行完畢後,可以給調用者返回數據。
返回值
函數是一個功能塊,該功能到底執行成功與否,需要通過返回值來告知調用者。
參數
函數的有三中不同的參數:
- 普通參數
- 默認參數:有默認參數一定要放在後面
- 動態參數
形參,實參(默認,按照順序)
指定形參傳入實參,可以不按照順序
動態參數
#動態參數 一個星號 def f1(*a): print(a,type(a)) li=[1,2,3,4] f1(li) # 輸出 ([1, 2, 3, 4],) <class ‘tuple‘> 輸出元組會將列表當成一個元素 f1(*li) # 輸出 (1, 2, 3, 4) <class ‘tuple‘> 輸出元組會將列表的每一個元素當成元組的每一個元素f1(123) f1(123,[4,5,6],{‘k1‘:‘43n‘},(1,2,3),{1,2,3}) #可傳任意多的參數,而且還可以時不同類型的參數 #返回的是元組的類型 #動態參數 兩個星號 def f2(**a): print(a,type(a)) f2(k1=123,k2=456) #輸出 {‘k1‘: 123, ‘k2‘: 456} <class ‘dict‘> f2(k1=123,k2=456,k3=1212) #輸出 {‘k1‘: 123, ‘k2‘: 456, ‘k3‘: 1212} <class ‘dict‘> # 返回的是字典類型,默認輸出以鍵值對的形式dic={‘k1‘:123} # 也可以將字典直接傳進去 f2(**dic) # 但需要再在前面加入兩個星號,否則必須要f2(k1=dic) 形式傳入 f2(k1=dic) # 上面的兩條調用的輸出結果分別為 # {‘k1‘: 123} <class ‘dict‘> # 這樣可以避免引入額外的參數 ‘k1=‘ # {‘k1‘: {‘k1‘: 123}} <class ‘dict‘> #各種參數組合起來 def f3(p,k1=23,*a,**aa): print(p,type(p)) print(k1,type(k1)) print(a,type(a)) print(aa,type(aa)) f3(11,22,33,44,[00,55,66],k2=456,k3=000) ‘‘‘ 輸出結果為:11 <class ‘int‘> p接收 22 <class ‘int‘> 給k1傳了值,所以k1的默認值將會被改變 (33, 44, [0, 55, 66]) <class ‘tuple‘> *a 接收住 {‘k2‘: 456, ‘k3‘: 0} <class ‘dict‘> **a接收 ‘‘‘
局部變量和全局變量
在函數內部 修改和找到全局變量 要用關鍵字聲明 global(變量) ,全局變量都大寫,局部變量都小寫
lambda 表達式
f2=lambda : 123 函數的另一種表達方式 ,函數名f2就是個變量
def f3(a1,a2): return a1+a2 f3=lambda a1,a2:a1+a2 # 對於簡單的函數,用一個簡單的一句話就能表示
python 內置函數
# all() 循環參數,如果每個參數都為真,那麽all的返回值為真 print(all([True,False,True])) # 輸出False print(all([True,True,True])) #輸出True # 0,None,空值都為假的,其他都為真的 # any() 只要一個為真即為真 print(any([True,False,True])) # 輸出True #ascii(對象) 對象的類中找__repr__,獲取其返回值 # bin()二進制 hex()十六進制 oct()八進制 int ()十進制 print(int(‘0b11‘,base=2)) # 二進制轉化為十進制 print(int(‘0o11‘,base=8)) # 八進制轉化為十進制 print(int(‘0x11‘,base=16)) # 十六進制轉化為十進制 #bytes 字節 bytearray (字節列表) #chr(數字)找到數字對應ascii碼 ord(ascii碼) 找到ascii碼所對應的數字 # 例子 隨機驗證碼 import random temp=‘‘ for i in range(6): num1=random.randrange(0,4) if num1==3 or num1 == 1: red2=random.randrange(0,10) temp += str(red2) else: red1=random.randrange(65,91) c=chr(red1) temp += c print(‘驗證碼:‘,temp) # callable(f1) 判斷f1()是不是可執行的 ,是返回True #compile() 編譯 complex() 復數 dir() 查看對象的方法 # divmod() print(divmod(10,3)) # 輸出(3,1) 商和余數 # eval() exec() print(eval(‘1+3‘)) #輸出4 exec(‘for i in range(10):print(i)‘) #將字符串當成python代碼執行,沒有返回值 # filter(函數,可叠代的對象) 篩選元素 def f1(x): #篩選偶數 if x%2 == 0: return True ret=filter(f1,[11,22,33,44]) #篩選 等同於 filter(lambda x: x%2==0,[11,22,33,44]) for i in ret: print(i) #輸出 22,44 #map() 按照某種規則映射 ret=map(lambda x: x +100,[1,2,3,4]) for i in ret: print(i) # 輸出 101,102,103,104 # globals() #獲取全部的全局變量 locals()獲取全部的局部變量 #hash() 哈希值 幫助快速找到對應的值 #zip() li1=[11,22,33,44] li2=[‘a‘,‘b‘,‘c‘,‘d‘] li3=[‘A‘,‘B‘,‘C‘,‘D‘] r=zip(li1,li2,li3) for i in r: print(i)(11, ‘a‘, ‘A‘) ‘‘‘ 輸出 (22, ‘b‘, ‘B‘) (33, ‘c‘, ‘C‘) (44, ‘d‘, ‘D‘) ‘‘‘
排序
字符串和數字不能混在一起排序 ,字符串排序時,字符串中的排序順序為:數字(正常比較),字母(ascii碼),中文(轉化為16進制)
文件操作
open(文件名,模式,編碼)
1 |
文件句柄 = open ( ‘文件路徑‘ , ‘模式‘ )
|
打開文件時,需要指定文件路徑和以何等方式打開文件,打開後,即可獲取該文件句柄,日後通過此文件句柄對該文件操作。
打開文件的模式有:
- r ,只讀模式【默認】
- w,只寫模式【不可讀;不存在則創建;存在則清空內容;】
- x, 只寫模式【不可讀;不存在則創建,存在則報錯】
- a, 追加模式【不可讀; 不存在則創建;存在則只追加內容;】
"+" 表示可以同時讀寫某個文件
- r+, 讀寫【可讀,可寫】 :寫、追加時指針到最後,f.tell() 獲取指針的位置,讀,0開始讀,寫:只要讀過(不管都沒讀完),最後位置追加,如果從特定位置往後寫,需要主動seek尋找位置
- w+,寫讀【可讀,可寫】 :寫之前先清空,再寫之後就可以讀了,但需要把指針返回到最初位置f.seek(0)
- x+ ,寫讀【可讀,可寫】 :如果文件存在會報錯,這是和W+的區別
- a+, 寫讀【可讀,可寫】 : 打開的同時把指針移到最後,等待追加,f.seek(0)返回到起始位置
"b"表示以字節的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
註:以b方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型
truncate() #截取文件內容,依賴於指針的位置 flush # 將內存的數據刷進硬盤中
f1=open(‘text.txt‘,‘r‘) for line in f1: # 一行一行讀直到讀完 print(line) f1.close # 每次打開都要close一次 with open(‘text.txt‘,‘r‘) as f: # 自動幫你close() f.read() #同時打開兩個文件,讀一行寫一行,內存的消耗將會降低 with open(‘text.txt‘,‘r‘) as f2,open(‘text1.txt‘,‘w‘) as f3: for line in f2: f3.write(line)
冒泡排序
li=[1,123,43,56,78,90,23,34589,234] inp=1 while(inp<len(li)): for i in range(len(li)-inp): if li[i] < li[i+1]: temp=li[i] li[i]=li[i+1] li[i+1]=temp inp += 1 print(li)
例子:用戶登錄
def login(username,password): ‘‘‘ 用於用戶名密碼的驗證 username 用戶名 password 用戶名密碼 返回值:True表示登陸成功 返回值: False 表示登錄失敗 ‘‘‘ with open(‘text.txt‘,‘r‘) as f: for line in f: line=line.strip() #默認strip無參數,移除空格、換行符 #有參數,移除兩端指定的值 line_list=line.split(‘$‘) if username == line_list[0] and password == line_list[1]: return True return False def register(username,password): if user_exist(username): return False else: with open(‘text.txt‘,‘a+‘) as f: user_list=‘\n‘+username+‘$‘+password f.write(user_list) return True def user_exist(username): with open(‘text.txt‘,‘r‘) as f: for line in f: line=line.strip() line_list=line.split(‘$‘) if username == line_list[0]: return True return False def user_modif(username,new_password): for i in new_password: if i == ‘@‘ or i == ‘#‘ or i==‘$‘: print(‘[email protected]#、$‘) return False with open(‘text.txt‘,‘r‘) as f1: lines=f1.readlines() with open(‘text.txt‘,‘w‘) as f2: for line in lines: line_list=line.split(‘$‘) if username == line_list[0]: new_line=line_list[0]+‘$‘+new_password+‘\n‘ f2.write(new_line) else: f2.write(line) return True def user_del(username): with open(‘text.txt‘,‘r‘) as f1: lines=f1.readlines() with open(‘text.txt‘,‘w‘) as f2: for line in lines: line_list=line.split(‘$‘) if username == line_list[0]: continue else: f2.write(line) return True #print(inp) while(True): print(‘歡迎登陸幸福之門系統\n‘) inp=input(‘1:登陸,2:註冊,3:修改密碼,4:註銷賬戶,5:退出\n‘) if inp == ‘1‘: user=input(‘請輸入用戶名:‘) pwd=input(‘請輸入密碼:‘) if login(user,pwd): print(‘登陸成功!‘) else: print(‘登錄失敗!‘) elif inp == ‘2‘: user=input(‘請輸入用戶名:‘) pwd=input(‘請輸入密碼:‘) if register(user,pwd): print(‘註冊成功!‘) else: print(‘註冊失敗!‘) elif inp == ‘3‘: user=input(‘請輸入你想修改密碼得用戶名:‘) password=input(‘請輸入原來賬戶名得密碼‘) if login(user,password): new_password=input(‘請輸入新的密碼‘) if new_password == password: print(‘你輸入得密碼和原密碼相同不用修改!‘) else: if user_modif(user,new_password): print(‘修改成功!‘) else: print(‘修改失敗!‘) else: print(‘輸入密碼錯誤無法修改!‘) elif inp == ‘4‘: user=input(‘請輸入你想註銷得用戶名:‘) password=input(‘請輸入賬戶名密碼‘) if login(user,password): if user_del(user): print(‘註銷成功!‘) else: print(‘註銷失敗!‘) else: print(‘輸入密碼錯誤無法註銷!‘) elif inp == ‘5‘: break
遞歸
#函數當作參數傳遞 def f1(): return ‘F1‘ def f2(arg): print(arg()) # 相當於執行f1(),輸出 F1 return ‘F2‘ f2(f1) # f1代指函數,相當於一個變量,是變量就可以當作參數進行傳遞,f1()執行函數 # 函數名可以當作參數傳遞 函數名 代指函數內容
裝飾器
讓函數在執行之前或執行之後做一些操作,只要函數應用上裝飾器,那麽函數將會被重新定義,重新定義為裝飾器的內層函數。
單層裝飾器不帶參數
# 單層不加參數得裝飾器 def outer(func): def inner(): print(‘Hello‘) print(‘Hello‘) print(‘Hello‘) print(‘Hello‘) r=func() # 原來的f1的函數= func,func()=f1(),r=null(沒有返回值) print(‘End‘) print(‘End‘) print(‘End‘) print(‘End‘) return r return inner # 1.執行outer函數,並且將其下面的函數名,當作參數傳進去 @outer #2. 將outer的返回值重新賦值給新的f1,新的f1=outer的返回值 ,新的f1=inner def f1(): # 新的f1()=inner() print(‘F1‘) @outer def f2(): print(‘F2‘) @outer def f3(): print(‘F3‘) f1() #相當於執行 inner(),原來不加裝飾器得f1()調用時只會輸出F1,加過裝飾器之後得f1() #輸出得結果為 ‘‘‘ Hello Hello Hello F1 End End End End ‘‘‘ #就相當於在不改變原函數得情況下,給原函數附加一些功能
帶參數的裝飾器(可傳任意多的參數,適用多層)
# 帶參數的裝飾器(可傳任意多的參數,適用多層) def outer(func): def inner(*args,**kwargs):# 可接受任意多、任意形式的參數 print(‘Hello‘) #print(args) r=func(*args,**kwargs) # 接收上面inner()中的參數 #print(kwargs) print(‘End‘) #python內部的優化,自動幫你判斷f1函數所需要的參數,無需自己提取 return r return inner # 1.執行outer函數,並且將其下面的函數名,當作參數傳進去 @outer #2. 將outer的返回值重新賦值給新的f1,新的f1=outer的返回值 ,新的f1=inner def f1(a): # 新的f1()=inner() print(‘F1‘) print(a) f1(1) # 同樣一個裝飾既適用一個參數的,也適用多個參數的 @outer def f2(a,b,c): print(a+b+c) f2(1,2,3)
多層的裝飾器
# 多層的裝飾器 def outer1(func): def inner(*args,**kwargs): print(‘Hello1‘) r=func(*args,**kwargs) print(‘End1‘) return r return inner #相當於在第一個裝飾上又裝飾了一下 def outer2(func): def inner(*args,**kwargs): print(‘Hello2‘) r=func(*args,**kwargs) print(‘End2‘) return r return inner @outer1 #(在第一個裝飾器外面又裝飾了一些東西) # 1.執行outer1函數,並且將其下面的函數名(outer2中的內層函數inner),當作參數傳到outer1中 @outer2 #(內部第一個裝飾器) #2. 將outer的返回值重新賦值給(outer2中的內層函數inner) def f1(a,b): print(‘F1‘) print(a+b) f1(1,1) #內部裝飾器裝飾的結果為 ‘‘‘ Hello2 F1 外面多了一層 Hello2 End2 2 End2 ‘‘‘ #加上外部裝飾器裝飾的結果為 ‘‘‘ Hello1 外面多了一層 Hello1 End1 Hello2 F1 2 End2 End1 ‘‘‘
python 全棧開發筆記 2