小數據、文件操作及函數
小數據
小數據池:為了節省內存空間。
is、 == 和id
== :數值的比較
is :內存地址的比較
id 查看內存地址
int -5~256
str 有特殊字符不存在小數據池。
單個字符*int(20) 以內 有小數據池。
編碼
英文:
str: 表現形式: s = ‘alex‘
內部編碼方式:unicode
bytes:表現形式: s = b‘alex‘
內部編碼方式:非unicode(utf-8,gbk...)
中文:
str: 表現形式: s = ‘中國‘
內部編碼方式:unicode
bytes:表現形式: s = b‘\xe2\xe2\xe2\xe2\xe2\xe2\‘
內部編碼方式:非unicode(utf-8,gbk...)
str---> bytes s.encode(‘gbk‘) s.encode(‘utf-8‘) 編碼
bytes ---> str s.decode(‘gbk‘) s.decode(‘utf-8‘) 解碼
1 s = ‘fdsagsadfsad方式打開家樂福;按時fdsafdsa‘ 2 #ip地址 端口等等 3 s1 = input(‘你好‘) 4 s1 5 s = ‘laonanhaiView Code‘ 6 s1 = b‘laonanhai‘ 7 print(type(s)) 8 print(type(s1))
1 s = ‘alex‘ # str 2 s1 = s.encode(‘utf-8‘) # bytes 3 # encode 編碼 :str --- > bytes 4 s = ‘hello girl‘ 5 s1 = s.encode(‘utf-8‘) 6 print(s1) 7 8 s = ‘hello girl‘ 9 s1 = s.encode(‘gbk‘) 10 print(s1) 11 s = ‘中國‘ 12 s1 = s.encode(‘View Codeutf-8‘) 13 print(s1) 14 15 s = ‘中國‘ 16 s1 = s.encode(‘gbk‘) 17 print(s1)
賦值與copy
對於賦值運算,指向的是同一個內存地址。字典,列表,集合都一樣。
l1 = [1,2,3] l2 = l1 l2.append(111) # print(l1,l2) print(id(l1)) print(id(l2)) s = 1000 s1 = s print(id(s)) print(id(s1))
copy 不是指向一個,在內存中開辟了一個內存空間對於淺copy來說,第一層創建的是新的內存地址,而從第二層開始,指向的都是同一個內存地址,所以,對於第二層以及更深的層數來說,保持一致性。
l1 = [1,2,3] l2 = l1.copy() l1.append(111) print(id(l1),id(l2)) l1 = [1,2,[1,2,3,[22,33,44]],4] l2 = l1.copy() l1[2].append(666) print(l1) print(l2) print(id(l1)) print(id(l2))
對於深copy來說,兩個是完全獨立的,改變任意一個的任何元素(無論多少層),另一個絕對不改變.
1 import copy 2 l1 = [1, 2, [1, 2, 3], 4] 3 l2 = copy.deepcopy(l1) 4 l1[2].append(666) 5 print(l1,l2) 6 l2 = copy.deepcopy(l1) 7 l1[2].append(666) 8 print(l1) 9 print(id(l1[2]),id(l2[2])) 10 l1 = [1,2,3] 11 l2 = l1 12 l2.append(111) 13 print(l1,l2) 14 15 l1 = [1,2,3,[22,33]] 16 l2 = copy.deepcopy(l1) 17 print(l2) 18 l2 = l1[:] 19 l1[3].append(666) 20 print(l2) # [1, 2, 3, [22, 33, 666]] 21 22 l1 = [1,2,3,] 23 l2 = l1[:] 24 l1.append(666) 25 print(l2)View Code
文件操作
我們用python或其他語言編寫的應用程序若想要把數據永久保存下來,必須要保存於硬盤中,這就涉及到應用程序要操作硬件,眾所周知,應用程序是無法直接操作硬件的,這就用到了操作系統。操作系統把復雜的硬件操作封裝成簡單的接口給用戶/應用程序使用,其中文件就是操作系統提供給應用程序來操作硬盤虛擬概念,用戶或應用程序通過操作文件,可以將自己的數據永久保存下來。
有了文件的概念,我們無需再去考慮操作硬盤的細節,只需要關註操作文件的流程:
1,打開文件,產生一個文件句柄。
2,對文件句柄進行
3,關閉文件。
f = open(‘D:\護士老師主婦空姐聯系方式.txt‘,encoding=‘utf-8‘,mode=‘r‘) content = f.read() print(content)
f:變量,f_obj,file,f_handler,...文件句柄。open windows的系統功能,windows默認編碼方式:gbk,linux默認編碼方式utf-8。f.close()
流程:打開一個文件,產生一個文件句柄,對文件句柄進行操作,關閉文件。
讀
1、全部讀出來
f = open(‘D:\護士老師主婦空姐聯系方式.txt‘,encoding=‘gb2312‘) 1:全部讀出來f.read() f = open(‘log‘,encoding=‘utf-8‘) content = f.read() print(content,type(content)) f.close()
2、一行一行的讀
f = open(‘log‘,encoding=‘utf-8‘) print(f.readline()) print(f.readline()) print(f.readline()) print(f.readline()) print(f.readline()) f.close()
3、將原文件的每一行作為一哥列表的元素。
f = open(‘log‘,encoding=‘utf-8‘) print(f.readlines()) f.close()
4、讀取一部分read(n),在r模式下,read(n)按照字符去讀取。,在rb模式下,read(n)按照字節去讀取。
f = open(‘log‘,encoding=‘utf-8‘) print(f.read(3)) f.close() f = open(‘log‘,mode=‘rb‘) content = f.read(4) print(content) f.close()
5、循環讀取
f = open(‘log‘,encoding=‘utf-8‘) for i in f: print(i.strip()) f.close()
6、非文字類的文件時,用rb
f = open(‘D:\護士老師主婦空姐聯系方式.txt‘,mode=‘rb‘) content = f.read() print(content) f.close()
寫
1、沒有文件,創建一個文件寫入內容
f = open(‘log1‘,encoding=‘utf-8‘,mode=‘w‘) f.write(‘兒科王金發;剪短發了肯定撒就廢了;就‘) f.close()
2、有文件,將原文件內容清空,在寫入內容。
f = open(‘log1‘,encoding=‘utf-8‘,mode=‘w‘) f.write(‘666‘) f.close()
3、wb
f = open(‘log‘,mode=‘wb‘) f.write(‘老男孩教育‘.encode(‘utf-8‘)) f.close()
4、沒有文件,創建一個文件追加內容
f = open(‘log2‘,encoding=‘utf-8‘,mode=‘a‘) # f.write(‘666‘) # f.close()
5、有文件,直接追加內容。
f = open(‘log2‘,encoding=‘utf-8‘,mode=‘a‘) f.write(‘666‘) f.close()
7、r+ 先讀,後追加 一定要先讀後寫
f = open(‘log‘,encoding=‘utf-8‘,mode=‘r+‘) content = f.read() print(content) f.write(‘aaa‘) f.close()
8、錯誤的
f = open(‘log‘,encoding=‘utf-8‘,mode=‘r+‘) f.write(‘BBB‘) content = f.read() print(content) f.close()
9、w+ 先寫後讀
f = open(‘log‘,encoding=‘utf-8‘,mode=‘w+‘) f.write(‘中國‘) #print(f.tell()) # 按字節去讀光標位置 f.seek(3) # 按照字節調整光標位置 print(f.read()) f.close()
10、a+ 追加讀
f = open(‘log‘,encoding=‘utf-8‘,mode=‘a+‘) f.write(‘BBB‘) content = f.read() print(content) f.close()
11、其他方法
f = open(‘log‘,encoding=‘utf-8‘) print(f.read()) print(f.writable()) f.close()
f = open(‘log‘,encoding=‘utf-8‘,mode=‘a‘)
f.truncate(7) # 按字節對原文件截取
f.close()
12、功能一:自動關閉文件句柄,功能二:一次性操作多個文件句柄。
with open(‘log‘,encoding=‘utf-8‘) as f: print(f.read()) with open(‘log1‘,encoding=‘utf-8‘) as f1: print(f1.read()) with open(‘log‘,encoding=‘utf-8‘) as f1, open(‘log1‘,encoding=‘utf-8‘) as f2: print(f1.read()) print(f2.read())
1,將原文件讀取到內存。
2,在內存中進行修改,形成新的內容。
3,將新的字符串寫入新文件。
4,將原文件刪除。
5,將新文件重命名成原文件。
import os with open(‘log‘,encoding=‘utf-8‘) as f1, open(‘log.bak‘,encoding=‘utf-8‘,mode=‘w‘) as f2: content = f1.read() new_content = content.replace(‘alex‘,‘SB‘) f2.write(new_content) os.remove(‘log‘) os.rename(‘log.bak‘,‘log‘) import os with open(‘log‘,encoding=‘utf-8‘) as f1, open(‘log.bak‘,encoding=‘utf-8‘,mode=‘w‘) as f2: for i in f1: new_i = i.replace(‘SB‘,‘alex‘) f2.write(new_i) os.remove(‘log‘) os.rename(‘log.bak‘,‘log‘)
函數的初識
重復代碼多,可讀性差,所以函數產生了:函數就是封裝一個功能。
例如:def my_len(): ;def 關鍵字 定義一個函數;my_len 函數名書寫規則與變量一樣。; def 與函數名中間一個空格。;函數名():加上冒號函數體
def my_len(): count = 0 for j in l1: count += 1 print(count) my_len()
函數的返回值,寫函數,不要再函數中寫print()
while True: print(222) print(666) print(len([1,23,4]))
1,在函數中,遇到return結束函數。
2,將值返回給函數的調用者。
無 return
return None
return 1個值 該值是什麽,就直接返回給函數的調用者,函數名()
return 多個值 將多個值放到一個元組裏,返回給函數的調用者。
def fun(): print(111) print(222) print(333) return 2,3,4 a,b,c = fun() print(a,b,c)
def my_len(): count = 0 for j in l1: count += 1 return count return 777 return [1,2,3] return 1,2,3,[22,33],‘alexsb‘ ret = my_len() print(ret) print(my_len()) print(len(‘3243243‘))
函數的傳參
def my_len(l): # l 形式參數 形參 print(l) count = 0 for j in l: count += 1 return count a = ‘fdsafdsafdsagfsadf‘ print(my_len(a)) # 實際參數 ,實參 print(my_len([1,2,3]))
實參角度:1,位置傳參。按順序,一一對應
def my_len(l): # l 形式參數 形參 print(l) count = 0 for j in l: count += 1 return count a = ‘fdsafdsafdsagfsadf‘ print(my_len(a)) # 實際參數 ,實參 print(my_len([1,2,3])) def func(a,b,c): print(a) print(b) print(c) func(‘fdsafdas‘,3,4)
寫一個函數,功能比大小,
def max_min(a,b): if a > b: return a else: return b num1 = int(input(‘請輸入一個數:‘)) num2 = int(input(‘請輸入另一個數:‘)) print(max_min(num1,num2))
ps: 三元運算
def max_min(a,b): if a > b: return a else: return b print(max_min(100,200)) def max_min(a,b): return a if a > b else b print(max_min(300,200))
關鍵字傳參,不按順序,一一對應
def max_min(a,b): return a if a > b else b print(max_min(b = 300,a = 200))
混合傳參,關鍵字參數永遠在最後面
def func1(a,b,c,d,e): print(a) print(b) print(c) print(d) print(e) func1(1,2,d=4,c=3,e=5) func1(1,4,d=2,c=3,e=5)
按照形參角度
1,位置傳參。按順序,一一對應。
def func(a,b,c): print(a) print(b) print(c) func(‘fdsafdas‘,3,4)
2,默認參數。
def func(a,b=666): # print(a,b) func(1,2) func(1,777) func(1,2) s = ‘alex‘.center(30,‘*‘) print(s) def Infor_entry(username,sex=‘男‘): with open(‘name_list‘,encoding=‘utf-8‘,mode=‘a‘) as f1: f1.write(‘{}\t{}\n‘.format(username,sex))
while True: username = input(‘請輸入姓名(男生以1開頭)‘).strip() if ‘1‘ in username: username = username[1:] Infor_entry(username) else: Infor_entry(username,‘女‘)
小數據、文件操作及函數