python闭包、装饰器、多线程

python的闭包

闭包:在一个内部函数中,对外部作用域的变量进行引用,(并且一般外部函数的返回值为内部函数),那么内部函数就被认为是闭包

def operateMoney(account_num=0):
    def ATM(num,deposit=True):
        nonlocal account_num
        if deposit:
            account_num += num
        else:
            account_num -= num
        print(account_num)
    return ATM

 闭包的调用

operateMoney()(10)
#或者
r= operateMoney()
r(10)

闭包的好处和缺点

优点:不定义全局变量,也可以让函数持续访问和修改一个外部变量
缺点:额外的内存占用
nonlocal关键字的作用
在闭包函数(内部函数中)想要修改外部函数的变量值,需要用nonlocal声明这个外部变量

 python的装饰器

装饰器本质上是一个(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,类似与java的代理模式

 普通写法如下

def func1():
    print('我是func1')

def func2(func):

    def inner():
        print('我是func2开始')
        func()
        print('我是func2结束')

    return inner


func2(func1)()

"""
输出结果
我是func2开始
我是func1
我是func2结束
"""

 语法糖写法

在被传入的方法上方加上传入方法的注解,调用func1() 直接传入func2,当然也有嵌套装饰器写法,这里不再列举

def func2(func):

    def inner():
        print('我是func2开始')
        func()
        print('我是func2结束')

    return inner

@func2
def func1():
    print('我是func1')

func1()

"""
输出结果
我是func2开始
我是func1
我是func2结束
"""

python的多线程

进程和线程的概念

进程:一个应用算是一个进程,例如网易云是一个进程,微信是一个进程

线程:进程内真正干活的是线程,也是最小单元,1个进程对应多个线程

threading.Thread () 创建 

thread.Thread(group=None,name='Tread-x',targt=None,args=(),kwargs={},daemon=None)
语法 含义
group 一般不用
name 线程名
targt 目标函数
args 目标函数的参数,数据类型:元祖。与kwargs水火不容,只存在一个参数即可
kwargs 目标函数的参数,数据类型:字典。与args水火不容,只存在一个参数即可
daemon 用来设置线程是否随主线程退出而退出
import threading

def test_thread(arg1,arg2):
      for i in range(arg1,arg2):
            print(threading.current_thread().name,i)

if __name__=="__main__":
      thread1 = threading.Thread(name='t1',target= test_thread,args=(1,10))
      thread2 = threading.Thread(name='t2',target= test_thread,kwargs={"arg1":101,"arg2":110})
      # 启动线程1
      thread1.start()
      thread2.start()

继承 threading.Thread

import threading
 

class MyThread(threading.Thread):
    def __init__(self, threadName,arg1,arg2):
        super(MyThread, self).__init__(name=threadName)
        self.arg1=arg1
        self.arg2=arg2

    def run(self):
        for i in range(self.arg1,self.arg2):
            print(self.name, i)
            
 
if __name__=="__main__":
    #启动线程
    MyThread('t1',1,10).start() 
    MyThread('t2',101,110).start() 

你可能感兴趣的:(python基础及高级,python,开发语言)