python筆記07

今日內容面試

  • 深淺拷貝(面試)
  • 文件操做

今日內容編碼

  1. 深淺拷貝code

    v1=[1,2,[34,67,9]]
    import copy
    淺拷貝:
    拷貝第一層
    v2=copy(v1)---將v1的地址copy,最外層殼拷貝一份,內層變量指向地址不變。
    id(v1[2]),id(v2[2])--相同
    id(v1),id(v2)---不相同,不拷貝內部變量地址ip

深拷貝:內存

v1=[1,2,[34,67,9]]
import copy
深拷貝:
拷貝全部數據(可變)
V3=deepcoyy(v1)---將v1中可變類型地址進行拷貝。適合嵌套的類型
id(v1),id(v2)--不一樣
id(v1[2],id(v2[2))--不一樣,內部變量地址也拷貝

實例驗證:utf-8

import copy
v1=[1,2,[34,67,9]]
v2=copy.copy(v1)
print(id(v1),id(v2))
print(id(v1[2]),id(v2[2]))

v3=copy.deepcopy(v1)
print(id(v1),id(v3))
print(id(v1[2]),id(v3[2]))
輸出:
39290696 39291976
39290504 39290504
39290696 39291912
39290504 39291848

總結:unicode

  • 深淺拷貝只針對可變類型。若是隻有一層,深、淺拷貝拷貝相同。
  • 淺拷貝:只拷貝第一層。內部元素指向不變。
  • 深拷貝:拷貝嵌套層次中全部的可變類型。不可變類型指向不變,可變類型從新複製一份,可變類型內的元素指向仍是指向原先的位置。(內部元素其實也拷貝,可是爲數字,字符串常見元素,因此位置不變)

特殊狀況:字符串

v1=(1,2,3)

import copy

v2=copy.copy(v1)

print(id(v1),id(v2))

v3=copy.deepcopy(v1)

print(id(v1),id(v3)

元組不可變,因此深淺拷貝的id都不變。

v1=(1,2,3,[3,4,5])

import copy

v2=copy.copy(v1)

print(id(v1),id(v2))

v3=copy.deepcopy(v1)

print(id(v1),id(v3)
  • 深淺拷貝只針對可變類型。
  • 元組內有可變類型(不可變類型內部有可變類型),深拷貝時,須要從新再建立一份,因此深拷貝後id會變化。
  • 深拷貝v3變化,v2與v1相同。
  • 字符串,元組,數字---數據類型,不可類型。
  1. 文件操做

內存中默認編碼方式爲unicode;文件操做包括:打開,操做,關閉。it

  • 打開
    • r,只能讀。 【**】
    • w,只能寫,寫以前清空。 【**】
    • a,只能追加。【*】
    • r+
      • 讀:默認從0的光標開始讀,也能夠經過 seek 調整光標的爲位置。
      • 寫:從光標所在的位置開始寫,也能夠經過 seek 調整光標的位置。
    • w+
      • 讀:默認光標永遠在寫入的最後或0,也能夠經過 seek 調整光標的位置。
      • 寫:先清空。
    • a+
      • 讀:默認光標在最後,也能夠經過 seek 調整光標的位置。而後再去讀取。
      • 寫:永遠寫到最後。
  • 操做
      • read()
      • read(n) # 光標所在位置,後讀取n個字符。
      • readlines()
    • write
  • 關閉
  • 文件讀取流程:
    file_object=open('log.txt',mode='r',encode='utf-8')
    content=file_object.read()
    print(content)
    file_object.close()import

  • 寫入流程:
    file_object=open('log.txt',mode='w',encode='utf-8') ##w只寫,打開瞬間清除已經存在的數據,通常用於新建。
    file_object.write('zhangsan')
    file_object.close()

  • 操做類型:
    a:追加,在文件尾部追加。
    r:只讀,文件不存在報錯。
    w:只寫,先清空,通常用於文件不存在新建。
    a:追加。文件不存在,新建。
    可讀可寫:r+

寫入:根據光標的位置,從當前光標位置開始寫入操做(可能會覆蓋其餘文字)。

file_object.seek(2)#調整光標的位置。
file_object=open('log.txt',mode='r+',encode='utf-8') 
file_object.write(你好)##有個光標。先寫入,在開始0字節寫入你好,覆蓋前兩個字。
content=file_object.read()
print(content)
file_object.write(6666)
file_object.close()

w+:

默認光標在最後。

寫入時候將文件清空,讀取時候須要調整光標位置。

若是先讀取,再寫入,光標已經在寫入的後面,在讀取的時候,沒法讀取光標前面的內容。

須要將光標移動至前面,file_object.seek(0),才能夠讀取到內容。

可讀可寫:a+

默認光標在文件最後,讀取內容須要將光標移動至最前面,file_object.seek(0)

若是調整光標位置:file_object.seek(0),寫入內容,仍是寫在如今內容後

r+:

data=file_objcet.read(n)###讀從當前光標位置讀取n個字符

file_object.readlines()###按照行讀取,按照列表存入。

若是讀取特別大的文件:

按行讀取:

for line in file_object:
print(line.strip()) ##去掉換行符號

寫操做:

file_object=open('log.txt',mode='w',encode='utf-8')
file_object.write('wxwlllxx\n') ###第一次寫入的時候,在最後添加換行符,再次寫入的時候就不會清空,內容在換行符光標的後面進行第二次內容寫入。
file_object.write('ix;wxmslhs')
###這裏寫入的內容就包括第一次和第二次寫入的內容,兩部分。
print(content)
file_object.close()

總結

  • 深淺拷貝
  • 文件操做
    • 打開
    • 讀寫
    • 關閉
  • 文件操做和數據類型的結合使用。
相關文章
相關標籤/搜索