嵌套函数作用域
def make_adder(augend):
def add(addend):
return augend + addend
return add
内部的函数可以访问外部函数scope内的变量,但是不能够重新对其赋值。如果重新赋值那么会在内部函数的scope内创建一个同名的本地变量(Python不允许对non-local变量赋值)。
yield和生成器(generator)
generator是通过执行generator function来创建的。generator function是函数体中有yield语句的函数。generator的用途是用来生成一系列的值,generator.next()可以获取到下一个值,注意,由此可以看出generator是可以迭代的(iterable),所以可以使用for...in语句来遍历generator能够生成的所有值。
with语句和context manager
介绍with语句之前首先要介绍context manager。context manager是有两个特殊方法(__enter__()和__exit__())的类。以下面的with语句为例:
with open('data.txt') as f: lines = f.readlines()
上面的代码其实就等同于:
f = open('data.txt') try: lines = f.readlines() finally: f.close()
open()函数打开一个文件,返回一个file对象,file类就是一个context manager。在进入到 lines = f.readlines() 之前 ,会先执行file.__enter__()方法,该方法返回self,也就是file对象本身。然后在退出with语句块(lines = f.readlines())之前执行file.__exit__(type,value,traceback)方法。with语句的好处是通过context manager封装了try...finally语句,起到代码重用的目的。