闭包,装饰器

# def f1(b):
#     def f2():
#         print(b)
#     f2()
#
# f1()
# 闭包的定义
# 内部的函数引用了外部函数的变量
#
def f1(b):     #闭包的常用状态
    def f2():
        print(b)
    return f2
f2 = f1('bbb')
ff = f1('bbb')
ff()   #==f1('bbb')()

# def f1():  #从内部函数返回一个值到全局
#     b = 10
#     def f2():
#         return b
#     return f2()
# print(f1())

#爬虫
from urllib.request import urlopen
# ret = urlopen('http://www.cnblogs.com/Eva-J/articles/7194277.html').read()
# print(ret)
def get_url(url):
    def read1():
        ret = urlopen(url).read()
        print(ret)
    return read1

read_func = get_url('http://www.cnblogs.com/Eva-J/articles/7194277.html')
read_func()
read_func()
# #讲故事
# #带着你一步一步的剖析装饰器的成因
# #关于时间:
import time    #模块
# start_time = time.time()
# time.sleep(1)   # 睡眠时间
# end_time = time.time()
# print('=====%s====='%(end_time-start_time))
import time    #模块
def timmer(func):
    def inner():
        start_time = time.time()
        time.sleep(0.1)
        func()
        end_time = time.time()
        print('=====%s=====' % (end_time - start_time))
    return inner

def func():
    print('公司好老板好同事好')

func = timmer(func)
func()
#
# 装饰器的作用
# 在不改变函数的调用方式的情况下,给函数的前后添加新的功能
#
#从最简单的装饰器
def timmer(qqxing):   #timmer是装饰器的名字,传入的参数就是被装饰的函数
    def inner():      #在装饰器中需要定义一个内部函数
        print('努力工作')
        qqxing()      #被装饰的函数,并且要执行  功能模块
        print('吃喝玩乐')
    return inner      #将内部函数的名字返回

@timmer   #语法糖  func = timmer(func)功能模块
def func():
    print('有钱')

func()
# # 完整的装饰-万能的装饰
# def timmer(qqxing):   #timmer是装饰器的名字,传入的参数就是被装饰的函数
#     def inner(*args,**kwargs):      #在装饰器中需要定义一个内部函数
#         print('调用func之前')
#         ret = qqxing(*args,**kwargs)      #被装饰的函数,并且要执行
#         print('调用func之后')
#         return ret
#     return inner      #将内部函数的名字返回
#
# @timmer   #语法糖  func = timmer(func)
# def func(name):
#     print('%s的公司好老板好同事好'%(name))
#     return 1111111111
#
# ret = func('俊杰')
# print('result : %s'%ret)
#
# #装饰器的固定结构
# def wrapper(func):
#     def inner(*args,**kwargs):
#         """被装饰函数执行之前要添加的代码"""
#         ret = func(*args,**kwargs)
#         """被装饰函数执行之后要添加的代码"""
#         return ret
#     return inner
#
#
#
#

 作业

 1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
login_dic = {'alex':False}
def login(func):
    def inner(*args,**kwargs):
        if not login_dic['alex']:
            usrname = input('用户名 : ')
            passwd = input('密  码 : ')
            with open('userinfo') as f:
                for line in f:
                    usr,pwd = line.split(' ')
                    if usrname.strip() == usr and passwd.strip() == pwd:
                        print('登陆成功')
                        login_dic[usrname] = True
        if login_dic['alex']:
            ret = func(*args,**kwargs)
            return ret
    return inner

@login
def home():
    print('欢迎来到home页')

home()
home()
home()
2.编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件
def log(func):
    def inner(*args,**kwargs):
        with open('func.log','a+',encoding='utf-8') as f:
            f.write('%s被调用了
'%func.__name__)
        ret = func(*args,**kwargs)
        return ret
    return inner

@log
def func1():
    print('我是func1')

@log
def func2():
    print('我是func2')

func1()
func1()
func2()


原文地址:https://www.cnblogs.com/jassin-du/p/7773652.html