函数之装饰器

news/2024/7/19 11:27:28 标签: python, 爬虫

---恢复内容开始---

一。函数名(学名:第一类对象)

函数名本质上就是函数的内存地址。通俗点就是特殊的变量.

def my():
print(666)
print(my) # 函数名my在内存的地址
print(id(my)) #变量my在内存的地址

结果:

1.可以被引用(即可以赋值给其他变量)

def func():
    print(666)
f = func   #将func赋值给f
f()      #相当于func()

结果:

2.可以被当作容器类型的元素

def func():
    print(111)
def func2():
    print(222)
def func3():
    print(333)
li = [func(),func2(),func3()]
for i in li:
    i

结果;

3.可以当作函数的参数和返回值

def func():
    print(111)
def func2():
    return func  #当作返回值
f = func2()
f()         #当作参数

结果:

第一类对象(first-class object)指

1.可在运行期创建

2.可用作函数参数或返回值

3.可存入变量的实体。

 

二。闭包

闭包的定义:内层函数,对外层函数(非全局)的变量的引用,叫做闭包

闭包的用处:如果说你内存函数是个闭包,python内部有一个机制,遇到闭包

内存会在内存中开启一个内存空间,不会随着函数的结束而关闭,避免多次开关内存.

简单应用

from urllib.request import urlopen
print(urlopen('http://www.cnblogs.com/jin-xin/articles/8259929.html').read())

def index(url):
    content = urlopen(url).read()
    def get():
        with open('爬虫','a') as f1:
            f1.write(content.decode('utf-8'))
    return get
index('http://www.cnblogs.com/jin-xin/articles/8259929.html')()

结果;

判断函数是否是闭包.__closure__

def func():
    name = 'alex'
    def func2():
        print(name)
    func2()
    print(func2.__closure__)               #引用几个变量就有几个cell  这个函数就是闭包  不引用就是None  函数不是闭包
func()

结果:

三,在外层函数内部执行内部函数

def func():
    def func2():
        print(111)
    func2()
func()

def func():
    def func2():
        print(111)
    return func2
func()()

结果:

       

四。装饰器

1.比如计算一个函数的执行效率

import time
def func():
    print('666')
start_time = time.time()
time.sleep(0.1)
func()
end_time = time.time()
print('------的执行效率%s'%(end_time-start_time))

结果:

 

   2.进阶写法                    

import time
def func():
    print('666')
def timmer():
    start_time = time.time()
    time.sleep(0.1)
    func()
    end_time = time.time()
    print('------的执行效率%s'%(end_time-start_time))
timmer()

结果;

3.简单的装饰器

import time
def func():
    print('我们都一样')
def timmer():
    start_time = time.time()
    time.sleep(0.1)
    func()
    end_time = time.time()
    print('------的执行效率%s'%(end_time-start_time))
timmer()

结果;

4.带返回值的装饰器(语法糖的用法)

@timmer 相当于 #func = timmer(func)    即待求的函数名 = 新函数名(待求的函数名)

import time
def timmer(func):
    def inner(*args,**kwargs):
        start_time = time.time()
        time.sleep(0.1)
        ret = func(*args,**kwargs)
        end_time = time.time()
        print('------执行效率%s'%(end_time-start_time))
        return ret
    return inner

@timmer
def func():
    return '666'
print(func())
结果:

5.通用装饰器

def wrapper(func):
    def inner(*args,**kwargs):
        '''执行函数前的操作'''
        ret = func(*args,**kwargs)
        '''执行函数后的操作'''
        return ret
    return inner

@wrapper
def func():
    print(111)
func()

 

 
 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

 

转载于:https://www.cnblogs.com/wzbk/p/8414095.html


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

相关文章

br_netfilter 模块开机自动方法

环境 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) 在/etc/sysctl.conf中添加: net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 执行sysctl -p 时出现:[rootlocalhost ~]# sysctl -p sysctl: cannot…

MongoDB 基本入门操作(基本概念/操作 - 增删改查)

文章目录MongoDB 基础入门操作1.MongoDB 基本概念2.MongoDB 创建新实例3.MongoDB 基本操作MongoDB 基础入门操作 1.MongoDB 基本概念 MongoDB 中的基本概念是:文档、集合、数据 与 MySQL 对比更有助于理解,如下表所示: SQL 术语/概念Mong…

MongoDB-3: 查询(一)

一、简介 MongoDB提供了db.collection.find() 方法可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段。 二.db.collection.find()查询数据 语法 db.collection.find(query,projection) 参数 类型 描述 query document 可…

Kubernetes 集群部署(三)(master、node 部分)

文章目录Kubernetes 集群部署(三)(部署 master/node 组件)1.部署 master(组件)①创建 K8S 工作目录及证书目录②撰写创建证书脚本并执行③完善 K8S 工作目录④建立 token 令牌并撰写一个启动 apiserver 的脚…

FileUtils删除文件的工具类

前提是知道文件在哪个文件夹下面然后到文件夹下面删除文件,如果文件夹也需要传参数需要对下面方法进行改造。 ( 需要借助于commons-io.jar和ResourceUtils.java ) 1.DeleteFileUtil.java工具类 package com.tyust.common;import java.io.File; import java.io.IOE…

Kubernetes 集群部署(四)(master 多节点、nginx/keepalived)

文章目录Kubernetes 集群部署(四)(多节点)①拷贝 K8S 工作目录、组件启动脚本至 master02②master02 修改文件③搭建 nginx/keepalived④node 节点修改配置文件⑤master 创建 pod 用以测试⑥node 节点访问 nginx 页面Kubernetes 集…

K8S:无法正常开启 Kube-apiserver

文章目录K8S:无法正常开启 Kube-apiserver①报错现象②解决过程K8S:无法正常开启 Kube-apiserver ①报错现象 环境:K8S 单节点二进制部署 主机IP组件master01192.168.126.11kube-apiserver、kube-controller-manager、kube-scheduler、etc…

Css的三种常用代码风格

代码格式化的作用:代码更佳美观、容易理解和更好维护。 代码风格一: 主要包括以下特征: 选择符顶行书写。每条声明单行显示并缩进4空格规则之间可以适当空行,以便于阅读属性与属性值之间,以及选择符列表之间建议空一格…