Python进阶技巧tips:本文根据b站黑马python课整理链接指引=>2022新版黑马程序员python教程1.函数嵌套前提下使用闭包.外部函数的变量,并且外部函数返回内部函数,我们称这个使用外部函数变量的内部函数为闭包。闭包注意事项:优点,使用闭包让我们获得:无需定义全局变量,我们可以通过函数实现对某个值的不断访问和修改修改的缺点:由于内部函数继续引用外部函数的值,这部分内存空间不会释放,内存会一直被占用。"""简单闭包"""defouter(logo):definner(msg):print(f"<{logo}>{msg}{logo}>")returninnerfn1=outer('Tinkerbell')fn1("111")1.1nonlocal关键字nonlocal关键字的作用:在闭包函数(internalFunction)中如果要修改变量值外部函数,你需要用非本地“””关键字声明外部变量“””defouter(num1):definner(num2):nonlocalnum1num1+=num2print(num1)returninnerfn1=outer(10)fn1(10)fn1(10)1.2ATM小箱子"""ATM小箱子"""defaccount_create(initial_amount=0):defatm(num,deposit=True):nonlocalinitial_金额ifdeposit:initial_amount+=numprint(f"Deposit:+{num},balance:{initial_amount}")else:initial_amount-=numprint(f"Withdrawal:-{num},balance:{initial_amount}")返回atmfn=account_create(100)fn(100)fn(20,False)2.Decorator装饰器:其实也是一种闭包。它的作用是在不破坏目标函数原有代码和功能的情况下,使目标函数发挥作用。函数新增功能2.1装饰器的一般写法(关闭写法)"""Decorator...关闭写法"""defsleep():importrandomimporttimeprint('Sleeping...')time.sleep(random.randint(1,5))defout(fun):definner():print('我睡了...')fun()print('我起床了...')returninnerfn=out(sleep)fn()2.2装饰器的语法糖"""Decorator..语法糖"""defouter(fun):definner():print('我在睡觉...')fun()print('我醒了...')returninner@outerdefsleep():importrandomimporttimeprint('Sleeping...')time.sleep(random.randint(1,5))sleep()3.设计模式3.1单例模式单例模式(SingletonPattern)是一种常用的软件设计模式。这种模式的主要目的是确保某个类只存在一个实例。当某个类在整个系统中只能出现一个实例时,单例对象就派上用场了。定义:确保一个类只有一个实例,并提供一个全局访问点来访问它。适用场景:当一个类只能有一个实例时,客户可以从知名接入点访问。优点:节省内存,节省创建对象的开销单例实现方式:3.2工厂模式当需要创建一个类的大量实例时,可以使用工厂模式。即从原来使用类构造创建对象的形式迁移到基于工厂提供的方法创建对象的形式。优点:在大量创建对象时有统一入口,代码维护方便。发生变化时,只修改工厂类的创建方法可以符合现实世界的模式,即产品(对象)由工厂classPerson:passclassWorker(Person):passclassStudent(Person):passclassTeacher(Person):passclassPersonFactory:defget_person(self,p_type):如果p_type=='w':returnWorker()elifp_type=='s':returnStudent()else:returnTeacher()pf=PersonFactory()worker=pf.get_person('w')stu=pf.get_person('s')te=pf.get_person('t')4.多线程4.1进程、线程和并行执行什么是进程?一个程序运行在操作系统中,即成为一个运行的进程。进程中的线程是什么?存在多个线程,程序的运行本质上是进程内部线程的实际工作。什么是并行执行?多个进程同时运行,即不同的程序同时运行。称之为:多任务并行执行。一个进程中的多个线程同时运行。调用:多线程并行执行4.2多线程编程4.2.1线程模块线程模块的使用:thread_obj=threading.Thread(target=func)创建线程对象thread_obj.start()如果需要通过启动线程执行的参数,可以通过元组传递:args参数(按参数顺序)参数或者使用kwargs参数以字典形式传递参数importtimeimportthreadingdefsing(msg):whileTrue:print(f‘我在嫦娥,啦啦啦...{msg}')time.sleep(1)defdance(msg):whileTrue:print(f"I'mdancing,hangingonthemelon...{msg}")time.sleep(1)if__name__=='__main__':#sing()#dance()#唱歌线程sing_thread=threading.Thread(target=sing,kwargs={'msg':'33333'})#跳舞线程dance_thread=threading.Thread(target=dance,args=('11111',))sing_thread.start()dance_thread.start()5.网络编程5.1服务器开发两个进程通过Socket相互通信,必须有一个服务器和一个客户端SocketServer:waitConnectionsfrom其他进程,可以接受传入消息,可以回复消息Socket客户端:主动连接服务器,可以发送消息,可以接收回复Socket服务器编程"""DemoserverSocker开发"""importsocket#创建socket对象socket_server=socket.socket()#绑定ip地址和端口socket_server.bind(('127.0.0.1',8888))#监听端口socket_server.listen(1)#监听方法接受一个证书参数,which表示接收连接数#等待客户端连接#result:tuple=socket_server.accept()#conn=result[0]#客户端和服务器之间的连接对象#address=result[1]#客户端地址信息conn,address=socket_server.accept()print(f'receivedclientinformation,{address}')whileTrue:#acceptclientinformation#recv接受的参数是缓冲区大小,一般为1024可用数据:str=conn.recv(1024).decode('UTF-8')print(f'客户端发送的消息是,{data}')#发送回复消息msg=input('回复消息:')ifmsg=='exit':breakconn.send(msg.encode('UTF-8'))#关闭链接conn.close()socket_server.close()5.2客户端开发"""DemoServerSockerDevelopment"""importsocket#创建socket对象socket_server=socket.socket()#绑定ip地址和端口socket_server.bind(('127.0.0.1',8888))#监听端口socket_server.listen(1)#监听方法接受一个certificate参数,表示收到的连接数#等待客户端连接#result:tuple=socket_server.accept()#conn=result[0]#客户端和服务器之间的连接对象#address=result[1]#客户端的地址信息conn,address=socket_server.accept()print(f'receivedclientinformation,{address}')whileTrue:#acceptclientinformation#recv接受的参数是缓冲区大小,一般1024就够了data:str=conn.recv(1024).decode('UTF-8')print(f'客户端发送的消息是,{data}')#发送回复消息msg=input('回复消息:')ifmsg=='exit':breakconn.send(msg.encode('UTF-8'))#关闭链接conn.close()socket_server.close()六、正则表达式正则表达式,又称正则表达式(Regular表达式),是使用单个字符串描述匹配一个句法规则的字符串,常用于检索和替换匹配某种模式(规则)的文本6.1基本匹配re模块的三个主要方法:re.match,从头开始匹配,match第一个命中项re.search,全局匹配,匹配第一个命中项re.findall,全局匹配,匹配所有命中"""正则表达式匹配"""importres='pythonwwwpython1python'res1=re.match('python',s)print(res1.group())print(res1.span())print(res1)res2=re.search('python1',s)print(res2)res3=re.findall('python',s)print(res3)6.2元字符匹配单字符匹配:数量匹配:边界匹配:组匹配:7.递归递归是编程中非常重要的算法递归:方法(函数)本身一种特殊的编程方式调用自身,函数调用自身,称为递归调用什么是递归当条件满足时,函数t的一种特殊编程技巧o调用自己递归时要注意什么?注意退出条件,否则容易变成无限递归注意返回值的传递,保证os模块最内层到最外层的三个方法os.listdir列出指定的内容directoryos.path.isdir,判断给定路径是否为文件夹,是则返回True,返回Falseos.path.exists,判断给定路径是否存在,存在则返回True,否则返回False。持续更新,欢迎大家点赞关注~~
