2024速通python之python高阶技巧

「章节总览」
 
      【2024速通python之python基础 https://blog.csdn.net/weixin_45404884/article/details/138578955】
      【2024速通python之python进阶 https://blog.csdn.net/weixin_45404884/article/details/138663338】
      【2024速通python之python高阶 https://blog.csdn.net/weixin_45404884/article/details/138810133】
      【2024速通python之python面向对象https://blog.csdn.net/weixin_45404884/article/details/139473507】
      【2024速通python之python高阶技巧https://blog.csdn.net/weixin_45404884/article/details/139521584】

一、闭包

1.什么是闭包

  • 定义双层嵌套函数, 内层函数可以访问外层函数的变量
  • 将内存函数作为外层函数的返回,此内层函数就是闭包函数

这里的inner就是闭包函数,如果需要修改外层函数的outerNum变量,则需要用nonlocal关键字来声明

def outer(outerNum):
    def inner(innerNum):
        nonlocal outerNum
        outerNum = outerNum + 1
        print(f"Inner function num is {innerNum} and outer function num is {outerNum}")
    return inner


out = outer(100)
out(200)

2.优缺点

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

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

3.nonlocal关键字

在闭包函数(内部函数中)想要修改外部函数的变量值,需要用nonlocal声明这个外部变量

二、装饰器

1.什么是装饰器

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

2.举例

将下面的睡觉函数,在调用sleep前后输出,“我打算睡觉了”、“我起床了”

def sleep():
    time.sleep(2)
    print("睡眠中....")

sleep()

3.传统方式

def sleep():
    time.sleep(2)
    print("睡眠中....")


print("我打算睡觉了")
sleep()
print("我起床了")

4.装饰器方式

def sleep():
    time.sleep(2)
    print("睡眠中....")
    
def outer(func):
    def inner():
        print("我打算睡觉了")
        func()
        print("我起床了")

    return inner

fn = outer(sleep)
fn()

5.语法糖写法

简化了调用,增加@outer注解在调用方法上,相当于java中为某个方法增加切面

def outer(func):
    def inner():
        print("我打算睡觉了")
        func()
        print("我起床了")

    return inner

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

sleep()

三、多线程

1.线程参数

Python的多线程可以通过threading模块来实现。

  • target:执行的目标任务名称
  • args:以元组的方式给执行任务传参
  • name:线程名
  • daemon:是否设置为守护线程
  • kwargs:以字典方式传参

2.多线程编程

def sing(msg):
    print(f"我在唱歌。。。{msg}")

def dance(msg):
    print(f"我在跳舞。。。{msg}")

import threading

thread_obj1 = threading.Thread(target=sing, args=('开心!',), name='sing')

thread_obj2 = threading.Thread(target=dance, args=('快乐!',), name='dance')

thread_obj1.start()
thread_obj2.start()

四、网络编程

1.Socket服务端编程

主要分为如下几个步骤:

  • 创建socket对象
  • 绑定socket_server到指定IP和地址
  • 服务端开始监听端口
  • 接收客户端连接,获得连接对象
  • 客户端连接后,通过recv方法,接收客户端发送的消息
  • 通过conn(客户端当次连接对象),调用send方法可以回复消息
  • conn(客户端当次连接对象)和socket_server对象调用close方法,关闭连接

代码示例:

import socket

socket_server = socket.socket()
socket_server.bind(('127.0.0.1', 8888))
socket_server.listen()

conn, addr = socket_server.accept()
print('Connected by', addr)
while True:
    data = conn.recv(1024).decode('utf-8')
    if data == 'exit':
        break
    print(f"接收到的客户端数据: {data}")
    conn.send("你好,我是服务端".encode('utf-8'))

conn.close()
socket_server.close()

2.Socket客户端编程

主要分为如下几个步骤:

  • 创建socket对象
  • 连接到服务端
  • 发送消息
  • 接收返回消息
  • 关闭链接

代码示例:

import socket

socket_client = socket.socket()
socket_client.connect(('127.0.0.1', 8888))

while True:
    send_msg = input("输入要发送的消息:")
    if send_msg == "exit":
        break
    socket_client.send(send_msg.encode("utf-8"))
    recv_msg = socket_client.recv(1024)
    print("服务端回复的消息:", recv_msg.decode("utf-8"))

socket_client.close()
  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值