python 迭代器和解析

1.概念区分

首先区分一下容器(container)、可迭代对象(iterable)、迭代器(iterator)、生成器(generator)这些概念。

容器(container)
把多个元素组织在一起的数据结构,元素可以逐个迭代的获取,通过in,not in 关键字判断元素是否在容器中。
常见的容器对象有:
· list,deque
· set,frozensets
· dict,ordereddict,counter
· tuple,namedtuple
· string

迭代器(iterator)
迭代器,内部持有一个状态,记录了当前迭代所在位置,在调用next()方法时返回容器中下一个元素。
任何实现了__iter_()和__next__()方法的对象都是迭代器。__iter__返回迭代器自身,__next__返回下一个元素

可迭代对象(iterable)
很多容器都是可迭代对象,例如list,set,dict等,此外打开状态的files,sockets也是可迭代对象。
可迭代对象实现了__iter__()方法,该方法返回一个迭代器

x = [1,2,3]
y = iter(x)
next(y)
>1
next(y)
>2
type(x)
><class 'list'>
type(y)
><class 'list_iterator'>

如下图,这个例子中x是一个可迭代对象y是一个迭代器
这里写图片描述

生成器
是一种特殊的迭代器,效果是延迟创建值。
有两种类型的生成器:
1) 含yeild关键字的函数
特点:没有返回值,使用yeild关键字
例如,生成斐波那契数列

def fib(n):
    prev, cur = 0,1
    while True:
        yeild cur
        prev, cur = cur, prev + cur

2)生成器表达式

 z=(i+1 for i in range(5))
 z
 <generator object <genexpr> at 0x0000000003596A20>

生成器使用常见场景:

#使用返回值的写法
def fun(x):
    result = []
    for ... in x:
        result.append(...)
    return result

#生成器的写法
def fun2(x):
    for ... in x:
        yeild ...

2、总结

· 容器是一系列元素的集合,容器都可以被迭代(用在for,while等语句中),因此他们被称为可迭代对象。

· 可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。

· 迭代器持有一个内部状态的字段,记录下次迭代返回值,迭代器不会一次性把所有元素加载到内存,而是需要的时候才生成返回结果。

· 生成器是一种特殊的迭代器,它的返回值不是通过return而是用yield。

参考博客:http://python.jobbole.com/87805/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值