python--迭代器

迭代器

可迭代对象有很--str,list,dic,tuple,set,open,range,enumrate等

通过调用dic()方法查看对像的属性和方法

dir('A')
dir([])
dir((,))
dir({})

dir()返回值为列表,可先把列表转为set取交集可得到共有方法

得到{'__setstate__', '__next__', '__length_hint__'}这样方法称为下划线方法

li1 = [1,2,3]
iterator = li1.__iter__()
print(iterator.__next()__)
print(iterator.__next()__)
print(iterator.__next()__)

$1
$2
$3

集合调用__iter__()方法返回迭代器,调用__next__(或next())方法取值

 结论:只要含有__iter__()方法的都是可迭代的,即迭代协议 

当下标越界时会报错StopIteration

为了进一步证实,可用以下方法测试

 

from collections import Iterable    #可迭代的
from collections import Iterator    #迭代器 
class A:
     def __iter__(self):pass
     def __next__(self):pass
a = A()
print(isinstance(a,Iterable)
print(isinstance(a,Iterator)

 

1可迭代对象才能用for方法,遇到新对象时查看是否可循环时,查看是否有两个迭代方法

2判断:调用其它方法时,有可能

  a.返回值可能是一个可迭代对象或迭代对像

  b.返回多个值时,但是只有一个对象(eg:range(10))

  c.返回内存值

for 循环内部实现
for i in li1:pass
iterator = li1.__iter__()
iterator.__next__()

$for内部先判断对象是否为可迭代对像,调用next()方法

迭代器的好处:

1.从窗口类型中一个一个的取值,会把所有值都取到

2.节省内存,迭代器并不会在内存中再占用一大块内存,而是随着循环,每次生成一个

# 迭代器只是一次取一个
print(range(10000))     
# 而list则是把所有数据都填入到内存中,会报错
print(list[range(100000)])

生成器  

生成器generator,生成器本质是迭代器,是自己写的函数,关键字为yield

def generator():
       print(1)
       return 'a'
ret = generator()
print(ret)
#生成器关键字-yield,
#生成器函数:执行之后会得到一个生成器作为返回值
def generator():
       print(1)
       yield 'a'
ret = generator()
print(ret)
print(ret.__next__())
$<generator object generator at 0x00000000024A06D0>            
$1
$a

注意:

  1.yield只能写在函数里

  2.不能与return共用

  3.与return不同的地方在于,return会直接结束函数执行,yield不会结束

def generator():
      print(1)
      yield 'a'
      print(2)
      yield 'b'
g = generator()
ret = g.__next__()
print(ret)
ret = g.__next__()
print(ret)
与for循环相同
for i in g:print(i)

  

  

  

 

posted @ 2018-01-03 20:10  wsg-python  阅读(113)  评论(0编辑  收藏  举报