python03-break、continue、for循環、數據bytes類型、字符串與字節的關係、變量指向與深淺拷貝、set集合、文件操做

目錄:python

1.break、continue網絡

2.for循環app

3.數據bytes類型函數

4.字符串與字節的關係編碼

5.變量指向與深淺拷貝spa

6.set集合指針

7.文件操做code

一.breakcontinue對象

break 語句,break 語句用於跳出當前循環體blog

continue語句,跳過當前循環塊中的剩餘語句,而後繼續進行下一輪循環

pass 語句是空語句,是爲了保持程序結構的完整性,pass 不作任何事情,通常用作佔位語句

.For循環

Python for循環能夠遍歷任何序列的項目,如一個列表或者一個字符串。

for循環的通常格式以下:

for 變量接收名 in 對象 :

代碼示例:

1 list1 = ["one","two","three",4] 2 for i in list1: 3   print(i)

輸出結果:

one

two

three

4

For循環時加上序號enumerate:

1 list1 = ["手機","電腦","ipad"] 2 for i,v in enumerate(list1,1):     #表示遍歷list1這個列表,序號從1開始。
3   print(i,v)

輸出結果:

1 手機

2 電腦

3 ipad

循環語句能夠有 else 子句,它在窮盡列表(以for循環)或條件變爲 false (以while循環)致使循環終止時被執行,但循環被break終止時不執行,簡而言之就是break後不會執行下級的else(注意break的級別)

range()函數

若是你須要遍歷數字序列,可使用內置range()函數,它會生成數列。

range(起始值,終止值,步長)這裏是左閉右開區間,能夠取到起始值,可是取不到終止值,只能取到終止值的前一個,步長就是遍歷時的距離,默認是。

代碼示例:

1 for i in range(5,1,-1): 2   print(i)

輸出結果:

5

4

3

2

range的組和用法:

能夠結合range()和len()函數以遍歷一個序列的索引:

1 list1 = ["手機","電腦","ipad"] 2 for i in range(len(list1)):      #len是從1開始,range沒寫參數是從0開始
3   print(i,list1[i])

輸出結果:

0 手機
1 電腦
2 ipad

三.數據類型:字節bytes

表現形式:name = b」baby」

內部原理

Utf-8編碼下:

01100010 b

01100001 a

01111001 y

若是是字符串類型的baby,那默認是Unicode,一字符佔4個字節

若是有中文:

表現形式:b'\xe5\xa4\xa9\xe4\xb8\x8b'(「天下「的表現形式)

\x表示16進制

Utf-8編碼下:

例如:\xe5表示00100101,其中e前四位,5後四位

由於是前四位,一共16中變換形式,因此用16進制恰好能夠表現(\x)

因此\xe5 正確的表現形式是 1110 0101(就是十六進制和二進制的轉換)

四.字符串和字節的關係

內存:

00000000 00000000 00000000 01010100         unicode    A

01010100                                                          utf-8      A

01010100 01010100                                          gbk       A

01010000 00000100                                          gb2312    A

...                                                                            …

硬盤:

01010100                                                 utf-8    A

01010100                                                 utf-8    A

01010100                                                 gbk      A

01010100                                                 gb2312    A

...                                                                 ...

本質上,內存中都是010101,具體是什麼樣子的010101,須要根據編碼來決定。不一樣編碼的010101,互相不認識。

在python3裏:

默認解釋器的編碼:utf-8 -> 010101010101

特殊的:

字符串(str):

表現: a = "alex"  

本質: 01010101,unicode

字節(bytes):

表現: a = b"alex"  

本質: 01010101,某種編碼: utf-8,gbk,.....

總結:

python3:

str   --> uniocde

bytes --> gbk,utf-8.....

字符串類型的表現形式是 name = 「baby」 默認是用Unicode編碼的,當字符串須要網絡傳輸或者硬盤儲存時,須要將Unicode編碼的str準換爲其餘編碼的bytes,以節省空間。

五.變量指向和深淺拷貝

5.1變量指向:

