day18 檔案處理 迭代器 生成器 三元運算

2022-02-13 06:16:46 字數 4382 閱讀 4152

檔案處理的b模式,b模式 開啟的是二進位制

f=open('test11.py','rb',encoding='utf-8') #b的方式不能指定編碼

f=open('test11.py','rb')           #b的方式不能指定編碼

data=f.read()

#'字串'---------encode---------》bytes

#bytes---------decode---------》'字串'

print(data)

print(data.decode('utf-8'))

f.close()

f=open('test22.py','wb') #b的方式不能指定編碼

f.write(bytes('1111\n',encoding='utf-8')) #方法一

f.write('楊件'.encode('utf-8')) #方法二

檔案操作的其他方法

檔案r模式的話是根據系統的編碼 

f=open('a.txt','r+',encoding='utf-8')

data=f.read()

print(f.encoding) #utf-8

f.write('你好')         #乙個檔案只能有一種格式

f=open('a.txt','r',encoding='utf-8',newline='') #讀取檔案中真正的換行符號

print(f.closed)

print(f.encoding) #列印字元編碼

f.flush() #重新整理 儲存資料

print(f.readlines())

f=open('a.txt','r',encoding='utf-8',newline='') #讀取檔案中真正的換行符號

print(f.closed)

print(f.encoding) #列印字元編碼

print(f.tell()) #0 檔案當前位置

f.readline()

print(f.tell()) #6 檔案當前位置

f.flush() #講檔案內容從記憶體刷到硬碟

f.closed #檔案如果關閉則返回true

f.encoding #檢視使用open開啟檔案的編碼

f.tell() #檢視檔案處理當前的游標位置

f.seek(3) #從開頭開始算,將游標移動到第三個位元組

f.truncate(10) #從開頭開始算,將檔案只保留從0-10個位元組的內容,檔案必須以寫方式開啟,但是w和w+除外

迭代器

迭代更新換代

迭代器協議:

for迴圈的本質:迴圈所有物件,全都使用迭代器協議

只要有__iter__方法 就可以把他們變成可迭代物件,然後for迴圈呼叫物件的__next__()方法去取值,而且for迴圈會捕捉stopiteration異常,以終止迭代

next() #是內建函式

next() ---> #呼叫迭代器的__next__()方法

迭代器就是可迭代物件,他們是一回事。只要遵循迭代器協議,生成的資料型別就是可迭代物件

可迭代物件:

只要遵循迭代器協議,生成的資料型別就是可迭代物件

iter_l=l.__iter__()     #遵循迭代器協議,生成可迭代物件

print(iter_l.__next__())

print(iter_l.__next__())

for i in s:

print(i)

iter_s=s.__iter__()

print(iter_s)

print(iter_s.__next__())

print(iter_s.__next__())

print(iter_s.__next__())

print(iter_s.__next__())

dic=

iter_d=dic.__iter__()

print(iter_d.__next__()) #a

l=['die','erzi','sunzi','chongsunzi']

iter_l=l.__iter__()

print(iter_l)

# print(iter_l.__next__())

# print(iter_l.__next__())

# print(iter_l.__next__())

# print(iter_l.__next__())

# print(iter_l.__next__())

# print(next(iter_l)) #next()---->iter_l.__next__()

生成器

什麼是生成器?

可以理解為一種資料型別。這種資料型別自動的實現了迭代器協議(其他的資料型別需要呼叫自己的__iter__方法),所以生成器是可迭代物件

python提供了2中的不同的方式生成器

1.生成器函式:常規函式定義,但是,使用yield語句而不是使用return語句返回結果。yield語句返回乙個結果,在每個結果中間,掛起函式的狀態,以便下次從它離開的地方繼續執行

def test():

yield 1

yield 2

yield 3

g=test()

print('來自函式',g) #來自函式 print(g.__next__()) #1

print(g.__next__()) #2

print(next(g)) #3

2.生成器表示式: 類似於列表推導。但是,生成器返回按需產生結果的乙個物件。而不是一次構建乙個結果列表

#列表解析

egg_list=

for i in range(5):

print(egg_list)       #['雞蛋0', '雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4']

l=['雞蛋%s' %i for i in range(5)]

print(l)             #['雞蛋0', '雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4']

l1=['雞蛋%s' %i for i in range(5) if i > 3 ]

print(l1)                             #['雞蛋4']

# l1=['雞蛋%s' %i for i in range(5) if i > 3 else i]     #沒有四元表示式

l2=['雞蛋%s' %i for i in range(5) if i < 3] #沒有四元表示式

print (l2)                           #['雞蛋0', '雞蛋1', '雞蛋2']

laomuji=('雞蛋%s' %i for i in range(10)) 			#生成器表示式 () 省記憶體

print(laomuji) #at 0x0000000002552a98>

print(laomuji.__next__())

print(next(laomuji)) #next() 本質就是呼叫__next__

print(next(laomuji)) #雞蛋1

print(next(laomuji)) #雞蛋2

生成器小結:

1.是可迭代的物件

2.實現了延遲機選,省記憶體

3.生成器的本質和其他資料型別一樣,都是實現了迭代器協議,只不過生成器附加了乙個延遲計算記憶體的好處。其餘的可迭代物件沒有這個好處

4.生成器只能遍歷一次, 取完就為空

t = range(3)

t1=(i for i in t)

t2=(i for i in t1)

print(list(t1)) #[0, 1, 2]

print(list(t2)) #

day18 檔案處理b(byte)模式

檔案處理的byte模式 f open test2.py 函式預設是 rb 模式,即為讀取模式 讀取乙個byte模式的檔案 rbf open test2.py rb 前提是存在這個可操作的物件 data f.read print data 列印出來的是byte二進位制的模式 print data.de...

C 學習筆記day 18檔案操作

1 文字檔案 寫檔案 include include using namespace std 文字檔案 寫檔案 void test01 intmain 2 文字檔案 讀檔案 include include include using namespace std 文字檔案 讀檔案 void test0...

day7 迭代器和生成器

一邊迴圈一邊計算的機制,只有在呼叫時才會生成相應資料 可以使用isinstance 來判斷乙個物件是否是iterator物件 可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 可以直接用於for迴圈的資料型別有一下幾種 1 集合資料型別,如list tuple dict set st...