闭包,装饰器

news/2024/7/19 9:27:09 标签: 爬虫
# 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被调用了\n'%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


http://www.niftyadmin.cn/n/1585270.html

相关文章

Padding in RSA

padding值给弄对,加密的bytes上限117,但是有空的话会加上padding,所以加密过来的字符串其实不止是117;要满足2的7次方,才是一个完整的block。输入的bytes,加密后的长度其实不止是117;其实一个bl…

oc51--循环retain

// main.m // 循环retain#import <Foundation/Foundation.h> #import "Person.h" #import "Dog.h"int main(int argc, const char * argv[]) {Person *p [Person new];Dog *d [Dog new];// 如果A对用要拥有B对象, 而B对应又要拥有A对象, 此时会形…

MongoDB 更新数组中的元素

本文记录如何更新MongoDB Collection 中的Array 中的元素。假设Collection中一条记录格式如下&#xff1a; 现要删除scores 数组中&#xff0c;"type" 为 "homework"&#xff0c;较小的那个score。在上图中&#xff0c;较小的score为54.759... 根据MongoDB…

So It Goes__How To Package jar Files

jar cvfM0 springcloud-zuul.jar * // 压缩当前目前所有文件到.jar jar cvfM0 spring-zuul.jar E:/springcloud-zuul/ // 指定压缩目录

找工作开篇

前言 今天&#xff0c;2017年11月3日&#xff0c;部门散了&#xff0c;刚刚吃完部门散伙饭&#xff0c;我正式失业了。。。还没有到双十一呢&#xff0c;就没有工作了。。。?赶紧找工作吧&#xff0c;开启找工作的进程&#xff0c;开足马力向前冲&#xff01; 投简历之Star法则…

Install Simhei On CentOS

fc-list yum install -y fontconfig cd /usr/share/fonts yum install -y ttmkdir mkdir chinese chmod -R 755 chinese/ cd chinese/ mkfontscale mkfontdir fc-cache fc-list :langzh

阿里云ECS的1M带宽能干嘛?

阿里云最近正在搞活动的ECS机器&#xff0c;普遍都是1M带宽&#xff0c;因此最近推广阿里云的时候&#xff0c;小编被很多人问道“1M小水管能干吗&#xff1f;”。在动辄家庭宽带达百兆的时代&#xff0c;1M带宽确实是个大部分人都会担心的问题。本文就给大家科普下阿里云ECS的…

Add Fonts To JVM__Trial One

vi /etc/fonts/font.conf<dir>/usr/local/java/jdk1.8.0-211/jre/lib/fonts/fallback</dir>fc-cache -fvjava -Dfile.encodingutf-8 -Dnet.sf.jasperreports.awt.ignore.missing.fonttrue -jar csim_waybill_print_service_V1.1.8.jar