码迷,mamicode.com
首页 > 编程语言 > 详细

python6_3 迭代器,生成器相关

时间:2018-08-11 01:19:28      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:表达   closed   分享图片   --   result   生成器   pre   内存   字符   

迭代器:不依赖索引的迭代取值方式 

可迭代对象:内置有__iter__方法对象

迭代器对象:执行可迭代对象__iter__()方法得到的返回值

      迭代器对象内置有__next__()方法和__iter()方法

有索引的数据类型:字符串,列表,元祖

没有索引:字典,集合,文件

技术分享图片
dic = {k1: v1, k2: v2}

dic_iter = dic.__iter__()

print(dic_iter.__next__())
View Code

 for循环的底层运行机制:

  1. 先调用in后那个对象的__iter__方法
  2. 执行迭代器对象的__next__方法,将得到的值赋值in前的变量名
  3. 循环往复

 迭代器的优缺点:

优点:

1.不依赖于索引取值

2.节省内存

缺点:

1.只能取一次值,除非重新得到新的迭代器对象

-----------------------------------------------------------------------------------------------------------------

生成器:自定义迭代器的方式。在函数内有yield关键字,得到一个返回值为生成器对象。

技术分享图片
def f1():
    print(first)
    yield 1
    print(second)
    yield 2
    print(third)
    yield

g=f1()
result=g.__next__()
print(result)
View Code

模拟一个range函数

def my_range(x, y, step=1):
while x < y:
yield x
x += step
else:
print(‘exception‘)


for item in my_range(1, 10, 2):
print(item)

总结yield:

1.自定义迭代器的方式

2.和return,都有返回值,return只能返回一次

 

生成器表达式:节省内存

代码1:

l1 = [a, b, c, d]
l2 = (i for i in l1 if i != a)

print(next(l2))

代码2:获取文件中最长一行的字符数

with open(a3.log, mode=rt, encoding=utf-8) as f:
    print(max(len(i) for i in f))

 

python6_3 迭代器,生成器相关

标签:表达   closed   分享图片   --   result   生成器   pre   内存   字符   

原文地址:https://www.cnblogs.com/cooky/p/9419920.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!