Day 19 函数之闭包、装饰器

一、什么是装饰器

器即函数
装饰即修饰,意指为其他函数添加新功能
装饰器定义:本质就是函数,功能是为其他函数添加新功能

二、装饰器遵循的原则

1.不修改被装饰函数的源代码(开放封闭原则)
2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式

三、高阶函数

高阶函数总结
1.函数接收的参数是一个函数名
  作用:在不修改函数源代码的前提下,为函数添加新功能,
  不足:会改变函数的调用方式
2.函数的返回值是一个函数名
  作用:不修改函数的调用方式
  不足:不能添加新功能

其、程序:

work:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "DaChao"
# Date: 2017/6/14

import time
import random

#一:编写函数,(函数执行的时间是随机的)

# def work1_ti_work():
#     ‘‘‘
#     函数执行的时间是随机的
#     :return:
#     ‘‘‘
#     time.sleep(random.randrange(1,6))
#     print("Welcome to my world!")

#二:编写装饰器,为函数加上统计时间的功能

# def count_time(func):
#     ‘‘‘
#     装饰器功能,增加计算运行时间功能!
#     :param func:
#     :return:
#     ‘‘‘
#     def wrapper():
#         start_time = time.time()
#         func()
#         end_time = time.time()
#         print("Run time is %s" %(end_time-start_time))
#     return wrapper
#
# @count_time
# def work2_ti_work():
#     ‘‘‘
#     函数执行时间是随机的。
#     :return:
#     ‘‘‘
#     time.sleep(random.randrange(3,6))
#     print("Welcome to my world!")
#
# work2_ti_work()

#三:编写装饰器,为函数加上认证的功能

# def check(func):
#     ‘‘‘
#     修饰器:增加认证功能!
#     :return:
#     ‘‘‘
#     def wrapper(*args,**kwargs):
#         usrname = input("Please input your name: ").strip()
#         echo = input("Please input your echo: ").strip()
#         if usrname == "dachao"  and echo == "123":
#             print("Login successful!")
#             func(*args,**kwargs)
#         else:
#             print("Login error!")
#     return wrapper
#
# @check
# def work3_ti_work(usr):
#     ‘‘‘
#     函数执行时间是随机的。
#     :return:
#     ‘‘‘
#     time.sleep(random.randrange(3,6))
#     print("%s,welcome to my world!" %(usr))
#
# work3_ti_work("dachao")

# 附:双修饰器增加功能:用户验证和登录时间统计

# def count_time(func):
#     ‘‘‘
#     装饰器功能,增加计算运行时间功能!
#     :param func:
#     :return:
#     ‘‘‘
#     def wrapper(*args,**kwargs):
#         start_time = time.time()
#         func(*args,**kwargs)
#         end_time = time.time()
#         print("Run time is %s" %(end_time-start_time))
#     return wrapper
#
# def check(func):
#     ‘‘‘
#     修饰器:增加认证功能!
#     :return:
#     ‘‘‘
#     def wrapper(*args,**kwargs):
#         usrname = input("Please input your name: ").strip()
#         echo = input("Please input your echo: ").strip()
#         if usrname == "dachao"  and echo == "123":
#             print("Login successful!")
#             func(*args,**kwargs)
#         else:
#             print("Login error!")
#     return wrapper
#
# @count_time      #work3_ti_work = count_time(check(work3))
# @check           #work3_ti_work = check(work3)
# def work3_ti_work(usr):
#     ‘‘‘
#     函数执行时间是随机的。
#     :return:
#     ‘‘‘
#     time.sleep(random.randrange(3,6))
#     print("%s,welcome to my world!" %(usr))
#
# work3_ti_work("dachao")

#四:编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),
# 要求登录成功一次,后续的函数都无需再输入用户名和密码
#    注意:从文件中读出字符串形式的字典,可以用eval(‘{"name":"egon","password":"123"}‘)转成字典格式

# a = eval(‘{"name":"egon","password":"123"}‘)
#
# tag = True
#
# def count(func):
#     def wrapper():
#         global tag
#         while tag:
#             username = input("Please input your name: ").strip()
#             echo = input("Please input your echo: ").strip()
#             if username == a["name"] and echo == a["password"]:
#                 tag = False
#                 func()
#             else:
#                 print("Please input again!")
#         func()
#     return wrapper
#
# @count
# def work_1():
#     print("111111111111111")
# @count
# def work_2():
#     print("222222222222222")
# @count
# def work_3():
#     print("333333333333333")
#
# work_1()
# work_2()
# work_3()

#五:编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果

# from urllib.request import urlopen
#
# def get_url(url):
#     ‘‘‘
#     从用户传入的地址,返回内容
#     :return:
#     ‘‘‘
#     res = urlopen(url).read()
#     return res

#六:为题目五编写装饰器,实现缓存网页内容的功能:
    # 具体:实现下载的页面存放于文件中,
#       如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,
    # 否则,就去下载,然后存到文件中

from urllib.request import urlopen

