迭代器(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)
参考文献
- 完全理解Python迭代器与生成器
- 如何正确理解With与上下文管理器
- [Python核心编程]()
Was this helpful?
0 / 0