python之迭代器 生成器

一、迭代器

1.可迭代对象

1 #方法一: dir(被测对象) 如果 他含有__iter__ ,那这个对象就叫做可迭代对象
2 s2 = 'abcd'
3 s3 = s2.__iter__()
4 print('__iter__' in dir(s2))
5 print('__iter__' in dir(s3))
6 print('__next__' in dir(s2))
7 print('__next__' in dir(s3))
8 # 只含有__iter__方法的数据是可迭代对象
9 # 含有__iter__方法,并且含有__next__方法的数据是迭代器
1 # 方法二 测试他是迭代器还是可迭代对象
2 l = [1,2,3]
3 l_iter = l.__iter__()
4 from collections import Iterable
5 from collections import Iterator
6 print(isinstance(l,Iterable))
7 print(isinstance(l,Iterator))
8 print(isinstance(l_iter,Iterator))
9 print(isinstance(l,list))

2.迭代器的意义

  • 迭代器节省内存
  • 迭代器惰性机制
  • 迭代器不能反复,一直执行下去

3.for循环的机制

 1 #内部含有__iter__方法,他会将可迭代对象先转化成迭代器.
 2 #,然后在调用__next__方法.
 3 # 他有异常处理的方法.
 4 for i in [1,2,3]:
 5     print(i)
 6 l = [1,2,3]
 7 l_iter = l.__iter__()
 8 while True:
 9     try:
10         print(l_iter.__next__())
11     except StopIteration:
12         break

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

   迭代器: 文件句柄

二、生成器

1.什么是生成器

  • 生成器的本质就是迭代器,生成器是自己用python代码写的迭代器
  • 可以用生成器函数
  • 可以用各种推导式构建迭代器
  • 可以通过数据转化

2.生成器函数 生成器

 1 def gener():
 2     print('aaa')
 3     yield 222
 4     print('bbb')
 5     yield 333
 6     print('ccc')
 7 g = gener()
 8 print(g)
 9 print(g.__next__())
10 print(g.__next__())

3.return yield 区别

  • return 返回给调用者值,并结束此函数
  • yield 返回给调用者值,并将指针停留在当前位置

4.send

  • send和next功能一样
  • 给上一个yield整体发送一个值
  • send不能给最后一个yield发送值
  • 获取第一个值的时候,不能用send 只能用next
     1 def gener():
     2     yield 222
     3     count = yield 333
     4     print('-------->',count)
     5     yield 'aaa'
     6     yield 'bbb'
     7 g = gener()
     8 print(g.__next__())
     9 print(g.send(None))
    10 print(g.send('AAAA'))
原文地址:https://www.cnblogs.com/xiaobin12126/p/8423755.html