1. 程式人生 > >python-day13~14_迭代器_生成器

python-day13~14_迭代器_生成器

 1,迭代器

# print(dir([]))   #告訴我列表擁有的所有方法

# 只要是能被for迴圈的資料型別 就一定擁有__iter__方法
# print([].__iter__())
# 一個列表執行了__iter__()之後的返回值就是一個迭代器


# Iterable 可迭代的 -- > __iter__ #只要含有__iter__方法的都是可迭代的
# [].__iter__() 迭代器 -- > __next__ #通過next就可以從迭代器中一個一個的取值

# 只要含有__iter__方法的都是可迭代的 —— 可迭代協議

# 雙下方法
# print([1].__add__([2]))
# print([1]+[2])

# class A:
  # # def __iter__(self):pass
  # def __next__(self):pass
#
# a = A()
# print(isinstance(a,Iterator))
# print(isinstance(a,Iterable))


# 迭代器的概念
# 迭代器協議 —— 內部含有__next__和__iter__方法的就是迭代器

# 迭代器協議和可迭代協議
# 可以被for迴圈的都是可迭代的
# 可迭代的內部都有__iter__方法
# 只要是迭代器 一定可迭代
# 可迭代的.__iter__()方法就可以得到一個迭代器
# 迭代器中的__next__()方法可以一個一個的獲取值,遇到yield會停下,沒遇到yield會報錯

#for
#只有 是可迭代物件的時候 才能用for
#當我們遇到一個新的變數,不確定能不能for迴圈的時候,就判斷它是否可迭代

# for i in l:
  # pass
#iterator = l.__iter__()
#iterator.__next__()

#迭代器的好處:
  # 從容器型別中一個一個的取值,會把所有的值都取到。
  # 節省記憶體空間
    #迭代器並不會在記憶體中再佔用一大塊記憶體,
      # 而是隨著迴圈 每次生成一個
      # 每次next每次給我一個

 

2,生成器函式

#生成器函式
# def generator():
  # print(1)
  # return 'a'
#
# ret = generator()
# print(ret)

 

#只要含有yield關鍵字的函式都是生成器函式
# yield不能和return共用且需要寫在函式內
# 程式遇到yield會暫停,並返回yield後面的值。yield關鍵字後面如還有程式碼,則生成器仍駐留在記憶體中,可被接著呼叫
# def generator():
  # print(1)
  # yield 'a'
# #生成器函式 : 執行之後會得到一個生成器作為返回值
# ret = generator()
# print(ret)
# print(ret.__next__())

# def generator():
  # print(1)
  # yield 'a'
  # print(2)
  # yield 'b'
  # yield 'c'
# g = generator()
# for i in g:
  # print(i)
# ret = g.__next__()
# print(ret)
# ret = g.__next__()
# print(ret)
# ret = g.__next__()
# print(ret)

 

3,

# def generator():
  # print(123)
  # content = yield 1
  # print('=======',content)
  # print(456)
  # arg = yield 2
  # ''''''
  # yield  #如果生成器最後一個yield之後沒有返回值,但還有程式碼要跑,也需要用一個空yield來結束
# g1 = generator()
# g2 = generator()
# g1.__next__()
# g2.__next__()
# print('***',generator().__next__())
# print('***',generator().__next__())

# g = generator()
# ret = g.__next__()
# print('***',ret)
# ret = g.send('hello') #send的效果和next一樣
# print('***',ret)

#send 獲取下一個值的效果和next基本一致
#只是在獲取下一個值的時候,給上一yield的位置傳遞一個數據
#使用send的注意事項
  # 第一次使用生成器的時候 是用next獲取下一個值
  # 函式中的最後一個yield不能接受外部的值

 

4,預激生成器,預激生成器的裝飾器

 

5,生成器表示式

# egg_list=['雞蛋%s'%i for i in range(10)]    #列表推導式

#生成器表示式
# g = (i for i in range(10))
# print(g)  #生成器
# for i in g:
  # print(i)

生成器Generator:
  本質:迭代器,所以擁有__iter__方法和__next__方法
  特點:惰性運算,開發者自定義
使用生成器的優點:
延遲計算,一次返回一個結果。也就是說,它不會一次生成所有的結果,這對於大資料量處理,將會非常有用

#列表解析
sum([i for i in range(100000000)])#記憶體佔用大,機器容易卡死
 
#生成器表示式
sum(i for i in range(100000000))#幾乎不佔記憶體

 

6,推導式

#[每一個元素或者是和元素相關的操作 for 元素 in 可迭代資料型別]   #遍歷之後挨個處理
#[滿足條件的元素相關的操作 for 元素 in 可迭代資料型別 if 元素相關的條件]     #篩選功能

# #30以內所有能被3整除的數
# ret = [i for i in range(30) if i%3 == 0] #完整的列表推導式
# g = (i for i in range(30) if i%3 == 0) #完整的生成器推導式
# print(ret)

 

#字典推導式

# 例一:將一個字典的key和value對調
# mcase = {'a': 10, 'b': 34}
# #{10:'a' , 34:'b'}
# mcase_frequency = {mcase[k]: k for k in mcase}
# print(mcase_frequency)

 

#集合推導式,自帶結果去重功能
# squared = {x**2 for x in [1, -1, 2]}
# print(squared)

作業:www.cnblogs.com/eva-j/articles/7213953.html