python--迭代器與生成器

裝飾器是函數的應用python

函數名的本質-----就是一個變量 裏面存儲了函數的內存地址  函數名能夠做爲函數的參數、返回值、能夠被賦值,能夠做爲可變數據類型的元素函數

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------spa

迭代器:

iterable  形容詞  可迭代的
from collections import Iterable  查看在哪裏
iterable  是檢測一個對象是否可迭代的
isinstance()  括號內接受兩個東西,第一個是內容,第二個是數據類型,若是是輸入的是對的數據類型話就是True,不是的話就是False
能夠用來檢測是不是可迭代對象
iterable 和  STR等有些像,不過是用來檢測是不是可迭代對象,並非數據類型那樣能夠用type檢查
dir(),展現的是括號內數據類型全部的可用方法code

print(dir('aaa'))
print(dir(123))
print(set(dir('aaa)))-set(dir(123)))

能夠求方法的差集
'__iter__'  這個方法致使了一個數據類型的可迭代
#iter
只要包含了'雙下iter'方法的數據類型就是可迭代的-----可迭代協議
數據類型和python解釋器定下來的協議對象

dict.__iter__()
tuple.__iter__()
print([1,2,3].__iter__())   list iterator

iterator  名詞迭代器
迭代器就是實現了能從其中一個一個的取出值來(按順序依次取值)blog

>>>list=[1,2,3,4]
>>> it = iter(list)    # 建立迭代器對象
>>> print (next(it))   # 輸出迭代器的下一個元素
1
>>> print (next(it))
2

能夠從列表中依次取值
迭代器中有__next__和__iter__方法,----迭代器協議
可迭代對象中沒有__next__
可迭代對象和迭代器都有iter方法
在python中  學過的全部的能夠被for循環的基本數據類型都是可迭代的,而不是迭代器
用雙下iter()方法能夠將可迭代對象變成迭代器
迭代器=可迭代對象.__iter__()
迭代器取到沒有元素的時候,會報錯,,StopIteration
for 循環能夠是一個可迭代對象,也能夠是一個迭代器
except StopIteration   直到碰見這個錯誤   怎麼怎麼樣內存

爲何要有迭代器

迭代器存在的本質是什麼:
1.可以對python中的基本數據類型進行統一的遍歷,遍歷的過程當中不須要關心每個值分別是什麼
2.它能夠節省內存
f = open('file','w')  文件句柄就是一個迭代器
range(100).__iter__()  是一個可迭代對象   也是爲了節省內存存在的
惰性運算,不要一下生成太多數據佔用內存utf-8

迭代器的用處:

兩種迭代器,一種自己就是迭代器,好比文件句柄
一種是加__iter__()方法將可迭代對象改變成迭代器generator

迭代器是Iterator   Iterator都是python返回的,本身不能寫it

本身想寫的話就是Gerator ↓ 
生成器:
生成器就是迭代器,生成器是咱們本身寫出來的
生成器函數,另一種是生成器表達式
加yield關鍵字的函數就是生成器函數

def generator():
    print(123)
    yield'aaa'
g=generator()
print(g)

結果就是生成器的地址↑

ret = g.__next__()    能夠用ret=nex(g)
print(ret)
#結果是123,aaa

生成器函數在執行的時候返回一個生成器
生成器的本質就是迭代器
yield 有點像return
只有用next啓動生成器的時候裏面程序纔會執行
生成器裏面的數只能取一次

從生成器中取值

1.__next__ 有幾個yield就能夠取幾回
2.for循環取值  正常取for i in g
3.其餘數據類型進行強制轉換  list(g)  返回一個列表,裏面裝着生成器中的全部內容
注意:調用生成器函數的時候,要先獲取生成器,再進行next取值
生成器中的內容智能去一次,且按順序取值沒有回頭路,取完爲止

def clohtes():
    for cloth in range(1,20000):
        yield ('第%s件衣服'%cloth)
c = clohtes()
for i  in range(100):
    print(next(c))

屢次循環第多少件衣服示例↑

文件監控示例↓

 

import time
def tail(filename):
    f=open(filename,encoding='utf-8')
    f.seek(0,2)
    while True:
        line = f.readline()
        if not line:
            time.sleep(0.01)
            continue
        yield line
tailg = tail('demo')
for line in tailg:
    print(line,end='')

python3中對yield的一種簡化

 

def func():
    yield from [1,2,3]
    yield from 'ABC'
g = func()
for i in g:
    print(i)
相關文章
相關標籤/搜索