1. 程式人生 > >python基礎(第13天)--叠代器與生成器

python基礎(第13天)--叠代器與生成器

odi 得到 pre python基礎 作用 dict 空間 ret 必須

1、叠代器:

# 可叠代協議:含有雙下方法__iter__()
# 叠代器協議:同時含在雙下方法__iter__()和__next__()
# 可叠代不一定是叠代器,但叠代器一定可叠代
# 目前所學的可叠代的類型:list/tuple/dict/set/str/range()/enumerate/f
# 叠代器的作用:1>方便取值,無需關心順序及索引;2>節約內存空間
# 叠代器的生成:可叠代對象調用__iter__()方法,得到一個叠代器
# l = [1, 2, 3, 4]
# ret = l.__iter__()
# print(ret) # <list_iterator object at 0x000001E8761127B8>

# l = [1, 2, 3, 4]
# for i in l:
# print(i)
#
# for i in l.__iter__():
# print(i)
# 上面效果一樣,是因為for循環會自動將l轉化為叠代器對象,只要可叠代,就可以用for循環

2、生成器:
# 只要函數內部包含關鍵字yield,則為生成器方法
# yield與return的區別:return返回結果後直接結束函數,而yield返回結果後並沒有結束,下面語句可以繼續執行
# 生成器本質上是叠代器

# def generator():
# print(1)
# return "a"
#
# g = generator()
# print(g) # 1 a

# def generator():
# print(1)
# yield "a"
#
# g = generator()
# print(g) # <generator object generator at 0x000001D84601B8B8>
# # 從以上可以看出,執行generator()後並沒有執行函數內部代碼,而是直接返回了一個生成器對象,要執行內部代碼,必須調用__next__()方法
# ret = g.__next__()
# print("***", ret) # 1 *** a

# def generator():
# print(1)
# yield "a"
# print(2)
# yield "b"
#
# g = generator()
# print(g.__next__()) # 1 a
# print(g.__next__()) # 2 b
# 從以上可以看出,同一個生成器,調用__next__()方法可以繼續執行,而不是從頭再來執行
#也可用for循環
# for i in g:
# print(i)

# 娃哈哈%i
def wahaha():
for i in range(2000000):
yield "娃哈哈%d" % i

g = wahaha()
# print(g.__next__()) # 娃哈哈0
# for i in g:
# print(i) # 生成一個打印一個,節省了空間

# 如果只想打印前50個
count = 0
for i in g:
count += 1
print(i)
if count > 50:
break

# 如果想從51開始打印50個
for i in g:
count += 1
print(i)
if count > 100:
break
# 同樣不會從0開始打印
3、監聽文件輸入的例子:
 1 # def tail(filename):
 2 #     f = open(filename, encoding="utf-8")
 3 #     while True:
 4 #         ret = f.readline()
 5 #         if ret.strip():
 6 #             print(ret.strip())
 7 #
 8 # tail("file")  # 這樣雖然可以實現監聽,但是如果要對監聽的內容進行處理,就辦不到了
 9 
10 
11 # def tail(filename):
12 #     f = open(filename, encoding="utf-8")
13 # while True: 14 # ret = f.readline() 15 # if ret.strip(): 16 # yield ret.strip() 17 # 18 # 19 # r = tail("file") 20 # 21 # for i in r: 22 # print(i) 23 24 # def tail(filename): 25 # f = open(filename,encoding=‘utf-8‘) 26 # while True: 27 # line = f.readline() 28 # if line.strip(): 29 # yield line.strip() 30 # 31 # g = tail(‘file‘) 32 # for i in g: 33 # # if ‘python‘ in i: 34 # # print(‘***‘,i) 35 # print(i)

python基礎(第13天)--叠代器與生成器