# 迭代器和生成器
# 迭代器
# 可迭代協議 —— 含有iter方法的都是可迭代的
# 迭代器協議 —— 含有next和iter的都是迭代器
# 特點
# 節省記憶體空間
# 方便逐個取值,一個迭代器只能取一次。
# 生成器 —— 迭代器
# 生成器函式
# 含有yield關鍵字的函式都是生成器函式
# 生成器函式的特點
#呼叫之後函式內的程式碼不執行,返回生成器
#每從生成器中取一個值就會執行一段程式碼,遇見yield就停止。
#如何從生成器中取值:
# for :如果沒有break會一直取直到取完
# next :每次只取一個
# send :不能用在第一個,取下一個值的時候給上個位置傳一個新的值
# 資料型別強制轉換 :會一次性把所有資料都讀到記憶體裡
# 生成器表示式
# (條件成立想放在生成器中的值 for i in 可迭代的 if 條件)
習題:
# 3.處理檔案,使用者指定要查詢的檔案和內容,將檔案中包含要查詢內容的每一行都輸出到螢幕
def check_file(filename,aim):
with open(filename,encoding='utf-8') as f: #控制代碼 : handler,檔案操作符,檔案控制代碼
for i in f:
if aim in i:
yield i
g = check_file('1.複習.py','生成器')
for i in g:
print(i.strip())
# 4.寫生成器,從檔案中讀取內容,在每一次讀取到的內容之前加上‘***’之後再返回給使用者。
def check_file(filename):
with open(filename,encoding='utf-8') as f: #控制代碼 : handler,檔案操作符,檔案控制代碼
for i in f:
yield '***'+i
for i in check_file('1.複習.py'):
print(i.strip())
2:
def check_file(filename,aim):
with open(filename,encoding='utf-8') as f: #控制代碼 : handler,檔案操作符,檔案控制代碼
for i in f:
if aim in i:
yield i
g = check_file('1.複習.py','生成器')
for i in g:
print("***", i.strip())
3:
def check_file(filename, aim):
with open(filename, encoding='utf-8') as f: # 控制代碼 : handler,檔案操作符,檔案控制代碼
for i in f:
if aim in i:
yield i
g = check_file('1.複習.py', '生成器')
for i in g:
print("***%s"%i.strip())