Python 迭代器与生成器

迭代器 (iterator)

迭代的对象(iterable):列表(list)、字典(dict)、元祖(tuple)、字符串(str)、集合(set)

dir() 查看数据类型的所用方法

print(dir([]))

print(dir({}))

print(dir(5))

迭代的对象定义: 内部含有__iter__()方法的数据类型,就是可迭代的对象  --》(可迭代协议)

ret = ‘__iter__’ in dir('abc')

print(ret)

'abc'.__iter__() : 含有__iter__() 和__next__()称为迭代器(iterator)

迭代器定义:迭代器你可以理解为一个容器,从这个容器中一个接一个把值取出来的过程,就是迭代过程

如何取值:print(ret.__next__())

     print(ret.__next__())

     print(ret.__next__())

    l = ['ha','hei','he']
    lst_iter = l.__iter__()
    print(lst_iter.__next__())

    print(lst_iter.__next__())
    print(lst_iter.__next__())

Python 一切皆对象

       print('__iter__' in dir(lst_iter))
    print('__next__' in dir(lst_iter))
    print(set(dir(lst_iter)) - set(dir(l)))
    lst_iter.__next__()

可迭代协议:必须含有__iter__()方法

迭代器协议:包含__next__(),__iter__()方法

  包含__next__方法的可迭代对象就是迭代器
  迭代器是可迭代的 的一部分
获得迭代器:可迭代的调用 __iter__()
使用迭代器:迭代器.__next__()

可迭代的  : __iter__
迭代器    : __iter__ 和__next__
迭代器和可迭代的关系 :可迭代的包含迭代器
迭代器和可迭代的判断 :两种方法

迭代器的工作原理
l_iter = [1,2,3,4,5].__iter__()
只是记录当前这个元素和下一个元素
    print('__iter__' in dir(range(10)))
    print('__next__' in dir(range(10)))
    range_iter = range(10).__iter__()
       print(range_iter.__next__())
    print(range_iter.__next__())
迭代器的特点  —— 迭代器是个好东西
惰性运算
从前到后一次去取值,过程不可逆 不可重复
节省内存

  for item in [1,2,3]:
    pass

      list_iter = [1,2,3].__iter__()
      list_iter.__next__()

用while循环模拟for循环的方式  —— for循环是依赖迭代器的,且我们自己也可以仿照着写
     l = [1,2,3,4,5]
     l_iter = l.__iter__()
     while True:
         try:
             print(l_iter.__next__())
        except StopIteration:
             break

for循环是让我们更简单的使用迭代器
用迭代器取值就不需要关心索引或者key的问题了

迭代器是个好东西
目前我们已知的可迭代的都是python提供给我们的
  range()
  enumerate()
在平时写代码的过程中,我们用for循环就够了


我自己想写个可迭代的,——生成器
生成器的本质就是迭代器
因此生成器的所有好处都和迭代器一样
但是 生成器是我们自己写的python代码
生成器的实现由两种方式:
1.生成器函数
2.生成器表达式
    def func():
        return ['衣服1','衣服2000000']
    ret = func()
    print(ret)



    def g_func():
        yield 1

    g = g_func()
    print(g)
generator 生成器   --->  迭代器
print(g.__next__())
生成器函数和普通函数之间的区别
生成器函数中含有yield关键字
生成器函数调用的时候不会立即执行,而是返回一个生成器

  def g_func():
      print('aaaa')
      yield 1
      print('bbbb')
      yield 2
      yield 3

   g = g_func()

     for i in g:
      print(i)
    print(g.__next__())
    print(g.__next__())
       print(g.__next__())


def cloth():
    for i in range(1000000):
        yield  '衣服%s'%i

g = cloth()
for i in range(50):
    print(g.__next__())

for i in range(50):
    print(g.__next__())

posted on 2017-11-03 16:52  潘红伟  阅读(85)  评论(0)    收藏  举报

导航