def url_cache(func):
    def wrapper(*args,**kwargs):
        print("11111")                  #测试
        f = open("cache1.txt","r")
        if(f.read() == ""):
            print("2222")               #测试
            f.close()                   #一定记得要关闭文件
            f = open("cache1.txt", "wb")
            f.write(func(*args,**kwargs))
            f.close()
        else:
            print("3333")               #测试
    return wrapper

@url_cache
def get_url(url):
    ‘‘‘
    从用户传入的地址,返回内容
    :return:
    ‘‘‘
    res = urlopen(url).read()
    return res

get_url(‘http://www.baidu.com‘)

#七:还记得我们用函数对象的概念,制作一个函数字典的操作吗,
# 来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作

# import sys
#
# func_dic = dict({})
#
# def deco(func):
#     def inner():
#         func_dic[func.__name__] = getattr(sys.modules[__name__],func.__name__)
#         func()
#     return inner
# @deco
# def my_append():
#     print("My_appeng is running!")
# @deco
# def my_sss():
#     print("My_sss is running!")
#
# my_append()
# my_sss()
# print(func_dic)
# func_dic["my_append"]()

work

时间: 2024-10-12 20:34:31

Day 19 函数之闭包、装饰器的相关文章

【Python基础】高阶函数+函数嵌套+闭包 ==装饰器

高阶函数+函数嵌套+闭包 == 装饰器 一 什么是装饰器 二 装饰器需要遵循的原则 三 实现装饰器知识储备 四 高阶函数 五 函数嵌套 六 闭包 七 无参装饰器 八 装饰器应用示例 九 超时装饰器 参考: https://www.cnblogs.com/linhaifeng/articles/6140395.html https://www.cnblogs.com/haiyan123/p/8387769.html 原文地址:https://www.cnblogs.com/XJT2018/p/11

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

python 函数名 、闭包 装饰器 day13

1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print(func1) # <function func1 at 0x0000027B7CF1A048> 2,函数名的赋值 def func(): print(666) f = func print(f()) 3,函数名可以作为容器类数据的元素. def f1(): print(111) def f2()

第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON

关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的是f1的return,那么在这种情况下函数f1并未定义return,所以默认返回None 因此li的值应该是none 如果是 li = [11,22,33,44] def f1(arg): arg.append(55) f1(li) print(li) 因为函数传递的参数实际是参数的引用,因此在函数

函数嵌套与装饰器

*应用场景,位置参数中代表将多个参数存入元祖,**将关键字参数传入字典 位置参数: 位置形参:必须被传值,一一对应 位置实参:按从左到右的顺序与形参一一对应 关键字参数:按照key=value形式指名道姓的为形参传值,可以完全不按照顺序 1.关键字实参必须在位置参数的后面 2.可以混用位置实参与关键字实参,但不能为同一个形参重复传值 默认参数: 形参有默认值 可变长参数 形参:*args,**kwargs将多余的参数分别封装成元祖与字典 实参:将args kwargs分别打散 什么是命名关键字参

Django视图函数函数之视图装饰器

FBV模式装饰器: 普通函数的装饰器(语法糖@) views.py 1 from django.shortcuts import render 2 3 def wrapper(f): 4 def inner(*args,**kwargs): 5 print("before") 6 ret=f(*args,**kwargs) 7 print("after") 8 return ret 9 return inner 10 11 @wrapper 12 def index

5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器

一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰器 1.1什么是高阶函数? 1.1.1函数接收的参数,包涵一个函数名. 1.1.2 函数的返回值是一个函数名. 其实这两个条件都很好满足,下面就是一个高阶函数的例子. def test1(): print "hamasaki ayumi" def test2(func): return t

函数对象,函数的嵌套,名称空间与作用域,闭包,装饰器,迭代器,内置函数

一,函数对象 函数对象:函数是第一类对象,即函数可以当做数据传递 1,可以被引用 2,可以做参数的传递 3,返回值可以是函数 4,可以当作容器类型的元素 二,函数嵌套 1,函数的嵌套调用 2,函数的嵌套定义 三,名称空间与作用域 名称空间:存放名字的地方叫名称空间,存放这些值与名字的绑定关系 查看内置名称的两种方法: 三种名称空间 1,内置名称空间:随着python解释器的启动而产生 2,全局名称空间:文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入该空间 3,局部名称空间:调用函

Go的魅力, 函数式(柯里化, 闭包, 高阶函数), [email&#160;protected]装饰器, 封装

Go朴实无华的代码风格是函数式的无尽魅力. 函数式有3个别名, 高大上的"柯里化", 编程语言的"闭包", 数学气息的"高阶函数". Python没有Go的func匿名函数, 但是具有可爱的语法糖(@装饰器). 编程语言都是相通的, 层层封装造就了灵活的风格. 理解了Go的"函数式", 再理解内嵌/接口/重写(设计模式), 剩下的是各个领域的工具了, 就可以写出服务于业务的代码. 感悟于 函数式 http://www.jian