day 13 迭代器,生成器

1、迭代器

for 循环可以循环的就是可迭代对象

  可迭代对象:str,list,tuple,dict,set,range

    迭代器:f1文件句柄

什么事可迭代对象:内部含有__iter__方法的对象就叫做可迭代对象

可迭代对象就遵循可迭代协议。

如何判断 两种方式

1 print('__iter__' in dir(s))
2 from collections import Iterable
3 l = [1, 2, 3, 4]
4 print(isinstance(l,Iterable))
5 print(type(l))
6 print(isinstance(l,list))
判断可迭代对象的两种方式

 迭代器

l1 = [1, 2, 3]

可迭代对象转化成迭代器:可迭代对象.__iter__()  --->迭代器

迭代器不仅含有__iter__,还含有__next__。遵循迭代器协议。

迭代器,
 1 l1_obj = l1.__iter__() #迭代器
 2 print('__iter__ in dir(li_obj))
 3 print('__next__' in dir(l1))
 4 print('__next__' in dir(l1_obj))
 5 print(l1_obj.__next__())
 6 print(l1_obj.__next__())
 7 print(l1_obj.__next__())
 8 print(l1_obj.__next__())
 9 for i in l1_obj:
10     print(i)
11 #判断迭代器:
12 print('__iter__' in dir(l1_obj))
13 print('__next__' in dir(l1_obj))
14 from collections import Itrrator
15 print(isinstance(l1_obj,Iterator))
判断迭代器

迭代器的好处:

 

1、节省内存空间。

2、满足惰性机制。

3、不能反复取值,不可逆。

for循环实质

1、将可迭代对象转化成迭代器

2、内部使用__next__方法取值

3、运用了异常处理去处理报错

1 l2 = [1, 2, 3, 4, 5, 6, 7, 8]
2 l2_obj = l2.__iter__()
3 while True:
4     try:
5         i = l2_obj.__next__()
6         print(i)
7     except Exception:
8         break
for循环实质

生成器

生成器本质上市迭代器。

生成器的产生方式:

1、生成器函数构造

2、生成器推导式构造

3、数据类型的转化

def func():

  print(111)

  print(222)

  print(333)

  yield 666

  yield 555

  yield 444

g = func()

print(g)  # <generator object func1 at 0x0000000001197888>

1、函数中只要有yield 那他就不是一个函数,而是一个生成器

2、g称作为生成器对象

print(g.__next__())

print(g.__next__())

print(g.__next__())

next 和send 功能一样,都是执行一次

send可以给上一个yield赋值。

 1 # def func1():
 2 #     for i in range(1,10001):
 3 #         print('老男孩校服%d号' % i)
 4 # func1()
 5 
 6 # def func1():
 7 #     for i in range(1,10001):
 8 #         yield '老男孩校服%d号' % i
 9 # g = func1()
10 #
11 # for i in range(50):
12 #     g.__next__()
13 #
14 # for j in range(150):
15 #     print(g.__next__())
16 
17 # l1 = [i for i in range(1000)]
18 
19 #send
20 def generator():
21     print(123)
22     content = yield 1
23     print(content)
24     print(456)
25     yield 2
26 g = generator()
27 g.__next__()
28 g.send('hello')
29 
30 '''
31 next 和send 功能一样,都是执行一次
32 send可以给上一个yield赋值。
View Code

 

posted @ 2018-04-03 20:33  大白1#  阅读(41)  评论(0)    收藏  举报