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

python高阶之闭包函数和装饰器,第1张

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')

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/5701245.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存