python之闭包+装饰器

时间:2021-12-08 04:37:14

闭包

内部函数对外部函数作用域变量的引用。

函数内的属性都是有生命周期的,都是在函数执行期间

闭包内的闭包函数私有化了变量,类似于面向对象

图片解析

python之闭包+装饰器

示例一

https://www.bilibili.com/video/av18586448/?spm_id_from=333.788.videocard.16

def func():#外部函数
    a=1  #外部函数作用域的变量 
    print("this is func.")
    def func1(num):#内部函数其实是闭包函数
        print("this is func1")
        print(num+a)
    return func1#函数保存了变量a
 #func()运行外部函数,内部函数就被创建了
var=func()#创建过程在func函数的执行过程中
#var==func1
var(3)#当del var时a就不存在了

示例二

mylist=[1,2,3,4,5]
def func(obj):
    print('func:',obj)
    def func1():
        obj[0]+=1
        print('func1',obj)
    return func1
var=func(mylist)
#var:obj,print('func1',obj)

装饰器

装饰器,是语法糖 用@
@func1
def func():
    print('aaa')
    不影响原有函数的功能,还能添加新功能
    >@func1
    >def myprint():
    myprint()==func2()+myprint()
    普通装饰器 zsq(bzs)()
    装饰器函数带参数:dczsq(cs='man')(bza)()
                     多一层包装来接收装饰器的参数
    被装饰的函数带参数:只需在最内部函数传入参数即可

示例一

def arg_fun(sex)
    def func(b_func):
        def func2()
         if sex=='man':
            print('你不可以生娃')
         if sex=='woman':
            print('你可以生娃')

         return b_func()
        return func2
    return fun1

#arg_func(sex='man')()()>func1
#func1()>func2
#func2()>(''你不可以生娃'')or('你可以生娃') 

@ arg_fun()
def  man():
    print('好好上班')
@ arg_fun()
def  woman():
    print('好好上班')


man()
woman()

示例二

def func1(func)
      def func2(x,y)
            print(x,y)
            x+=5
            y+=5
            return func(x,y)
       return func2
@func1
def mysum(a,b)
      print(a+b)
mysum(1,2)

示例三

import time
def display_time(func):
    def wrapper(*args):
        t1=time.time()
        result=func(*args)
        t2=time.time()
        print("Total time:{:.4} s".format(t2-t1))
        return result
    return wrapper
def is_prime(num)
    if num<2:
        return False:
    elif num==2:
        return True
    else:
        for i in range(2,num):
            if num%i==0:
                return False
        return True
@display_time
def count_prime_nums(maxnum):
    count=0
    for i in range(2,maxnum):
        if is_prime(i):
            count=count+1
    return count
count=count_prime_nums(10000)
print(count)