博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python迭代器与生成器
阅读量:7105 次
发布时间:2019-06-28

本文共 2256 字,大约阅读时间需要 7 分钟。

1. 迭代器

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

迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter()next()
可迭代对象Iterable包括:

  • 列表、元组、字典、集合(set)、字符串
  • 生成器(generator)
>>> from collections import Iterable>>> isinstance([], Iterable) # 判断一个对象是否可迭代True>>> isinstance({}, Iterable)True>>> isinstance('abc', Iterable)True>>> isinstance(100, Iterable)False
>>>list=[1,2,3,4]>>> it = iter(list)    # 创建迭代器对象>>> print (next(it))   # 输出迭代器的下一个元素1>>> print (next(it))2

迭代器对象可以使用常规for语句进行遍历。

list=[1,2,3,4]it = iter(list)    # 创建迭代器对象for x in it:    print (x, end=" ")    # 1 2 3 4

把一个类作为一个迭代器使用需要在类中实现两个方法__iter__()__next__()

class MyNumbers:    def __iter__(self):        self.a = 1        return self     def __next__(self):        if self.a <= 5:            x = self.a            self.a += 1            return x        else:            raise StopIteration myclass = MyNumbers()myiter = iter(myclass) for x in myiter:    print(x)# 1# 2# 3# 4# 5

StopIteration异常用于标识迭代的完成,防止出现无限循环的情况,在__next__()方法中我们可以设置在完成指定循环次数后触发StopIteration异常来结束迭代。

2. 生成器

生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

2.1 创建生成器的简单方法

>>> L = [x * x for x in range(6)]>>> L[0, 1, 4, 9, 16, 25]>>> g = (x * x for x in range(6)) # 创建生成器>>> g
at 0x00000231F9699308>
>>> g = (x * x for x in range(6)) # 创建生成器>>> next(g)0>>> next(g)1>>> next(g)4>>> next(g)9>>> next(g)16>>> next(g)25>>> next(g)Traceback (most recent call last):  File "
", line 1, in
next(g)StopIteration

因为生成器(generator)是一个可迭代对象,所以可以使用for循环。

>>> g = (x * x for x in range(6)) # 创建生成器>>> for n in g:        print(n)    01491625

2.2 使用函数来实现生成器

def fib(max):    n, a, b = 0, 0, 1    while n < max:        yield b        a, b = b, a + b # 相当于依次执行 a = b 和 b = a + b        n = n + 1    return 'done'    for n in fib(6):    print(n)# 1# 1# 2# 3# 5# 8

通过捕获StopIteration错误,在StopIteration的value中拿到生成器的返回值。

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(x)    except StopIteration as e:        print('Generator return value:', e.value)        break# 1# 1# 2# 3# 5# 8# Generator return value: done

参考资料:

转载于:https://www.cnblogs.com/gzhjj/p/10661090.html

你可能感兴趣的文章
正在学习linux的我写一封信给十年后的自己
查看>>
利用scp 远程上传下载文件/文件夹
查看>>
Android的View坐标学习
查看>>
Windows下无窗口后台运行程序: ShellExecute
查看>>
在windows下使用OpenSSH(上)
查看>>
H5实现之登录模版的实现
查看>>
读《美丽新世界》
查看>>
第三章 spring-bean之DefaultListableBeanFactory(7)
查看>>
netty http2设计深入讲解
查看>>
一、RabbitMQ核心概念
查看>>
SQL2008导入数据库,标识规范 都否的解决办法
查看>>
learning
查看>>
kafka 基础01
查看>>
UIScrollView实现图片循环滚动
查看>>
我的友情链接
查看>>
王垠:怎样写一个解释器
查看>>
解决unicodedecodeerror ascii codec can’t decode byte 0xd7 in position 9 ordinal not in range(128)...
查看>>
Redis和Memcached的区别
查看>>
Mysql 5.7.20 源码安装笔记
查看>>
CSS选择器种类及介绍
查看>>