• python 高级技巧


    闭包

    定义双层嵌套函数,内层函数可以访问外层函数的变量

    将内层函数作为外层函数的返回,此层函数就是闭包函数

    在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包

    1. def outer(logo):
    2. def inner(msg):
    3. print(f"{logo}:{msg}")
    4. return inner
    5. fun = outer("java")
    6. fun("hello world")

    闭包修改外部函数的值

    需要用 nonlocal 声明这个外部变量

    1. def outer(num1):
    2. def inner(num2):
    3. nonlocal num1
    4. num1 += num2
    5. print(num1)
    6. return inner
    7. fun = outer(10)
    8. fun(10) # 输出20

    优点:

    • 无需定义全局变量即可实现通过函数,持续的访问、修改某个值
    • 闭包使用的变量的所用于在函数内,难以被错误的调用修改

    缺点:

    • 由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放,一直占用内存

    装饰器

    装饰器其实也是一种闭包,其功能就是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能

    1. def outer(func):
    2. def inner():
    3. print("我要睡觉了")
    4. func()
    5. print("我起床了")
    6. return inner
    7. @outer
    8. def sleep():
    9. print("睡眠中")
    10. sleep()

    单例模式

    1. # 单例
    2. def strTool():
    3. pass
    4. signle = strTool()
    5. #==
    6. from 单例 import signle
    7. t1 = signle
    8. t2 = signle
    9. print(id(t1))
    10. print(id(t2))

    工厂模式

    将对象的创建由使用原生类本身创建转换到由特定的工厂方法来创建

    好处:

    • 大批量创建对象的时候有统一的入口,易于代码维护
    • 当发生修改,仅修改工厂类的创建方法即可
    1. class Person:
    2. pass
    3. class Worker(Person):
    4. pass
    5. class Student(Person):
    6. pass
    7. class Teacher(Person):
    8. pass
    9. class PersonFactory:
    10. def get_person(self,p_type):
    11. if p_type == 'w':
    12. return Worker()
    13. elif p_type == 's':
    14. return Student()
    15. else:
    16. return Teacher()
    17. pf = PersonFactory()
    18. worker = pf.get_person('w')
    19. student = pf.get_person('s')
    20. teacher = pf.get_person('t')

    多线程

    threading模块使用

    1. import threading
    2. import time
    3. def sing(msg):
    4. print(msg)
    5. time.sleep(1)
    6. def dance(msg):
    7. print(msg)
    8. time.sleep(1)
    9. if __name__ == '__main__':
    10. sing_thread = threading.Thread(target=sing,args=("唱歌。。。",))
    11. dance_thread = threading.Thread(target=dance,kwargs={"msg":"跳舞。。。"})
    12. sing_thread.start()
    13. dance_thread.start()

    Socket

    Socket(套接字)是进程间通信工具

    服务端

    1. # 创建Socket对象
    2. import socket
    3. socket_server = socket.socket()
    4. # 绑定IP地址和端口
    5. socket_server.bind(("localhost", 8888))
    6. # 监听端口
    7. socket_server.listen(1)
    8. # 等待客户端链接
    9. conn, address =socket_server.accept()
    10. print(f"接收到客户端的信息{address}")
    11. while True:
    12. data: str = conn.recv(1024).decode("UTF-8")
    13. print(f"客户端消息{data}")
    14. # 发送回复消息
    15. msg = input("输入回复消息:")
    16. if msg == 'exit':
    17. break
    18. conn.send(msg.encode("UTF-8"))
    19. # 关闭连接
    20. conn.close()
    21. socket_server.close()

    客户端、

    1. import socket
    2. # 创建socket对象
    3. socket_client = socket.socket()
    4. # 连接到服务器
    5. socket_client.connect(("localhost", 8888))
    6. while True:
    7. msg = input("输入发送消息:")
    8. if(msg == 'exit'):
    9. break
    10. # 发送消息
    11. socket_client.send(msg.encode("UTF-8"))
    12. #接收返回消息
    13. recv_data = socket_client.recv(1024)
    14. print(f"服务端回复消息:{recv_data.decode('UTF-8')}")
    15. # 关闭链接
    16. socket_client.close()

    正则表达式使用

    1. import re
    2. s = "pythonxxxxxxpython"
    3. result = re.match("python",s) # 从左到右匹配
    4. print(result) #
    5. print(result.span()) # (0, 6)
    6. print(result.group()) # python
    7. result = re.search("python",s) # 匹配到第一个
    8. print(result) #
    9. result = re.findall("python",s) # 匹配全部
    10. print(result) # ['python', 'python']

    单字符匹配

    数量匹配

    边界匹配

    分组匹配

    1. pattern = "1[35678]\d{9}"
    2. phoneStr = "15288888888"
    3. result = re.match(pattern, phoneStr)
    4. print(result) #

    递归

    递归显示目录中文件

    1. import os
    2. def get_files_recursion_dir(path):
    3. file_list = []
    4. if os.path.exists(path):
    5. for f in os.listdir(path):
    6. new_path = path + "/" + f
    7. if os.path.isdir(new_path):
    8. file_list += get_files_recursion_dir(new_path)
    9. else:
    10. file_list.append(new_path)
    11. else:
    12. print(f"指定的目录{path},不存在")
    13. return []
    14. return file_list
    15. if __name__ == '__main__':
    16. print(get_files_recursion_dir("D:\test"))

  • 相关阅读:
    基于 P-Tuning v2 进行 ChatGLM2-6B 微调实践
    Python——numpy库详解 (二)
    MySQL(4)
    公网IP和私有IP
    kprobe 内核实现原理
    简单的学生信息管理系统
    招募 | “壹脑云科研圈“招募新成员啦
    数据结构 - 双向链表
    HTML进阶(3)- 表单元素
    互联网公司研发效能/工程效率团队建设和规划
  • 原文地址:https://blog.csdn.net/qq_29385297/article/details/128085103