python基础之闭包、装饰器、迭代器

一、闭包函数

1、定义:函数内部定义函数,成为内部函数。该内部函数包含对外部作用域,而不是对全局作用域名字的引用,那么该内部函数成为闭包函数

name='alex'
def func():
    name='egon'
    def bar():
         print(name)
    return bar


b=func()
print(b)

2、闭包函数特点:自带作用域、包含对外部作用域而非全局作用域的引用

包一层
def wrapper():
    money=1000
    def tell_info():
        print('egon have money %s' %money)
    return tell_info
tell_info=wrapper()
tell_info()

    
包二层
def aaa():
    name='egon'
    def wrapper():
        money=1000
        def tell_info():
            print('egon have maney %s'%(money))
            print('my name is %s'%(name))
        return tell_info
    return wrapper
w=aaa()
tell_info=w()
tell_info()

3、定义闭包函数的基本形式

外部函数名():

  内部函数需要的变量

  def 内部函数():

    引用外部变量

  return 内部函数

def deco():
     x=1
     def wrapper():
         print(x)

     return wrapper

wrapper=deco()
print(wrapper)

二、装饰器

1、开放封闭原则,对拓展是开放的,对修改的封闭的

2、装饰器,本质可以任意调用对象,被装饰的对象也可以是任意可调用对象

3、功能:在不修改被装饰对象源代码以及调用方式的前提下为其添加新功能

原则:不修改源代码、不修改调用方法。  目标:添加新功能

# import time
# import random
# #装饰器
# def timmer(func):
#     # func=index
#     def wrapper():
#         start_time = time.time()
#         func() #index()
#         stop_time=time.time()
#         print('run time is %s' %(stop_time-start_time))
#     return wrapper
# #被装饰函数
# def index():
#     time.sleep(random.randrange(1,5))
#     print('welecome to index page')
#
# def home():
#     time.sleep(random.randrange(1,3))
#     print('welecome to HOME page')
#
# index=timmer(index) #index=wrapper
# home=timmer(home)
#
# index() #wrapper()
# home()

装饰器语法:在被装饰对象的正上方的单独一行,@装饰器的名字

三、迭代器

1、定义:迭代器对象要求支持迭代器协议的对象,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。

2、__iter__()和next()方法,这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素。

d={'a':1,'b':2,'c':3}

i=d.__iter__() #i叫迭代器
print(i)
print(i.__next__())
print(i.__next__())
print(i.__next__())
print(i.__next__()) #StopIteration

3、迭代器的优点:提供了一种不依赖于索引的取值方式,节省内存

     迭代器的缺点:取值不如按照索引取值方便、一次性的,只能往后走不能往前退、无法获取长度

原文地址:https://www.cnblogs.com/fenglinglf/p/7009057.html