1 1 name = "zrh"
2 2 name1 = name 3 3 print(name,name1) 4 4 name = "zrh1"
5 5 print(name,name1) 6 #輸出結果
7 #zrh zrh
8 #zrh1 zrh

內部原理:

 

 

 name1經過name指向zrh,此時name1的值就是zrh後面即便name改變爲zrh1,name1的值也不會改變。

5.2列表指向:

1 list1 = [1,2,3] 2 list2 = list1 3 list1.append(4) 4 print(list1,list2) 5 #輸出結果:[1, 2, 3, 4] [1, 2, 3, 4]

內部原理:

 

 

 list2經過list1指向【1,2,3】,此時list2的值就是【1,2,3】,append直接改變的是值,因此list1和list2都改變了。

5.3深淺拷貝

淺拷貝:只拷貝第一層,其餘都指向同一數據

深拷貝:無論裏面有多少嵌套,都會拷貝下來

深淺拷貝只有存在嵌套時纔會有異同

內存原理:

 

 

 公式格式:

1 list1 = [1,[2,3],4] 2 #淺拷貝
3 list2 = list1.copy() 4 #深拷貝
5 import copy 6 list3 = copy.deepcopy(list1)

注意:

list3最後一層是python爲了節省內存才直接指向list1的數據,因此list1改變數據,是重新開闢出一塊新的內存讓list1指向,list3不變。

1 list1 = [1,[2,3],4] 2 #深拷貝
3 import copy 4 list3 = copy.deepcopy(list1) 5 list1[0] = 0 6 print(list3[0]) 7 #輸出結果: 1

 六.集合set

集合(set)是一個無序的不重複元素序列。

可使用大括號 { } 或者 set() 函數建立集合,注意:建立一個空集合必須用 set() 而不是 { },由於 { } 是用來建立一個空字典。

1 list1 = [] #等價於list1 = list()
2 tuple1 = () #等價於tuple1 = tuple()
3 dict1 = {}  #等價於dict1 = dict()
4 #s因此建立集合是 set()

集合裏的元素必須是不可變的

set1 = {「1」,「zrh」,[1,2,3]}這樣就會報錯,由於列表是可變的

不可變類型:整型、字符串、元組

可變類型:字典、列表

集合也能夠for循環,集合不能夠經過索引來取值,由於集合無序。

建立格式:

1 parame1 = {"one","two","three"}    #建立方法1
2 a = set("apple")     #建立方法2
3 print(parame1,a) 4 #打印結果{'two', 'three', 'one'}集合無序的; 
5 #{'l', 'p', 'a', 'e'}由於是不能重複的,因此只有一個a

Set內置方法:

方法

描述

add()

爲集合添加元素(無返回值)

clear()

移除集合中的全部元素(無返回值)

copy()

拷貝一個集合(無返回值)

difference()

返回多個集合的差集(返回一個新的集合)

difference_update()

方法用於移除兩個集合中都存在的元素(無返回值)

discard()

刪除集合中指定的元素(無返回值)刪除元素不存在不會報錯

intersection()

返回集合的交集(返回一個新的集合)

intersection_update()

更新指定集合爲指定集合和參數集合的交集(無返回值)

isdisjoint()

判斷兩個集合是否無交集,若是沒有返回 True,不然返回 False(返回布爾值 )

issubset()

判斷指定集合是否爲該方法參數集合的子集(返回布爾值 )

issuperset()

判斷該方法的參數集合是否爲指定集合的子集(返回布爾值 )

pop()

隨機移除元素(返回移除的元素)

remove()

移除指定元素(返回移除的元素)刪除的元素不存在會報錯

symmetric_difference()

返回兩個集合中不重複的元素集合(返回一個新的集合)

symmetric_difference_update()

移除當前集合中在另一個指定集合相同的元素,並將另一個指定集合中不一樣的元素插入到當前集合中(無返回值)

union()

返回兩個集合的並集(返回一個新的集合)

update()

給集合添加元素(無返回值)

