裝飾器是函數的應用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='')
def func(): yield from [1,2,3] yield from 'ABC' g = func() for i in g: print(i)