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"))

Python的设计哲学是“优雅”、“明确”、“简单。Python用途极广。图形处理:有PIL、Tkinter等图形库支持,能方便进行图形处理。 数学处理:NumPy扩展提供大量与许多标准数学库的接口。 文本处理:python提供的re模块能支持正则表达式,还提供SGML,XML分析模块,许多程序员利用python进行XML程序的开发。 数据库编程:程序员可通过遵循Python DB-API(数据库应用程序编程接口)规范的模块与Microsoft SQL Server,Oracle,Sybase,DB2,MySQL、SQLite等数据库通信。python自带有一个Gadfly模块,提供了一个完整的SQL环境。 网络编程:提供丰富的模块支持sockets编程,能方便快速地开发分布式应用程序。很多大规模软件开发计划例如Zope,Mnet 及BitTorrent. Google都在广泛地使用它。 Web编程:应用的开发语言,支持最新的XML技术。 多媒体应用:Python的PyOpenGL模块封装了“OpenGL应用程序编程接口”,能进行二维和三维图像处理。PyGame模块可用于编写游戏软件。 pymo引擎:PYMO全称为python memories off,是一款运行于Symbian S60V3,Symbian3,S60V5, Symbian3, Android系统上的AVG游戏引擎。因其基于python2.0平台开发,并且适用于创建秋之回忆(memories off)风格的AVG游戏,故命名为PYMO。 黑客编程:python有一个hack的库,内置了你熟悉的或不熟悉的函数,但是缺少成就感。 用Python写简单爬虫
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值