1.迭代器(Iterator)迭代器是訪問(wèn)集合元素的一種方式。有下面特點(diǎn):1)每次調(diào)用next()方法只訪問(wèn)一個(gè)元素,而且不能后退,便于循環(huán)比較大的數(shù)據(jù)集合,節(jié)省內(nèi)存;(當(dāng)容器中沒(méi)有可訪問(wèn)的元素后,next()方法將會(huì)拋出一個(gè)StopIteration異常終止迭代器)2)只能從頭到尾訪問(wèn),不能隨機(jī)訪問(wèn)某個(gè)值;3)迭代器提供了一個(gè)統(tǒng)一的訪問(wèn)集合的接口,只要定義了iter()方法對(duì)象,就可以使用迭代器訪問(wèn)。迭代器使用:lis=['a','b','c','d']a=iter
1.迭代器(Iterator)
迭代器是訪問(wèn)集合元素的一種方式。有下面特點(diǎn):
1)每次調(diào)用next()方法只訪問(wèn)一個(gè)元素,而且不能后退,便于循環(huán)比較大的數(shù)據(jù)集合,節(jié)省內(nèi)存;(當(dāng)容器中沒(méi)有可訪問(wèn)的元素后,next()方法將會(huì)拋出一個(gè)StopIteration異常終止迭代器)
2)只能從頭到尾訪問(wèn),不能隨機(jī)訪問(wèn)某個(gè)值;
3)迭代器提供了一個(gè)統(tǒng)一的訪問(wèn)集合的接口,只要定義了iter()方法對(duì)象,就可以使用迭代器訪問(wèn)唬复。
迭代器使用:
lis=['a','b','c','d']
a=iter(lis)
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())#沒(méi)有元素獲取,導(dǎo)致StopIteration報(bào)錯(cuò)
運(yùn)行結(jié)果
a
b
c
d
Traceback (most recent call last):
File "F:/Python/pythoncode/s12/study/study5.py", line 318, in <module>
print(a.__next__())
StopIteration
2.生成器(Generator)
一個(gè)調(diào)用返回迭代器的函數(shù),就叫做生成器。函數(shù)中包含yield語(yǔ)法,這個(gè)函數(shù)就會(huì)變成生成器。
1)生成器表達(dá)式
用來(lái)生成有規(guī)律的生成器
格式:generator_name=('生成規(guī)則’ for i range(num) if 'i的條件‘)
1 a=('a' for i in range(5) if i%2)
2 b=(i+1 for i in range(5))
3 print(a,type(a))
4 print(b,type(b))
5 print(b.__next__())
6 print(b.__next__())
7 print(b.__next__())
8 print(b.__next__())
9 print(b.__next__())
10
11 #運(yùn)行結(jié)果
12 <generator object <genexpr> at 0x00F9CAE0> <class 'generator'>
13 <generator object <genexpr> at 0x00F9CC90> <class 'generator'>
14 1
15 2
16 3
17 4
18 5
生成式表達(dá)式
2)yield創(chuàng)建生成器
def fun_ex(a):
yield 1
re=fun_ex(2)
print(re.__next__(),type(re))
#運(yùn)行結(jié)果
1 <class 'generator'>
3)生成器實(shí)現(xiàn)單線程的異步并發(fā)效果
def gen_ex(a):
while a>0:
a-=1
yield 1
print('hello')
re=gen_ex(2)
print(re.next())
print('中斷打印')
print(re.next())
#運(yùn)行結(jié)果
1
中斷打印
hello
1
生成器是每次調(diào)用返回一次數(shù)據(jù),所以可以在中途插入其他操作,形成一種異步效果,如例子中先來(lái)個(gè)“中斷打印”
4)生成器中的send()方法使用
def gen_ex(a):
while a>0:
a-=1
b=yield
print(b)
re=gen_ex(5)
re.next()
re.send(5)
print('中斷打印')
re.send(6)
#運(yùn)行結(jié)果
5
中斷打印
6
send()可以給yield傳參數(shù),yield作為接收丰包。這里yield的運(yùn)行情況和return在函數(shù)上起的作用有些區(qū)別禁熏。
如生成器使用一個(gè)__next__()方法,它會(huì)運(yùn)行到y(tǒng)ield這行,而停止。但是再使用send()方法,函數(shù)直接從yield這行開(kāi)始運(yùn)行,并賦值給b,然后運(yùn)行下去循環(huán)一次到y(tǒng)ield這行停止邑彪。
5.裝飾器的原理
6.裝飾器的實(shí)現(xiàn)