1. 程式人生 > >小數據、文件操作及函數

小數據、文件操作及函數

字符 div num ont cat 文件 刪除 inpu run

小數據

小數據池:為了節省內存空間。

is、 == 和id

== :數值的比較
is :內存地址的比較
id 查看內存地址

int -5~256
str 有特殊字符不存在小數據池。
單個字符*int(20) 以內 有小數據池。

技術分享圖片View Code

編碼

英文:

  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 = laonanhai
6 s1 = blaonanhai 7 print(type(s)) 8 print(type(s1))
View Code 技術分享圖片
 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(
utf-8) 13 print(s1) 14 15 s = 中國 16 s1 = s.encode(gbk) 17 print(s1)
View Code

賦值與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,)




小數據、文件操作及函數