博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
闭包,装饰器
阅读量:5897 次
发布时间:2019-06-19

本文共 3134 字,大约阅读时间需要 10 分钟。

# def f1(b):#     def f2():#         print(b)#     f2()## f1()# 闭包的定义# 内部的函数引用了外部函数的变量#def f1(b):     #闭包的常用状态    def f2():        print(b)    return f2f2 = 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 read1read_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 innerdef 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@logindef 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被调用了\n'%func.__name__)        ret = func(*args,**kwargs)        return ret    return inner@logdef func1():    print('我是func1')@logdef func2():    print('我是func2')func1()func1()func2()

 

 

转载于:https://www.cnblogs.com/jassin-du/p/7773652.html

你可能感兴趣的文章
PIE SDK矢量数据的读取
查看>>
win10安装tomcat9
查看>>
两种方式分别改变alertdialog的宽和高
查看>>
TextView-setCompondDrawables用法
查看>>
由扭结理论中的琼斯多项式的证明想到的
查看>>
淘宝Hadoop集群的概况
查看>>
Centos7安装rabbitmq server 3.6.0
查看>>
关于eclipse的ADT(插件)对xml的android:text属性检查修改
查看>>
Mvc 提交表单的4种方法全程详解
查看>>
iostat命令学习
查看>>
SQL 三种分页方式
查看>>
查看linux是ubuntu还是centos
查看>>
html video的url更新,自动清缓存
查看>>
IOS Xib使用——为控制器添加Xib文件
查看>>
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤
查看>>
react 取消 eslint
查看>>
【11】ajax请求后台接口数据与返回值处理js写法
查看>>
Python菜鸟之路:Jquery Ajax的使用
查看>>
LeetCode算法题-Maximum Depth of Binary Tree
查看>>
sha1withRSA算法
查看>>