python三大器之 迭代器与生成器

1.迭代器 

迭代器的两种生成方式:

方式一:可迭代对象调用iter_obj = obj.__iter__()

方式二:  使用生成器    yield    产生迭代器 

'''
1.迭代器
2.生成器
3.三元表达式
4.列表生成式
5.递归与二分法
6.匿名函数
7.内置函数
'''
# 迭代器:迭代的工具

# 1.什么是迭代:指的是一个重复的过程,每一次重复称为一次迭代,
#               并且每一次重复的结果是下一次重复的初始值

l = ['a','b','c']
count = 0
while  count < len(l):
    print(l[count])
    count+=1

# 2.为什么要有迭代器?
# 对于序列类型:str,list,tuple,可以依赖索引来迭代取值
# 但是对于dict,set,文件,python必须给我们提供一种不依赖于索引的迭代取值方式


#3. 可迭代对象(下列都是):obj.__iter__   :凡是有__iter__方法的都是可迭代对象
name = 'egon'
l = [1,2,3]
t = (1,2,3)
d = {'name':'egon','age':18,'sex':'male'}
s = {'a','b','c'}
f = open('a.text','w',encoding='utf-8')
name.__iter__
l.__iter__
t.__iter__
d.__iter__
s.__iter__
f.__iter__




#4. 迭代器对象(文件是):obj.__next__,obj.__iter__
f.__iter__
f.__next__
# 总结:
# 1.可迭代对象不一定是迭代器对象   比如列表必须调用iter方法,才能生成迭代器    
# 2.迭代器对象一定是可迭代对象    文件是迭代器  既有iter方法,也有next方法
# 3. 调用__iter__()方法,得到是迭代器对象(迭代器对象调用iter方法得到的是其本身)


# d = {'name':'egon','age':18,'sex':'male'}
# d_iter = d.__iter__()

# f = open('a.text','w',encoding='utf-8')
# f_iter = f.__iter__().__iter__().__iter__()
# print(f_iter is f)

# d = {'name':'egon','age':18,'sex':'male'}
# d_iter = d.__iter__()
# print(d_iter.__next__())
# print(d_iter.__next__())
# print(d_iter.__next__())
# print(d_iter.__next__())   #迭代器d_iter没有值了,就会抛出异常StopIteration

# f = open('a.text','r',encoding='utf-8')
# print(f.__next__())   #一行一行取
# print(f.__next__())
# print(f.__next__())
# print(f.__next__())

# l = ['a','b','c']
# l_iter = l.__iter__()
# print(l_iter.__next__())
# print(l_iter.__next__())
# print(l_iter.__next__())
# print(l_iter.__next__())

# d = {'name':'egon','age':10,'sex':'male'}
# d_iter = iter(d)   # d_iter = d.__iter()__
# # len(obj) 等同于 obj.__len()__
#
#
# while True:
#     try:
#         print(next(d_iter))
#     except StopIteration:
#         break

#for 循环迭代原理
# 1.调用in 后的obj.__iter__()
# 2.k = obj_iter.__next__()
# 3. 捕捉StopIteration异常,结束迭代

d = {'name':'egon','age':10,'sex':'male'}
for k in d:
    print(k)

# 总结:迭代器的优缺点
# 优点:
# 1.提供一种统一的不依赖于索引的取值方式,为for循环的实现提供了依据
# 2.迭代器同一时间在内存中只有一个值,更节省内存空间
# 
# 缺点:
# 1. 只能往后取,并且是一次性的,不能依赖索引取到某个值
# 2. 无法统计长度,没有len方法

 

2.生成器

生成器表达式: g = ('egg%s'i  for i in range(5))

# 1.什么是生成器:只要函数体内出现yield关键字,那么再执行函数就不会执行函数体代码,会得到一个结果,该结果就是生成器

def func():
    print('===1')
    yield
    print('====2')
    yield
    print('====3')

#生成器就是迭代器
g = func()

res1 = next(g)
print(res1)

res2 = next(g)
print(res2)

res3 = next(g)
print(res3)

#yield功能
#1.yield 为我们一种自定义迭代器的方法
#2.yield与return的区别:1.yield可以返回多次值  2.函数暂停与再继续的状态是由yield帮我们保存的

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

g = my_range(1,5,2)
print(next(g))
print(next(g))

for i in my_range(1,5,2):
    print(i)
    

 

posted @ 2019-11-15 15:31  躺云飘  阅读(185)  评论(0编辑  收藏  举报