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() 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值