Set內置方法部分應用舉例:

 1 #1.add() 添加 參數必須是字符串
 2 name = {'one','two','three','four','five'}  3 a = name.add('six')  #括號內的元素只能填一個,而且要維護集合元素永不重複
 4 print(a)       #輸出結果:None 說明add不可返回值,直接修改的是集合
 5 print(name)   #輸出結果:{'four', 'five', 'three', 'six', 'one', 'two'}
 6 #2.update() 添加更新 參數能夠是列表,元組,字典,集合等
 7 name = {'one','two','three','four','five'}  8 a = name.update(['six','seven'])  9 print(a)       #輸出結果:None 說明update不可返回值,直接修改的是集合
10 print(name)   #輸出結果:{'three', 'seven', 'four', 'six', 'one', 'two', 'five'}
11 #3. difference() 用於計算差集
12 #difference() 方法用於返回集合的差集,即返回的集合元素包含在第一個集合中,但不包含在第二個#集合(方法的參數)中。
13 name = {'one','two','three','four','five'} 14 name1 = {'five','six','seven'} 15 a = name.difference(name1)   #name中存在,name1中不存在,建立新變量,name name1值不變
16 print(a)       #輸出結果:{'three', 'four', 'one', 'two'}
17 #4. difference_update() 方法用於移除兩個集合中都存在的元素。
18 #difference_update() 方法與 difference() 方法的區別在於 difference() 方法返回一個移除相同元素的新集合,
而 difference_update() 方法是直接在原來的集合中移除元素,沒有返回值。
19 name = {'one','two','three','four','five'} 20 name1 = {'five','six','seven'} 21 a = name.difference_update(name1) #在name中刪除name1中存在的值 22 print(a) #輸出結果:None 沒有返回值 23 print(name) #輸出結果:{'four', 'two', 'three', 'one'} 24 快速去重:利用集合元素不重複的方法 25 name = ['one','two','five','three','four','five'] 26 val = set(name) #將列表轉換爲集合格式 27 print(val) #{'four', 'two', 'five', 'one', 'three'}

七.文件操做

文件操做三要素

1. 路徑:D:\\name.txt

2. 編碼:utf-8或gbk等

3. 模式:

x

寫模式,新建一個文件,若是該文件已存在則會報錯。

b

二進制模式。即bytes

+

打開一個文件進行更新(可讀可寫)

r

以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。

rb

以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。通常用於非文本文件如圖片等。

r+

打開一個文件用於讀寫。文件指針將會放在文件的開頭。經常使用

rb+

以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。通常用於非文本文件如圖片等。

w

打開一個文件只用於寫入。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。

wb

以二進制格式打開一個文件只用於寫入。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。通常用於非文本文件如圖片等。

w+

打開一個文件用於讀寫。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。

wb+

以二進制格式打開一個文件用於讀寫。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。通常用於非文本文件如圖片等。

a

打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。

ab

以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。

a+

打開一個文件用於讀寫。若是該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。若是該文件不存在,建立新文件用於讀寫。

ab+

以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。若是該文件不存在,建立新文件用於讀寫。

只讀模式r:

1.

1 obj = open('D:\\name.txt',encoding='utf-8',mode='r')  #\\中的第一個\表示轉義符
2 # 文件路徑 編碼格式 模式
3 content = obj.read() #此時的content是str類型,str在內存上又是Unicode類型
4                     # 因此mode = 'r' python內部會把utf-8數據轉換成Unicode類型
5 obj.close()

2.

1 obj = open('D:\\name.txt',mode='rb') 2 # 文件路徑 模式
3 content = obj.read() #此時的content是bytes類型,打印出來是bytes的表現形式
4 obj.close()

總結:

1.文件在硬盤上存儲必定是UTF-8或者GBK等編碼的01

2.rb=原封不動的拿數據,數據此時是某種編碼的01,爲了顯示方便,便會顯示bytes的表現形式

3.r=內部會有轉換,可是必須記住要加編碼格式encoding = ‘utf-8’等

4.encoding是文件以前用什麼編碼保存,就用什麼編碼打開

5.通常狀況下mode = ‘rb’,用bytes的不多,通常用於上傳,下載文件時纔用到

只寫模式w:

寫以前會清空裏面的內容再寫

1.open(文件路徑,mode='wb')

