ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

可迭代对象、迭代器、生成器

2022-02-09 22:35:50  阅读:130  来源: 互联网

标签:__ 迭代 对象 res 生成器 next ---- print


1、可迭代对象: 

能够进行迭代逐一返回其成员项的对象(能够使用for进行循环输出)

可迭代对象的例子包括:

                                    1、所有序列类型 :如 `list`、 `str` 和 `tuple`  【序列:可通过每个值所在位置的编号(称为索引)访问】

                                    2、非序列类型: `dict`、`set`、`文件对象`

                                    3、实现了 `__iter__()` 方法的任意对象(可迭代协议),

                                    4、实现了序列语义的 `__getitem__()`方法的任意对象

注意点:实现了`__getitem__`方法的被称为可迭代对象(支持迭代操作),但不是Iterable类型

 

2、迭代协议、迭代器协议

迭代协议:对象定义了一个 `__iter__` 方法的,返回值必须是一个迭代器

迭代器协议: 迭代器协议由一个 `__iter__` 方法和`__next__`方法共同构成。实现了这两个方法的对象就实现了迭代器协议。

                    1、对象实现了迭代协议的对象

                     2、对象实现了`__next__`方法,`__next__`方法在迭代完所有数据之后,会抛出`StopIteration`的错误信息。

 

3、迭代器(Iterator):

                               1、实现了迭代器协议的对象,就是一个迭代器

                                2、所有的可迭代对象 都可以通过内置函数iter()转换为迭代器

                                3、迭代器对象能够使用 内置函数next 进行迭代操作

                                4、所有的迭代器都是可迭代对象,因为迭代器协议包含了迭代协议

 

dic4 = {'x': 'A', 'y': 'B', 'z': 'C'}
res = iter(dic4.keys())

print(isinstance(res, Iterable)) #True
print(isinstance(dic4, Iterator)) #False

print(next(res)) # x
print(next(res)) # y


li1 = iter([11, 22, 33, 44])

# 设置迭代操作的的起始位置
li1.__setstate__(2)
print(li1.__next__()) # 33
print(li1.__next__()) # 44

print(li1.__next__()) # StopIteration

 

4、生成器:

  1、生成器的定义:
      生成器表达式:  (i for i in range(10))
      生成器函数:  在函数中通过关键字yield来实现生成器函数

  2、生成器的迭代操作(生成数据)

      内置函数next()

  3、和生成器内部数据交互:

      send方法可以往生成器内部传递数据

def func01():
    print("----start----")
    yield
    print('----111----')
    yield 'python'
    print('----222----')
    yield 'java'
    print('----333----')
    yield
    print("----end------")

res = func01()
r1 = next(res)
print(r1)
r2 = next(res)
print(r2)
r3 = next(res)
print(r3)
r4 = next(res)
print(r4)
r5 = next(res)
print(r5)

----start----
None
----111----
python
----222----
java
----333----
None
----end------

StopIteration

def func01():
    for i in range(100):
        s = yield i
        print('s:', s) 


g1 = func01()
next(g1)  #使用send方法,之前必须有next()启动生成器,不然无法传值

res = g1.send('python') 
print('res:', res) # res=1  s=python   ;send()函数的值直接给s, res=yield i
res = g1.send('java') print('res2:', res) # res=2  s=java

 

标签:__,迭代,对象,res,生成器,next,----,print
来源: https://www.cnblogs.com/shibei/p/15877053.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有