python 高级技巧

闭包

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

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

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

def outer(logo):
    def inner(msg):
        print(f"{logo}:{msg}")
    return inner

fun = outer("java")
fun("hello world")

闭包修改外部函数的值

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

def outer(num1):
    def inner(num2):
        nonlocal num1
        num1 += num2
        print(num1)
    return inner

fun = outer(10)
fun(10) # 输出20

优点:

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

缺点:

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

装饰器

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

def outer(func):
    def inner():
        print("我要睡觉了")
        func()
        print("我起床了")
    return inner

@outer
def sleep():
    print("睡眠中")

sleep()

单例模式

# 单例
def strTool():
    pass

signle = strTool()

#==

from 单例 import signle

t1 = signle
t2 = signle
print(id(t1))
print(id(t2))

工厂模式

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

好处:

  • 大批量创建对象的时候有统一的入口,易于代码维护
  • 当发生修改,仅修改工厂类的创建方法即可
class Person:
    pass

class Worker(Person):
    pass

class Student(Person):
    pass

class Teacher(Person):
    pass

class PersonFactory:
    def get_person(self,p_type):
        if p_type == 'w':
            return Worker()
        elif p_type == 's':
            return Student()
        else:
            return Teacher()


pf = PersonFactory()
worker = pf.get_person('w')
student = pf.get_person('s')
teacher = pf.get_person('t')

多线程

threading模块使用

import threading
import time

def sing(msg):
    print(msg)
    time.sleep(1)


def dance(msg):
    print(msg)
    time.sleep(1)


if __name__ == '__main__':
  sing_thread = threading.Thread(target=sing,args=("唱歌。。。",))
  dance_thread = threading.Thread(target=dance,kwargs={"msg":"跳舞。。。"})
  sing_thread.start()
  dance_thread.start()

Socket

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

服务端

# 创建Socket对象
import socket
socket_server = socket.socket()
# 绑定IP地址和端口
socket_server.bind(("localhost", 8888))
# 监听端口
socket_server.listen(1)
# 等待客户端链接
conn, address =socket_server.accept()

print(f"接收到客户端的信息{address}")

while True:
    data: str = conn.recv(1024).decode("UTF-8")
    print(f"客户端消息{data}")

    # 发送回复消息
    msg = input("输入回复消息:")
    if msg == 'exit':
        break
    conn.send(msg.encode("UTF-8"))

# 关闭连接
conn.close()
socket_server.close()

客户端、

import socket
# 创建socket对象
socket_client = socket.socket()
# 连接到服务器
socket_client.connect(("localhost", 8888))
while True:
    msg = input("输入发送消息:")
    if(msg == 'exit'):
        break
    # 发送消息
    socket_client.send(msg.encode("UTF-8"))
    #接收返回消息
    recv_data = socket_client.recv(1024)
    print(f"服务端回复消息:{recv_data.decode('UTF-8')}")

# 关闭链接
socket_client.close()

正则表达式使用

import re
s = "pythonxxxxxxpython"

result = re.match("python",s) # 从左到右匹配
print(result) # <re.Match object; span=(0, 6), match='python'>
print(result.span()) # (0, 6)
print(result.group()) # python

result = re.search("python",s) # 匹配到第一个
print(result) # <re.Match object; span=(0, 6), match='python'>

result = re.findall("python",s) # 匹配全部
print(result) # ['python', 'python']

单字符匹配

数量匹配

边界匹配

分组匹配

pattern = "1[35678]\d{9}"
phoneStr = "15288888888"
result = re.match(pattern, phoneStr)
print(result) # <re.Match object; span=(0, 11), match='15288888888'>

递归

递归显示目录中文件

import os

def get_files_recursion_dir(path):
    file_list = []
    if os.path.exists(path):
        for f in os.listdir(path):
            new_path = path + "/" + f
            if os.path.isdir(new_path):
                file_list += get_files_recursion_dir(new_path)
            else:
                file_list.append(new_path)
    else:
        print(f"指定的目录{path},不存在")
        return []

    return file_list

if __name__ == '__main__':
    print(get_files_recursion_dir("D:\test"))

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值