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