栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python高阶之闭包函数和装饰器

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python高阶之闭包函数和装饰器

目录

一.闭包函数

二.装饰器


一.闭包函数

闭包函数:外函数中声明了一个内函数,在内函数中引用了外函数的变量,外函数返回内函数的引用

import requests
#普通函数实现
def get_page(url):
    r= requests.get(url)
    print(r.encoding) #获取响应页面采用的编码方式
 
get_page("http://baidu.com") #结果返回utf8


#闭包函数实现
def outter(url): #外函数
    def inner(): #内函数
        r= request.get(url)
        print(r.encoding)
    return inner #外函数返回内函数的引用

f = outter("http://baidu.com")
f() #结果返回utf8
 

如果外函数的变量是不可变数据类型,并且要在内函数中对外函数的变量进行处理,需要在变量前加nonlocal进行声明;

如果外函数的变量是可变数据类型,并在内函数中对外函数的变量进行处理时,不需要在变量前加nonlocal进行声明。

def outter(): #外函数
    age = 20
    li = [1,2,3]
    def inner(): #内函数
        nonlocal age #age是不可变数据类型
        age += 1
        li.append(4) #li是可变数据类型
        print(age) 
        print(li)
    return inner #外函数返回内函数的引用

f = outter()
f() #结果返回21 [1,2,3,4]
 

二.装饰器

装饰器:在不改变函数的源码、调用方式的前提下,为函数添加新的功能

通用装饰器模板:

def outter(func): #func,被装饰的函数名称
    def wrapper(*args,**kwargs):
        res = func(*args,**kwargs):
        return res #返回被装饰的函数的运行结果
    return wrapper

    

例一:统计函数运行时间

import time
def get_run_time(func): #func,被装饰的函数名称
  def wrapper(*args,**kwargs):
      start = time.time()
      res = func(*args,**kwargs) #调用被装饰的函数
      print(time.time()-start) #输出被装饰函数的运行时间
      return res #返回被装饰函数运行结果
  return wrapper


@get_run_time
def f():   #无参数
    for i in range(10):
        print('.',end='')
        time.sleep(0.2)
f()




@get_run_time
def f(n):   #有参数
    for i in range(n):
        print('.',end='')
        time.sleep(0.2)
f(20)

例二:装饰器传参要用三层函数

def login(user,passwd):
    def outter(func):
        def wrapper(*args,**kwargs) #调用被装饰函数的运行结果
            if user == "admin" and passed == "123456":
                res = func(*args,**kwargs)
                return res
            else:
                 print("用户名或者密码错误“)
        return wrapper
    return outter

@login("admin","1234561")
def add_customer(name):
    print(f'新增会员{name}成功')

add_customer('list')

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/701131.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号