1 count = open('name.txt',mode='wb') 2 count.write("dooble".encode('utf-8')) 3 #wb模式下,往裏存的必須是utf-8等編碼格式,字符串默認是Unicode,因此要轉換成utf-8
4 count.close()

2.open(文件路徑,mode='w',encoding='utf-8')

1 count = open('name.txt',encoding='utf-8',mode='w') 2 count.write('123')        #會先清空,再寫,只能寫不能讀
3 count.close()

  3.writelines()  將列表的內容寫入文件,參數是個列表

只追加模式a:

追加模式不清空原來文件的內容

1.open(文件路徑,mode='ab')

1 count = open('name.txt',mode='a',encoding='utf-8') 2 count.write("name1") 3 count.close()

2.open(文件路徑,mode='a',encoding='utf-8')

 1 count = open('name.txt',mode='ab')  2 count.write("name1".encode('utf-8'))  3 #ab模式下,往裏存的必須是utf-8等編碼格式,字符串默認是Unicode,因此要轉換成utf-8
 4 count.close()

r+模式:

1 count = open('name.txt',mode='r+',encoding='utf-8') #r+可讀可寫 w+可寫可讀,寫以前會清空原文件內容,讀的是你寫的內容
2 #此時指針在第一個位置,不跳指針繼續寫會從第一個位置覆蓋
3 count.write("name1")  #這樣就直接覆蓋了
4 count.read() #讀到最後,指針此時在最後了
5 count.write("name1")   #指針在最後,因而就添加到最後了
6 #要想在第二個位置覆蓋,那須要調整指針
7 count.seek(0) #將指針調整到0位置
8 count.write("2")  #此時2就覆蓋了原來在0位置的內容
9 count.close()  #關閉文件

  r+模式注意事項:

  file文件內容:

  

   注意事項一:

1 with open("file",'r+',encoding='utf-8') as file_1:  #打開文件時候不清空文件
2     file_1.readline()        #讀第一行,指針如今在第一行末尾
3     file_1.write("good")     #在執行寫操做的時候,是在文件末尾追加

輸出結果:

注意事項二:

當不執行讀操做的時候,再寫的話默認從開始的位置覆蓋

with open("file",'r+',encoding='utf-8') as file_1:  #打開文件時候不清空文件
    file_1.write("good")    #當不執行讀操做的時候,再寫的話默認從開始的位置覆蓋

輸出結果:

因此在之後的操做中,不要同時讀寫操做一個文件,由於會亂,因此不用「R+」,就單獨的用 r、w、a

文件的功能:

read

1 obj = open('美女.txt',mode='r+',encoding='utf-8') 2 data = obj.read()  # 讀取全部文件內容
3 data = obj.read(2) # 在r模式中讀取的2是2個字符;在rb模式中讀取的2是2個字節
4 obj.write('字節或字符串')

seek

1 obj = open('美女.txt',mode='r+',encoding='utf-8') #打開文件時注意該文件是否是用utf-8編碼的
2 obj.seek(2)         # 參數2永遠是字節,用來指定指針的位置 utf-8一箇中文3個字節

 tell等

1 obj.tell()          # 讀取當前指針的位置,讀取到的是字節數
2 obj.writable()   #是否可寫,r模式下就不可寫,能夠用變量接收返回值
3 obj.readable()   #是否可讀,w模式下就不可讀,能夠用變量接收返回值

flush將內存中內容刷到硬盤

1 count = open('name.txt',mode='r+',encoding='utf-8') 2 while True: 3     val = input(">>>") 4     count.write(val)    #給文件裏寫內容
5     count.flush()       #強行把內容刷到硬盤,否則文件在循環裏永遠關閉不了
6 count.close()

readline

(readlines()表示讀取整個文件,返回的是一個列表)

1 count = open('name.txt',mode='r+',encoding='utf-8') 2 date = count.readline() 3 print(date) 4 date = count.readline()   #在讀第二行的時候,第一行內容是zrh\n,\n也會被讀出來,因此打印的時候中間會多一行間隙
5 print(date) 6 count.close()

打印結果:

zrh

 

zrh1

 

zrh2

