迭代器和生成器

#usr/bin/python
#-*-coding:utf-8-*-
# 迭代器  访问集合元素的方式之一
迭代器有两个基本的方法:__iter__()和__next__().
__iter__方法:返回迭代器自身。可以通过python内建函数iter()调用
__next__方法:当next方法被调用时,迭代器会返回它的下一个值,如果next方法
被调用,但迭代器没有值可以返回,会引发StopIteration异常。



# 自定义一个迭代器有3种方法,
1:为容器对象添加__iter__()和__next__()方法
2:内置函数iter()将可迭代对象转化为迭代器
3:就是生成器(generator).生成器通过yield语句快速生成迭代器
# class Container:
#     def __init__(self,sta,end):
#         self.sta=sta
#         self.end=end
#     def __iter__(self):
#         print('调用了__iter__(self)方法')
#         return self#返回迭代器 对象本身
#     def __next__(self):
#         '''
#         self.sta 既是开始位置,也是记录位置的状态
#         :return:
#         '''
#         if self.sta#             i=self.sta
#             self.sta=self.sta+1
#             return i
#         else:
#             raise StopIteration()
# cont=iter(Container(0,10))
# for i in cont:
#     print(i)


# 生成器:generator
# 第一种方法:推导
nums=(x for x in range(10))
print(nums)
print(next(nums))
print(next(nums))
print('么么哒')
print(next(nums))

输出结果为:
0
1
么么哒
2

# 斐波那切数列
# 1 1 2 3 5 8 13 21 34
import collections
print('可迭代元素',isinstance([],collections.Iterable))
print(isinstance(iter([]),collections.Iterator))#迭代器
print(isinstance(iter([]),collections.Iterable))#迭代元素
print(isinstance([],collections.Iterator))
print(isinstance((x * x for x in range(10)),collections.Iterable))

输出结果为:
可迭代元素 True
True
True
False
True

def pt(x):
  for i in range(x):
    yield i
p=pt(10)
p1=pt(20)
for i in p:
    print(i,end='')
print()
for i in p1:
    print(i,end='')

输出结果为:

0123456789
012345678910111213141516171819

你可能感兴趣的:(迭代器和生成器)