zoukankan      html  css  js  c++  java
  • 07_Python_迭代器、生成器、装饰器、闭包

    1、迭代器

    1.1、迭代器简介

    • 迭代器就是用于迭代操作(for 循环)的对象,它像列表一样可以迭代获取其中的每一个元素,任何实现了 next 方法 (python2 是 next)的对象都可以称为迭代器。

    【它基于两个方法】

    • next 返回容器的下一个项目
    • _ iter _ 返回迭代器本身

    1.2、可迭代对象

    • 表面来看,只要可以用 for...in...进行遍历的对象就是可迭代对象 。
    • 语法层面,如果一个对象实现了__iter__方法,那么这个对象就是可迭代对象。

    2、生成器

    2.1、生成器简介

    • 生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中。另外,对于生成器的特殊语法支持使得编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一。

    2.2、创建一个生成器

    def generator_function():
        for i in range(10):
            yield i
    
    
    for i in generator_function():
        print(i)
    

    3、装饰器

    3.1、装饰器简介

    • 装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数

    3.2、简单装饰器实例

    #定义一个函数装饰器
    def foo(func):
        def wrapper(*args, **kw):
            print('装饰器 runing')
            f = func(*args, **kw)
            print('装饰器 ending')
            return f
    
        return wrapper
    
    
    @foo    #使用装饰器
    def bar():
        print('bar')
    
    if __name__ == '__main__':
        bar()
    
    
    # 输出结果:
    '''
    类装饰器 runing
    bar
    类装饰器 ending
    '''
    

    3.3、类装饰器实例

    • 使用类装饰器主要依靠类的__call__方法,当使用 @ 形式将装饰器附加到函数上时,就会调用此方法。
    # 定义一个类装饰器
    class Foo(object):
        def __init__(self, func):
            self._func = func
    
        def __call__(self):
            print ('类装饰器 runing')
            self._func()
            print ('类装饰器 ending')
    
    @Foo
    def bar():
        print ('bar')
    
    if __name__ == '__main__':
        bar()
        
    # 输出结果:
    '''
    类装饰器 runing
    bar
    类装饰器 ending
    '''
    

    4、闭包

    4.1、什么是闭包

    • 在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。
    • 简单来说就是,局部函数,它可以作为另外一个函数的返回值返回。

    4.2、闭包实例

    def func(name):
        def inner_func(age):
            print('name:', name, 'age:', age)
    
        return inner_func
    
    
    if __name__ == '__main__':
        tom = func('tom')
        tom(10)
        
    # 输出结果:
    '''
    name: tom age: 10
    '''
    
  • 相关阅读:
    HDU 3033 I love sneakers!
    HDU 1712 ACboy needs your help
    FZU 1608 Huge Mission
    HDU 3394 Railway
    【MySQL】20个经典面试题,全部答对月薪10k+
    mysql故障解决笔记
    mysql 索引类型
    linux禁用锁定和解除解锁用户账号的方法
    Linux服务器制定mysql数据库备份的计划任务
    网站服务器安全防范小知识
  • 原文地址:https://www.cnblogs.com/jasontang369/p/9241438.html
Copyright © 2011-2022 走看看