python - 内置类型 之 迭代器类型

目录

一、迭代器iterator

1.理解迭代器

2.迭代器函数iter和next

3.迭代器运用案例

二、生成器generator

1.理解生成器

2.创建生成器

3.yield函数


 

一、迭代器iterator

1.理解迭代器

(1)什么是迭代器

  • 迭代器也称迭代对象,指可for .. in ..等语句进行循环,这样的过程叫迭代,该对象称为迭代对象
  • 迭代器用于迭代数据,记录每次访问的数据,以及返回下一个数据,用__next__取下一个指向的值

(2)可迭代对象有哪些

  • 列表,元祖,字典,字符串,set集合等都是可迭代对象

(3)通过isinstance()来判断一个对象是否是迭代对象

 

2.迭代器函数iter和next

(1)iter(iterable)

  • 从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象

(2)next(iterator)

  • 从迭代器iterator中获取下一了记录,如果无法获取下一条记录,则触发stoptrerator异常
  • 注意:迭代器只能往前取值,不会后退

 

3.迭代器运用案例

(1)创建迭代器

l = [1,3,5,7]

it = iter(l)

next(it) #1

next(it) #3

next(it) #5

next(it) #7

next(it) #StopIterable 异常

(2)用迭代器轮循列表

l = [2,3,5,7]
it = iter(l)
while True:
    try:
        x = next(it) #获取一个数据并绑定到x
        print(x)     #2,3,5,7
    except StopIteration:
        break

(3)自定义可迭代的类

  • 在类中添加了__iter__方法即取得迭代器
  • 在通过__next__方法指出所有的数据
class Fab(object):
    def __init__(self, max):
        self.max = max
        self.n, self.a, self.b = 0, 0, 1

    def __iter__(self):
        """返回一个迭代器"""
        return self

    def __next__(self):
        """返回迭代器下一个指向的值"""
        if self.n < self.max:
            r = self.b
            self.a, self.b = self.b, self.a + self.b
            self.n = self.n + 1
            return r
        else:
            raise StopIteration()

if __name__=='__main__':
    for key in Fab(5):
        print(key)

 

二、生成器generator

1.理解生成器

  • 生成器有什么作用: 省内存

  • 生成器一次只能返回一个值,将大大减小占用内存,而且允许调用函数快速的处理前几个返回值,因此生成器看起来像函数,但表现得却像迭代器

 

2.创建生成器

(1)把列表的[]改为()就创建generator

lis = [x*x for x in range(10)]
print(lis)
#[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

#生成器
generator_ex = (x*x for x in range(10))
print(generator_ex)
# <generator object <genexpr> at 0x000002A4CBF9EBA0>

使用next(generator_ex)函数获得generator的下一个返回值
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
结果:
0
1
4

每次调用next()就返回generator的下一个值,多次调用next()直到最后一个元素,若再调用next()则抛出StopIteration的错误

所以正确的方法是使用for循环,因为generator也是可迭代对象,所以我们创建一个generator后,基本上永远不会调用next(),而是通过for循环来迭代

#生成器

generator_ex = (x*x for x in range(10))

for i in generator_ex:

    print(i)

 

3.yield函数

  • yield 函数创建生成器generator。yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。
  • send()和next()一样,都能让生成器继续往下走一步(下次遇到yield停),但send()能传一个值,这个值作为yield表达式整体的结果
  • 例子:
def fib(max):
    n,a,b =0,0,1
    while n < max:
        yield b
        a,b =b,a+b
        n = n+1
    return 'done'
for i in fib(6):
    print(i)

结果:
1
1
2
3
5
8


def fib(max):
    n,a,b =0,0,1
    while n < max:
        yield b
        a,b =b,a+b
        n = n+1
    return 'done'
g = fib(6)
while True:
    try:
        x = next(g)
        print('generator: ',x)
    except StopIteration as e:
        print("生成器返回值:",e.value)
        break

结果:
generator:  1
generator:  1
generator:  2
generator:  3
generator:  5
generator:  8
生成器返回值: done

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值