python學習第一天---生成器表示式
阿新 • • 發佈:2018-11-06
複習:
迭代器和生成器
迭代器:
魔法方法__iter__()很少直接呼叫的方法,一般情況下是通過其他方法觸發的
可迭代的 -- 可迭代協議 含有__iter__的方法 __iter__ in dir(obj)
迭代器協議: 含有__iter__ __next__方法
迭代器一定可迭代,可迭代的通過呼叫__iter__方法就能得到一個迭代器
迭代器特點:
很方便使用,一個迭代器只能取所有的資料一次
節省記憶體空間
生成器(本質是迭代器):
生成器的表現形式:
生成器函式
含有yield關鍵字的函式就是生成器函式
特點:
呼叫函式的時候函式不執行,返回一個生成器
呼叫__next__()方法的時候會取到一個值
知道取到最後一個之後,會丟擲錯誤
def wahaha(): for i in range(20): yield 'wahaha%s' % i g = wahaha()
list(g) # 資料型別的強制轉化(佔記憶體) g.__next__() # 每次執行就是從生成器中取值,預示著生成器函式中的程式碼繼續執行count = 0 for i in g: num += 1 if num > 50: break print(i)
生成器中取值的幾個方法:
next
for
資料型別的強制轉化
生成器函式進階
def generator(): print(123) yield 1 print(456) yield 2 print(789) # 沒有yield函式會繼續執行,最後丟擲錯誤 g = generator() ret= g.__next__() print(ret)
ret = g.send(None) # send的效果和next一樣 ret = g.__next__() print(ret) ret = g.__next__() print(ret)
def generator(): print(123) content = yield 1 print('====',content) print(456) yield 2 print(789) # 沒有yield函式會繼續執行,最後丟擲錯誤 g = generator() ret = g.__next__() print(ret) ret = g.send(‘hello’) # send的效果和next一樣 ret = g.__next__() print(ret) ret = g.__next__() print(ret) # send的獲取下一個值的效果和next基本一致, # 在獲取的下一個值得時候,給上一值的位置傳遞一個數據
send的注意事項:
第一次使用生成器的時候,是用的next獲取第一個yield的值
最後一個yield不能接受外部的值,