吉佳 发表于 2018-8-14 08:39:27

python之迭代器和生成器

  迭代器
  迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件
  特点:

[*]  访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
[*]  不能随机访问集合中的某个值 ,只能从头到尾依次访问
[*]  访问到一半时不能往回退
[*]  便于循环比较大的数据集合,节省内存
  生成一个迭代器:
  >>> a = iter()
  >>> a
  <list_iterator object at 0x101402630>
  >>> a.__next__()
  1
  >>> a.__next__()
  2
  >>> a.__next__()
  3
  >>> a.__next__()
  4
  >>> a.__next__()
  5
  >>> a.__next__()
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  StopIteration
  
  生成器generator
  定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器
  代码:
  def cash_out(amount):
  while amount > 0:
  amount -= 100
  yield 100
  print("取钱")
  ATM = cash_out(500)
  print(type(ATM))
  print("取到钱 %s 万" % ATM.__next__())
  print("取到钱 %s 万" % ATM.__next__())
  print("取到钱 %s 万" % ATM.__next__())
  print("取到钱 %s 万" % ATM.__next__())
  print("取到钱 %s 万" % ATM.__next__())
  print("取到钱 %s 万" % ATM.__next__())# 到这时钱就取没了,再取就报错了
  print("取到钱 %s 万" % ATM.__next__())
  作用:这个yield的主要效果就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。另外,还可通过yield实现在单线程的情况下实现并发运算的效果。
  使用yield实现单线程中的异步并发效果:
  import time
  def consumer(name):
  print("%s 准备吃包子啦!" % name)
  while True:
  baozi = yield
  print("包子[%s]来了,被[%s]吃了!" % (baozi, name))
  def producer(name):
  c = consumer('A')
  c2 = consumer('B')
  c.__next__()
  c2.__next__()
  print("开始准备做包子啦!")
  for i in range(10):
  time.sleep(1)
  print("做了2个包子!")
  c.send(i)
  c2.send(i)
  producer("zhangshan")
页: [1]
查看完整版本: python之迭代器和生成器