zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    getaddrinfo()函数详解
    nm 命令 程序符号信息查看
    C# WebRequest处理Https请求
    正则表达式
    poj2762 Going from u to v or from v to u?
    Coroutine,你究竟干了什么?
    介绍几篇很有意思的计算机科普文章
    1005 Number Sequence(HDU)
    为什么读大学时做学术比搞项目重要?
    gcc中-pthread和-lpthread的区别
  • 原文地址:https://www.cnblogs.com/miloli/p/12375078.html
Copyright © 2011-2022 走看看