python迭代器、生成器

迭代器(iterator)

什么是迭代器?

他是一个带状态的对象,任何实现了__iter__()__next__()方法的对象都是迭代器。

iter()返回迭代器自身,next()返回容器的下一个值,如果没有更多元素,则抛出StopIteration异常

例如,自定义斐波那契数列迭代器如下:

class Fib:
    def __init__(self):
        self.prev = 0
        self.curr = 1

    def __iter__(self):
        return self

    def __next__(self):
        value = self.curr
        self.curr += self.prev
        self.prev = value
        return value

>>> fib = Fib()
>>> list(islice(fib, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

生成器

生成器是一种特殊的迭代器,不过这种迭代器更加优雅。
生成器不需要 __iter__()__next__()方法,只需要一个yield关键词。

还是以斐波那契数列为例,使用生成器实现:

def fib():
    prev, curr = 0, 1
    while True:
        yield curr
        prev, curr = curr, prev + curr

>>> f = fib()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

生成器表达式

生成器表达式是列表解析式的生成器版本,看起来像列表推导式,但是它返回的是一个生成器对象而不是列表对象。

>>> a = (x*x for x in range(10))
>>> a
 at 0x401f08>
>>> sum(a)
285

上下文管理器

Python 提供了 with 语法用于简化资源操作的后续清除操作,是 try/finally 的替代方法,实现原理建立在上下文管理器之上。此外,Python 还提供了一个 contextmanager 装饰器,更进一步简化上下管理器的实现方式。

任何实现了__enter__()__exit__()方法的对象都可称为上下文管理器。
上下文管理器可以使用with关键词。

Python中可以使用with关键词的对象有: 文件对象。。。

如我们实现一个File类,让其实现__enter__()__exit()方法:

class File(object):
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode

    def __enter__(self):
        print('Entering')
        self.f = open(self.filename, self.mode)

    def __exit__(self):
        print("Will exit")
        self.f.close()

__enter__() 方法返回资源对象,这里就是你将要打开的那个文件对象,__exit__() 方法处理一些清除工作。

因为 File 类实现了上下文管理器,现在就可以使用 with 语句了。

with File('out.txt', 'w') as f:
    print("writing")
    f.write('hello, python')

contexlib

Python 还提供了一个 contextmanager 的装饰器,更进一步简化了上下文管理器的实现方式。通过 yield 将函数分割成两部分,yield 之前的语句在 __enter__ 方法中执行,yield 之后的语句在 __exit__ 方法中执行。紧跟在 yield 后面的值是函数的返回值。

from contextlib import contextmanager

@contextmanager
def my_open(path, mode):
    f = open(path, mode)
    yield f
    f.close()

调用

with my_open('out.txt', 'w') as f:
    f.write("hello , the simplest context manager")

错误与异常

异常:程序出现错误,而在正常控制流以外采取的行为

Python中的异常

  • IOError:输入输出错误,如打开一个不存在的磁盘文件
  • AttributeError:尝试访问未知的对象属性
  • NameError:尝试访问一个未申明的变量
  • ZeroDivisionError:除数为零
  • SyntaxError:Python解析器语法错误
  • IndexError:请求的索引超出范围
  • KeyError:请求的关键词不存在与字典

检测与处理异常

try-except

示例:

try:
    file = open("testfile", "w")
    file.write("ceshi")
except (IOError, RuntimeError):
    print("Error: 没有找到文件或读取文件失败")
except Exception as e:
    print("Error:出错")
finally:
    print("内容写入成功。")
    fh.close()

抛出异常

示例:

def functionName(level):
    ...
    raise Exception("Invalid level!", level)

参考文献

Was this helpful?

0 / 0

发表回复 0