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@contextmanagerdef 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