python基础(三)闭包、装饰器、迭代器、生成器

闭包(closure): 内嵌函数通过调用外部嵌套函数作用域内的变量,则这个内嵌函数就是闭包.

闭包必须满足三个条件:

  • 必须有一个内嵌函数
  • 内嵌函数必须引用外部嵌套函数中的变量
  • 外部函数的返回值必须是内嵌函数
eg:
def make_power(y):
    def fn(x):
        return x ** y
    return fn
    
pow = make_power(2)
print pow(5) #25  
#声明pow时返回了函数fn并将2作为嵌套函数的参数传入
#闭包内嵌套函数传递参数时,参数保留

装饰器(decorators):是一个函数,主要作用为包装一个函数或类.包装的目的是在不改变函数名的情况下改变被包装对象的行为

eg:
def priv_check(fn):
    def fx(name,x):
        print ('权限校验')
        fn(name,x)
    return fx

@priv_check    
def save_money(name,x):
    print('存钱')
    
@priv_check
def withdraw(name,x):
    print('取钱')
    
save_money('tiny',100)
withdrwa('tim',50)

迭代器: 访问可迭代对象的一种方式,用迭代器可返回可迭代对象.

迭代器函数iter和next:

iter(iterable):从可迭代对象中返回一个迭代器,iterable必须是一个能提供迭代器的对象
next(iterator):从迭代器iterator中获取下一个记录,如果无法获取,则触发StopIteration异常

说明:
迭代器只能往前取值,不会后退
用iter函数可以返回一个可迭代对象的迭代器

eg:
    L = [2,3]
    it = iter(L)   #用iter返回一个迭代器用it绑定
    next(it)       #2 #用next函数来获取L中的元素
    next(it)       #3    
    next(it)       #StopIteration #通知next调用者,已无数据

生成器:能够动态提供数据的对象,生成器对象也是可迭代对象。

生成器有两种,分别是生成器函数和生成器表达式

生成器函数:含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象

yield语句:
语法:
yield 表达式
说明:
yield用于def函数中,目的是将此函数作为生成器函数使用
yield用来生成数据,供next()函数使用

eg:
    def gen_yield():
        yield 2
        yield 4
        print('test')
    
    gen = gen_yield()
    it = iter(gen)      #返回一个迭代器
    next(it)            #2
    next(it)            #4
    next(it)            #test #StopIteration
原文地址:https://www.cnblogs.com/miloli/p/12375078.html