生成器和迭代器

1.  Iterator(迭代器)

举例:

我们对list使用for

for i in [1,2,3,4]:
    print(i)

1
2
3
4

 对string对象使用for

for ch in 'python':
    print(ch)

p
y
t
h
o
n

 对字典对象使用for

for k in {'x':1,'y':2}:
    print(k)

y
x

对文件使用for

for line in open('a.text'):
    print(line)

fisrt line
second line

 这样的可以用for循环来操作的对象称为可迭代对象

内置函数 iter() 需要一个可迭代的对象作为参数生成一个迭代器:迭代器的作用就是除了具有for循环方法之外,还有函数自带的next()方法  (python3内置函数调是__next__()方式,是属于迭代器的属性)。

>>> x = iter([1,2,3])
>>> x
<list_iterator object at 0x000001EA3A46D6D8>
>>> x.__next__()
1
>>> x.__next__()
2
>>> x.__next__()
3
>>> x.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration


也可以用类的定义来定义next()方法来调用

class Iter:
    def __init__(self,n):
        self.i = 0
        self.n = n
    def __iter__(self):
        return self
    def next(self):
        if self.i <self.n:
            i = self.i
            self.i += 1
            return i
        else:
            raise StopIteration()

2.Generator(生成器)

什么是生成器?一句话,生成器本质就是迭器。生成器是连续生成一堆结果的函数(不是单个值),有关键字yield带领

def foo():
    print('begin')
    for i in range(4):
        print('before yield',i)
        yield i
        print('after yield',i)
    print('end')


>>> f = foo()
>>> f.__next__()
begin
before yield 0
0
>>> f.__next__()
after yield 0
before yield 1
1
>>> f.__next__()
after yield 1
before yield 2
2
>>> f.__next__()
after yield 2
end
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

 yield 的作用是一个开关一样,你调用next()是,会生成值输出,然后整个函数停在yield所在地,也就是后面的print()不运行。当下次调用yield时,从上一次暂停的地方开始,开始循环,再次到yield处。

3.生成器表达式(生成器版本的列表集合)

本质是列表,但是不返回列表,返回一个列表生成器,也就是一个关着的list。

>>> a = (x*x for x in range(5))
>>> a
<generator object <genexpr> at 0x000001EA3A449660>
>>> sum(a)
30
>>>

4.Itertools 这是标准库里面的模块,包含很多迭代器操作函数

chain(链子)-将两个迭代器加在一起

>>> it1 = iter([1,2,3])
>>> it2 = iter([4,5,6])
>>> itertools.chain(it1,it2)
[1,2,3,4,5,6]

izip -迭代版本的zip

>>> for x,y in itertools.izip(['a','b','c'],[1,2,3]):
...        print(x,y)
...
a 1
b 2
c 3

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值