程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(2)

python学习-38迭代器和生成器

发布于2019-08-07 10:14     阅读(758)     评论(0)     点赞(4)     收藏(4)


迭代器和生成器



---- 迭代器协议和for循环工作机制

1.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个Stoplteration异常,以终止迭代(只能往后走,不能往前走)
2.可迭代对象:实现了迭代器的对象(如何实现:对象内部定义一个_iter_()方法)
3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如:for循环,sum,min,max函数等)使用迭代器协议访问对象。
dic ={'a':1,'b':2}
iter_d=dic.__iter__()              # 相当于for循环的迭代。 列表,字典,文件等有_iter_()方法的都可以
print(iter_d.__next__())
    

for循环的本质:循环所有对象,全部都是使用的迭代协议

-for循环机制也可以用while表示

a=[1,2,3,4,5]
iter_a=a.__iter__()
while True:
    try:
        print(iter_a.__next__())
    except StopAsyncIteration:
         print('迭代完毕,循环终止')
         break

-迭代器原理

1.

a = [1,2,3,4,5]
iter_a=a.__iter__()          # 切换为迭代器形式

print(iter_a.__next__())
print(iter_a.__next__())
print(iter_a.__next__())
print(iter_a.__next__())
print(iter_a.__next__())

运行结果:

1
2
3
4
5

Process finished with exit code 0

2.用next方法

a = [1,2,3,4,5]
iter_a=a.__iter__()          # 切换为迭代器形式

print(next(iter_a))
print(next(iter_a))
print(next(iter_a))
print(next(iter_a))
print(next(iter_a))

 

运行结果是一样的

 

只要遵循迭代器协议,那就是可迭代对象。

 

 

 

------ 初识生成器

 

可以理解为一种数据类型。这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的_iter_方法),所以生成器就是可迭代对象。

 

--生成器表现形式:

1.生成器函数

 

def test():
    yield 1
g=test()
print(g)      # 生成器内存地址
print(g.__next__())

运行结果:

<generator object test at 0x0000023EBB890B10>1

Process finished with exit code 0

 

2.生成器表达式

res=(i for i in range(11))
print(res.__next__())
print(res.__next__())

运行结果:

0
1

Process finished with exit code 0

 

ps:

三元表达式

name='john'
res='1' if name == 'john' else'2'  #如果name='john',返回1,不是则返回2
print(res)

运行结果:

1

Process finished with exit code 0

 



所属网站分类: 技术文章 > 博客

作者:急流勇退

链接:https://www.pythonheidong.com/blog/article/9706/ec654acede47a4e298f3/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

4 0
收藏该文
已收藏

评论内容:(最多支持255个字符)