迭代器和生成器(python3入门)

#可迭代的对象:但凡数据类型可以执行__iter__()
# ''.__iter__()
# [].__iter__()
# (1,2).__iter__()
# {'x':1}.__iter__()
# {1,2,3}.__iter__()
# open('a.txt').__iter__()

#调用可迭代对象的__iter__()方法,会得到一个返回值,该返回值就是迭代器对象

#迭代器对象:既内置有__iter__()方法,又内置又__next__()方法.例如:文件本身就是迭代器对象
#迭代器总结:
#优点:1,提供了一种不依赖索引的迭代器取值方式
#       2,迭代器中不包含任何值,占用空间极小
#缺点:1,一次性,只能取一个,依此往后,无法预测迭代器对象中值的个数
#       2,无法取得指定的值,不如按索引/key 取值灵活

例如:
# dic = {'1':'aa','2':'bb','3':'cc'}
# iter_dic = dic.values().__iter__()
# print(iter_dic,type(iter_dic))
#
#
#
# try:
#     print(iter_dic.__next__())
#     print(iter_dic.__next__())
#     print(iter_dic.__next__())
#     print(iter_dic.__next__())
# except:StopIteration

# dic = {'1':'aa','2':'bb','3':'cc'}
# iter_dic = iter(dic)
# while 1:
#     try:
#         print(next(iter_dic))
#     except StopIteration:break



#生成器是一种自定义的迭代器
#在函数中但凡出现yield关键字,然后调用函数不会立即执行函数体代码,会得到一个返回值,该返回值称之为生成器
#即自定义的迭代器

#总结
#yield提供了一种迭代器的解决方案
#yield对比return,相同点:都能返回值,并且返回值没有类型和个数限制
#                        不同点:yield可以返回多次值,而return只能返回一次值


def my_range(start,stop,step):
    while start < stop:
        yield start
        start += step

res = my_range(1,10001,2)


while 1:
    try:
        print(next(res))
    except StopIteration:break



    

  

posted @ 2018-11-26 22:14  名叫蛐蛐的喵  阅读(148)  评论(0编辑  收藏  举报