可迭代的对象、迭代器和生成器

迭代是访问集合元素的一种方式。

  • 迭代器
    是一个可以记住遍历的位置的对象,迭代器的对象是从集合的第一个元素开始访问,直到所有的元素被访问结束,迭代器只能往前不能往后。
  • 可迭代的对象
    使用for … in …的循环语法从其中依次拿到数据进行使用,把这样的过程叫做迭代
    只有可迭代对象才可以迭代(tuple\list\str等类型的数据)

迭代器一定是可迭代对象,是可迭代对象不一定是迭代器
以下为自定义的一个可迭代对象及迭代器

class Classmate(object):
    def __init__(self):
        self.names=list()
        self.num=0
    def add(self,name):
        self.names.append(name)
    def __iter__(self):
        return self
    def __next__(self):
        if self.num < len(self.names):
            ret = self.names[self.num]
            self.num += 1
            return ret
        else:
            raise StopIteration
for name in a:
   time.sleep(1)

两者之间的联系以for循环为例

for x in obj:
	pass
1.判断obj是否是可以迭代->可迭代对象(具有iter方法)
2.在1的成立条件下,调用iter函数得到obj对象的iter方法返回值
3.在得到iter方法的返回值是一个迭代器 ->(具有iter 和next方法)

总结:一个类有__iter__方法就是一个可迭代对象,同时具有__iter__和__next__方法就是迭代器

  • 生成器
    是一个特殊的迭代器
  1. 创建方法1:把一个列表生成式[ ]改成() nums =(x for x in range(10))
  2. 创建方式2:使用函数具有yield则就是一个生成器
def nums(all_num):
    a, b=0, 1
    curr_num=0
    while curr_num<all_num:
        yield a#如果一个函数中有yield语句 则不是一个函数 是一个生成器
        a,b=b,a+b
        curr_num+=1
#调用时发现函数中有yield那么则是创建一个生成器的对象
t=nums(10)
for z in t:
    print(z)

yield与return的对比

  • yieid 会暂停函数的运行,返回当前数据,执行 next方法,函数会从暂停的位置继续向下执行
  • return 会打断函数的运行,返回结果,再次运行函数,会从头开始重新执行
  • yieid 相同条件多次执行可以返回一组有关联的数据
  • return 相同条件多次执行返回同一结果
  • yieid 和 return 联用只有python3 支持,并且执行到return 会抛出StopIteration 异常
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值