Python 基础第十三天(迭代器,生成器)

今日主要内容:

1.可迭代对象

2.迭代器

3.生成器

 

1.可迭代对象

什么是可迭代对象:内部含有__iter__方法的对象,就是可迭代对象.

查看__iter__方法:dir(对象)

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

接触过的可迭代对象有:str,list,tuple,dict,set,range

迭代器:f1文件句柄

如何判断

法一:

例:s = 'laonanhai'

print('__iter__' in dir(s))

法二:

例:l = [1, 2, 3, 4]
from collections import Iter

print(isinstance(l, Iterable))

返回结果:# True

 

2.迭代器

什么是迭代器

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

不仅含有__iter__方法,还要含有__next__方法

例:l1 = [1,2,3]

l1_obj = l1.__iter__()

print('__iter__' in  dir(l1_obj))  #True

print('__next__' in  dir(l1_obj)) #True

 

判断迭代器:

法一:

 print('__iter__' in dir(l1_obj)) #判断是否是可迭代对象
print('__next__' in dir(l1_obj)) #判断是否为迭代器

法二:
from collections import Iterator 
print(isinstance(l1_obj, Iterator))

 

迭代器的好处:

1.节省内存空间,只有执行__next__函数,才会进行下一步,并加载到内存中.

2.满足惰性机器

3.不能反复取值,不可逆.

 

例:用while循环模拟for循环内部机制

思路:

'''

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

2.内部使用__next__方法,取值

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

'''

 li = [1,2,3,4,5,6,7]

li_obj = li.__iter__()

while True:

  try:

    i = li_obj.__next__()

    printe(i)

   except  Exception:

    break

 #  Exception 表示一切非代码错误

 

3.生成器

(1)

什么是生成器:生成器本质是迭代器,是特殊的迭代器.所以迭代器的有点它都具有.

(2)

生成器的产生方式:

1.生成器函数构造

2.生成器推导式构造

3.数据类型的转换

 

1.生成器函数构造

方法:

正常函数下面将return 变成yield,就可以将函数转变成生成器.

例:

def funcl():

  print(666)

  print(555)

  return 777

print(funcl())

 

def funcl1():

  print(666)

  print(555)

  yield 444

  yleld 777

g = funcl()

print(g)

结论:# <generator object func1 at 0x0000000001197888>

解析:

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

第二:g称作生成器对象

执行:

print(g.__next__())

print(g.__next__())

print(g.__next__()) #超出yield数量,报错

 

sent的作用

next 和send 功能一样,都是执行一次
send可以给上一个yield赋值

例:

def generator():
  print(123)
  content = yield 1
  print(content)
  print(456)
  yield 2
g = generator()
g.__next__()
g.send('hello')

 

posted @ 2018-04-03 19:56  tom2ling  阅读(160)  评论(0编辑  收藏  举报