玩转迭代器和生成器

1.迭代器

一、迭代器的概念

 迭代器即迭代的工具,那什么是迭代呢?

迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
# 比如
while True:
        print('你好,你是谁')
# 上面这个不是迭代器,单纯的循环不是迭代器的体现


# 先定义一个列表
ls = [1,2,3,4,5]

count = 0

while count < len(ls):   # 这里才是迭代的表现
        print(ls[count])
        count +=1

二、迭代器怎么使用?可迭代对象和迭代器对象是什么?

# 迭代器应该怎么使用呢?
# 在我们学过的数据类型中,字符串、列表和元组都是有序的数据类型,对于有序的数据类型,我们通常通过索引来取值;然而,对于字典,集合和文件类型来说,它们都是无序的,所以不能够通过索引来取值,因此,对于迭代器来说,他就是不依赖索引来取值的。

# 那么什么又是可迭代对象呢?
# 可迭代对象有以下的特点:就是他的内置功能中存在__iter__()方法,类似于obj.__iter__().列如:

'strnaem123'.__iter__()
[1,2,3,4,5].__iter__()
(1,2,3,4,5).__iter__()
{'a':1,'b':2}.__iter__()
open('user.txt').__iter__()

# 那么什么是迭代器对象呢?
# 类似于可迭代对象来说,可迭代对象的迭代结果就是迭代器对象,因此,迭代器对象中既存在可迭代对象的方法__iter__(),也存在__next__()方法。列如:

open('user.txt').__iter__()
open('user.txt').__next__()

# 所以说,可迭代对象不一定是迭代器对象,但是迭代器对象百分之百是可迭代对象,毋庸置疑的存在。

三、使用迭代器的案列

# 定义一个字典,本身是一个可迭代对象
dic = {'a':1,'b':2,'3':3}

info = dic.__iter__()   # 得到的是迭代器对象,但是对于迭代器来说,对于迭代器来说使用__iter__()就是迭代器的本身了。


print(info.__next__())
print(info.__next__())
print(info.__next__())
print(info.__next__())  # 首先在定义字典中本身就存在三个值,在经过上面的迭代器对象的方法后,这里继续取值就睡报错了


# 我们通过抛出异常来处理报错
while True:
      try:
            mm= info.__next__()
            print(dic[mm])
      Exception:
            break

#  但是如果每次都这样的话,我就很烦,对于程序员懒惰的群体来说,这太复杂了,必定会寻求简单的方法,取而代替。


# 那就是for循环了
ls = {'a':1,'b':2,'c':3}

for k in ls:
    print(ls[k])  # 这样就会很简单了

四、使用迭代器的优缺点

# 优点:可以不依赖索引进行取值
# 缺点:不能够计算数据的长度,不能根据索引进行取值(只能从前往后依次进行取值)

五、生成器

# 什么是生成器?
# 只要在定义的函数里出现了yeild关键字,那么这个函数的返回就是一个生成器,也不会执行函数里的代码。
# 列如:
def my_range(min, max=0, step=1):
    if max == 0:
        min, max = max, min
    tag = min
    while True:
        tag += step
        if tag >= max:
            break
        yield tag


# range_obj = my_range()
# print(range_obj.__next__())
# print(range_obj.__next__())
# print(range_obj.__next__())

for i in my_range(10):
    print(i)

 

 

 

 

posted on 2019-04-03 15:34  程序小王的生命周期  阅读(142)  评论(0编辑  收藏  举报

导航