readline經常使用的一種方法:

count = open('name.txt',mode='r+',encoding='utf-8') for line in count: print(line)   #即便文件有80個G,for循環的垃圾回收體制會即時節省內存

truncate

obj.truncate()  #截取文件內容,根據指針位置,只保留指針以前數據

注意:寫文件的時候必定記着關閉文件,這裏有一種自動關閉的方法:

with open("name.txt",mode="r+",encoding="utf-8") as count:   #as 後面是接收打開文件對象的變量名
    #在縮進裏寫代碼內容 #等待運行完代碼後會自動跳出縮進,就自動關閉了

總結:

file.close()

關閉文件。關閉後文件不能再進行讀寫操做。

file.flush()

刷新文件內部緩衝,直接把內部緩衝區的數據馬上寫入文件, 而不是被動的等待輸出緩衝區寫入。

file.fileno()

返回一個整型的文件描述符(file descriptor FD 整型), 能夠用在如os模塊的read方法等一些底層操做上。

file.isatty()

若是文件鏈接到一個終端設備返回 True,不然返回 False。

file.read([size])

從文件讀取指定的字節數,若是未給定或爲負則讀取全部。

file.readline([size])

讀取整行,包括 "\n" 字符。

file.readlines([sizeint])

讀取全部行並返回列表,若給定sizeint>0,返回總和大約爲sizeint字節的行, 實際讀取值可能比 sizeint 較大, 由於須要填充緩衝區。

file.seek(offset[, whence])

移動文件讀取指針到指定位置

file.tell()

返回文件指標當前位置。

file.truncate([size])

從文件的首行首字符開始截斷,截斷文件爲 size 個字符,無 size 表示從當前位置截斷;截斷以後後面的全部字符被刪除,其中 Widnows 系統下的換行表明2個字符大小。

file.write(str)

將字符串寫入文件,返回的是寫入的字符長度。

file.writelines(sequence)

向文件寫入一個序列字符串列表,若是須要換行則要本身加入每行的換行符。

文件的刪除和重命名:

import os with open("file",'r+',encoding='utf-8') as file_1:  #打開文件時候不清空文件
    pass os.remove('file')   #刪除file的文件
os.rename('file','file_new')  #將文件名file修改成file_new

文件內容的修改:

步驟:

1.先遍歷文件

2.str.replace或者str.split

3.將修改後的全部文件從新寫入一個新文件

4.刪除原來文件

5.將新文件重命名爲原來文件的名字

舉例:

file文件的內容:

需求1:給每一項的第一個 | 前的字母加上  _good

 1 import os   #導入os模塊
 2 file_2 = open("file_new",'w',encoding='utf-8')   #以寫模式打開file_new文件,打開以前會清空原文件內容
 3 with open("file",'r',encoding='utf-8') as file_1:  #以讀模式打開file文件
 4     for line in file_1:  5         list_1 = line.split("|")  6         list_1[0] = list_1[0]+"_good"
 7         content = '|'.join(list_1)  8         file_2.write(content)           #每遍歷一個內容,修改後就寫到file_new裏面
 9 file_2.close() 10 os.remove('file')     #刪除原來的file文件
11 os.rename('file_new','file')  #將file_new文件重命名爲file

輸出結果:

     需求2:給zcx後面加上 _good ,其餘保持不變

 1 import os   #導入os模塊
 2 file_2 = open("file_new",'w',encoding='utf-8')   #以寫模式打開file_new文件,打開以前會清空原文件內容
 3 with open("file",'r',encoding='utf-8') as file_1:  #以讀模式打開file文件
 4     for line in file_1:  5         list_1 = line.split("|")  6         if list_1[0] == 'zcx':    #判斷是否是zcx
 7             list_1[0] = list_1[0]+"_good"
 8         content = '|'.join(list_1)  9         file_2.write(content)           #每遍歷一個內容,修改後就寫到file_new裏面
10 file_2.close() 11 os.remove('file')     #刪除原來的file文件
12 os.rename('file_new','file')  #將file_new文件重命名爲file

     輸出結果:

    

相關文章
相關標籤/搜索