闭包
定义
在函数嵌套的前提下,内部函数使用了外部函数的变量,外部函数返回了内部函数,我们把使用外部函数变量的内部函数称为闭包。
def out(lo):
def in1(word):
# 内部函数使用了外部函数的lo
print(f"{lo}说:{word}")
# 外部函数返回了内部函数
return in1
t1=out("小红")
t1("你好")
t1("吃饭了吗")
print( )
t2=out("小白")
t2("今天天气真好")
t2("我们出去玩吧")
函数in1称为闭包
修改外部函数变量的值--nonlocal
在内部函数中,想要修改外部变量,要先用关键字nonlocal来声明外部变量
def add1(num1):
def add2(num2):
nonlocal num1
num1+=num2
print(num1)
return add2
t1=add1(100)
t1(50) # 结果:150
t1(90) # 结果:240
优缺点
优点:
无需定义全局变量即可实现通过函数,持续的访问、修改某个值。
闭包使用的变量的所用于在函数内,难以被错误的调用修改
缺点:
由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放,一直占用内存
装饰器
装饰器在本质上是一个闭包,它的功能是在不破坏原有的功能和代码的情况下,为目标函数增加新的功能。
实现逻辑:
def outer(func):
def inner():
print("我要睡觉了")
func()
print("我要起床了")
return inner
def sleep():
import time
print("睡眠中。。。。")
time.sleep(1)
test=outer(sleep)
test()
装饰器语法:
def outer(func):
def inner():
print("我要睡觉了")
func()
print("我要起床了")
return inner
@outer
def sleep():
import time
print("睡眠中。。。。")
time.sleep(1)
sleep()
使用@outer定义在目标函数sleep之上(可以理解为,用outer来增加sleep的功能)
设计模式
单例模式
定义:
保证一个类只能有一个实例,并能提供一个访问它的全局访问点
新建file文件
class say:
pass
Say=say()
test测试文件
from file import Say
t1=Say
t2=Say
print(id(t1)) # 结果:2170317543312
print(id(t2)) # 结果:2170317543312
优点:
节省内存
节省创建对象开销
工厂模式
定义:
将对象的创建由使用原生类本身创建转换到由特定的工厂方法创建
class person:
pass
class stu1(person):
pass
class stu2(person):
pass
class student:
def get_stu(self,name):
if name=="小红":
return stu1()
else:
return stu2()
Stu=student()
s1=Stu.get_stu("小红")
s2=Stu.get_stu("小白")
优点:
大批量创建对象的时候有统一的入口,易于代码维护当发生修改,仅修改工厂类的创建方法即可符合现实世界的模式,即由工厂来制作产品(对象)
多线程
进程
定义:程序在操作系统内完成,即成为一个运行进行
线程
定义:进程内部可以有多个线程,程序的运行本质上就是进程内部的线程实际工作。
并行执行
多个进程同时在运行,即不同的程序同时运行,称之为:多任务并行执行
一个进程内的多个线程同时在运行,称之为:多线程并行执行