Python高级技巧

news2024/11/15 7:58:59

十三、Python高级技巧

1. 闭包

解决全局变量问题:

  • 代码在命名空间上(变量定义)不够干净、整洁
  • 全局变量又被修改的风险
  • 定义:

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

  • 简单闭包

    def outer(logo: str):
        def inner(msg: str):
            print(f"<{logo}><{msg}><{logo}>")
    
        return inner
    
    
    fn1 = outer('稀土掘金') 
    fn1('xzq')  # <稀土掘金><xzq><稀土掘金>
    fn1('XZQ0723')  # <稀土掘金><XZQ0723><稀土掘金>
    
  • nonlocal关键字

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

    def outer(num1):
    def inner(num2):
        nonlocal num1
        num1 += num2
        print(num1)
    
    return inner
    
    
    fn = outer(10)
    fn(10)  # 20
    fn(10)  # 30
    fn(10)  # 40
    
  • 优点:

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

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

2. 装饰器

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

  • 装饰器的一般写法

    • 希望给sleep函数,增加一个功能
      • 在调用sleep前输出:我要睡觉了
      • 在调用sleep后输出:我起床了
    # 装饰器的一般写法(闭包)
    def sleep():
        import random
        import time
        print('睡眠中...')
        time.sleep(random.randint(1, 5))
    
    
    def outer(func):
        def inner():
            print('我睡了')
            func()
            print('我醒了')
    
        return inner
    
    
    fn = outer(sleep)
    fn()
    
  • 装饰器的语法糖写法

    使用@outer定义在目标函数sleep之上

    • 和上方同样的功能

      # 装饰器的语法糖写法
      def outer(func):
          def inner():
              print('我睡了')
              func()
              print('我醒了')
      
          return inner
      
      
      @outer
      def sleep():
          import random
          import time
          print('睡眠中...')
          time.sleep(random.randint(1, 5))
      
      
      sleep()
      

3. 多线程

  • 进程和线程

    ​ 进程:是操作系统中正在运行的程序的实例。每个进程都有自己的内存空间、代码、数据等等。进程之间是独立的,它们无法互相访问对方的内存空间,只有通过进程间通信才能实现数据的共享。

    ​ 线程:相对于进程而言,线程的开销更小,调度更快捷。另外,线程的并发能力更强,对于多核CPU来说也更加高效,因为不同的线程可以在不同的CPU内核上同时执行。但是,线程之间的共享变量可能会导致线程安全问题,需要加锁保护。

    在这里插入图片描述

  • 多线程网络编程

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

    • 语法

      thread_obj = threading.Thread([group [, target [, name [, args [,kwargs]]]]])
      # group:暂时无用,未来功能的预留参数
      # target:执行的目标任务名
      # args:以元组的方式给执行任务传参
      # kwargs:以字典方式给执行任务传参
      # name:线程名,一般不用设置
      # 启动线程,让线程开始工作
      thread_obj.start()
      
    • 示例:

    import threading
    import time
    
    
    def sing(msg):
        while True:
            print(msg)
            time.sleep(1)
    
    
    def dance(msg):
        while True:
            print(msg)
            time.sleep(1)
    
    
    if __name__ == '__main__':
        t1 = threading.Thread(target=sing, args=('啦啦啦',))
        t2 = threading.Thread(target=dance, kwargs={"msg": "舞舞舞"})
        t1.start()
        t2.start()
    

4. Socket网络编程

​ socket (简称 套接字) 是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间想要进行网络通信需要Socket。Socket负责进程之间的网络数据传输,好比数据的搬运工。
在这里插入图片描述

  • 2个进程之间通过Socket进行相互通讯,就必须有服务端和客户端

    • Socket服务端:等待其它进程的连接、可接受发来的消息、可以回复消息

    • Socket客户端:主动连接服务端、可以发送消息、可以接收回复

  • 服务端示例

    import socket
    
    # 1.创建Socket对象
    socket_server = socket.socket()
    
    # 2.绑定ip地址和端口 服务端bind
    socket_server.bind(("localhost", 8888))
    
    # 3.监听端口
    # listen方法内的参数表示可以链接的次数
    socket_server.listen(1)
    
    # 4.等待客户端连接
    # result为一个元组 ,accept()方法是阻塞的方法,等待客户端的连接如果没有连接,卡在这一行,就不会往下执行
    # result = socket_server.accept()
    # conn = result[0]  # 客户端的连接对象
    # address = result[1]  # 客户端的地址信息
    conn, address = socket_server.accept()
    
    print(f'接收到客户端的链接,客户端的信息是:{address}')
    while True:
        # 5.接收客户端的信息,要使用客户端和服务端的本次连接对象,而非socket_server对象
        # recv的接收的参数事缓冲区大小,一般是1024即可,
        # 返回值是一个字节数组,也就是bytes对象,不是字符串,可以通过decode方法通过UTF-8编码,将字节数组转换为字符串对象
        #
        data: str = conn.recv(1024).decode('UTF-8')
        print(f'客户端发来的消息是:{data}')
    
        # 6. 发送回复信息
        # encode可以将字符串编码为字节数组
        msg = input('请输入你要和客户端回复的消息:')
        if msg == 'exit':
            break
        conn.send(msg.encode('UTF-8'))
    
    # 7.关闭连接
    conn.close()
    socket_server.close()
    
  • 客户端示例

    import socket
    
    # 1.创建Socket对象
    socket_client = socket.socket()
    
    # 2.连接到服务端ip地址和端口 客户端connect
    socket_client.connect(("localhost", 8888))
    while True:
        msg = input('请输入要给服务端发送的信息:')
        if msg == 'exit':
            break
        # 3.发送消息
        socket_client.send(msg.encode("UTF-8"))
    
        # 4.接收返回消息
        recv_data = socket_client.recv(1024)
        print(f'服务端返回的消息是: {recv_data.decode("UTF-8")}')
    
    # 5.关闭连接
    socket_client.close()
    

5. 正则表达式

​ 正则表达式,又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则)的文本。简单来说,正则表达式就是使用:字符串定义规则,并通过规则去验证字符串是否匹配。

  • 基本匹配

    import re
    
    s = 'xzq python xzq python xzq python'
    # match 从头匹配
    result1 = re.match('xzq', s)
    print(F'match 结果:{result1}')
    # print(result1.span())
    # print(result1.group())
    
    # search 搜索匹配 从前向后,找到第一个就停止
    result2 = re.search('python', s)
    print(F'search 结果:{result2}')
    # print(result2.span())
    # print(result2.group())
    
    # findall 搜索全部匹配
    result3 = re.findall('python', s)
    print(F'search 结果:{result3}')
    
  • 元字符匹配

    • 单字符匹配

      字符功能
      .匹配任意1个字符(除了\n),.匹配点本身
      []匹配[]中列举的字符
      \d匹配数字0-9
      \D匹配非数字
      \s匹配空白,即空格、tab键
      S\匹配非空白
      \w匹配单词字符,即a-z、A-Z、0-9、_
      \W匹配非单词字符
    • 数量匹配

      字符功能
      *匹配前一个规则的字符出现0-无数次
      +匹配前一个规则的字符出现1-无数次
      ?匹配前一个规则的字符出现0次或1次
      {m}匹配前一个规则的字符出现m次
      {m,}匹配前一个规则的字符出现至少m次
      {m,n}匹配前一个规则的字符出现m-n次次
    • 边界匹配

      字符功能
      ^匹配字符串开头
      $匹配字符串结尾
      \b匹配一个单词的边界
      \B匹配非单词的边界
    • 分组匹配

      字符功能
      |匹配左右任意一个表达式
      ()将括号中字符作为一个分组

    示例:

    import re
    
    s = "!!xzq %^$&*xzq 22311 xzq_666 @@ ll"
    result = re.findall(r'[a-zA-Z0-9]', s)  # 字符串前带r,表示字符串中转义字符无效
    print(result)
    # 匹配账号,只能由字母和数字组成,长度限制6到10位
    result1 = re.findall(r'^[a-zA-Z0-9]{6,10}$', '4556xzq')
    print(result1)
    # 匹配QQ号,要求纯数字,长度5-11,第一位不为0
    result2 = re.findall(r'^[1-9][0-9]{4,10}$', '710675281')
    print(result2)
    
    # 匹配邮箱地址,只允许qq、163、gmail这三种邮箱地址
    result3 = re.match(r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)', '710.675281@qq.com')
    print(result3)
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1122189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是内存泄漏,为什么threadlocal会造成内存泄漏?

内存泄漏&#xff1a;指的是应用程序中存在无用的对象或者资源没有被垃圾回收机制回收&#xff0c;从而导致内存占用不断增加&#xff0c;最终导致应用程序的崩溃。 jvm里对象的引用按照从强到弱&#xff0c;分为四个强&#xff0c;软&#xff0c;弱&#xff0c;虚。强引用不会…

YOLOv8改进实战 | 更换主干网络Backbone之PoolFormer篇

目录 一、PoolFormer二、代码实现2.1 添加PoolFormer网络2.2 注册PoolFormer网络2.3 配置yaml文件yolov8-PoolFormer.yaml2.3 模型验证2.4 模型训练三、总结一、PoolFormer 2022 CVPR 论文链接:MetaFormer Is Actually What You Need for Vision Pytorch code:poolformer

微信支付API

微信支付API 一、概念二、主要实现步骤 一、概念 主要经过小程序内调用登录接口、商户server调用支付统一下单、商户server调用再次签名&#xff0c;商户server接受支付通知&#xff0c;商户server查询支付结果。 二、主要实现步骤 1、小程序调用wx.login方法&#xff0c;获…

AD9371 官方例程之 tx_jesd 与 xcvr接口映射

文章目录 前言一、AD9371 ----> FMC_DP二、FMC_DP ----> FPGA_TX/RX三、rx_data_x and tx_data_x must be connected to the same channel四、ADRV9009 前言 axi_ad9371_tx_jesd --> util_ad9371_xcvr接口映射讲解 一、AD9371 ----> FMC_DP AD9371内部原理图 …

oracle实现搜索不区分大小写

<if test"code ! null and code ! ">and upper(code) like upper(%${code}%) </if>关键字upper

简单了解一下:NodeJS的fs文件系统

NodeJS提供了fs模块来本地文件。大致有这些内容&#xff1a; 文件读写 在操作文件之前&#xff0c;我们需要检查一下这个文件是否存在&#xff0c;fs模块提供了access方法&#xff0c;语法如下&#xff1a;fs.access(path,mode,callback)。 path&#xff1a;就是文件路径&…

最长上升子序列(二分)代码模板

用二分的思想求最长上升子序列的思想就是保持单调性&#xff0c;用一个q[]数组来作为一个单调数组。 每次将a[i]放进q数组中&#xff0c;但是要保持单调性&#xff0c;q数组的长度就是答案。 q[]数组中存的是所以以下标为长度的最长子序列的结尾的最小值。 理解q[]数组的意义…

Python 机器学习入门之C4.5决策树算法

系列文章目录 第一章 Python 机器学习入门之线性回归 第一章 Python 机器学习入门之梯度下降法 第一章 Python 机器学习入门之牛顿法 第二章 Python 机器学习入门之逻辑回归 番外 Python 机器学习入门之K近邻算法 番外 Python 机器学习入门之K-Means聚类算法 第三章 Python 机…

基于FPGA的图像拉普拉斯变换实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a vivado2019.2 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 202…

GDB调试简单介绍

最近和许多同事交流时&#xff0c;发现好多人只是在IDE上debug&#xff0c;但是gdb却一点都不了解&#xff1b;校招新来的同事更是都没听过gdb这个工具&#xff0c;所以在培训时给他们培训了一下&#xff1b;另外好久也没写blog了&#xff0c;刚好把这篇笔记简单分享一下。 0 …

NetSuite SuiteWorld 2023观后感

25年&#xff01;本周结束的SuiteWorld 2023是NetSuite的25周年庆。 下面两张照片分别来自1998年和今年。同样的人&#xff0c;同样的地点。左二是Evan&#xff0c;NetSuite的主要创始人。 当Evan展望未来25年后NetSuite这四位创始人的样子时。Evan GPT&#xff0c;给出了如下…

XIlinx提供的DDR3 IP与 UG586

DDR系统需要关注的三样东西&#xff1a;控制器、PHY、SDRAM颗粒&#xff0c;但这是实现一个DDR3 IP所需要的&#xff0c;如果只希望调用IP的话&#xff0c;则只需要调用IP即可&#xff0c;目前时间紧急&#xff0c;我先学一学如何使用IP&#xff0c;解决卡脖子的问题&#xff0…

Linux系统管理:虚拟机Kylin OS安装

目录 一、理论 1.Kylin OS 二、实验 1.虚拟机Kylin OS安装准备阶段 2.安装Kylin OS 3.进入系统 一、理论 1.Kylin OS &#xff08;1&#xff09;简介 麒麟操作系统&#xff08;Kylin OS&#xff09;亦称银河麒麟&#xff0c;是由中国国防科技大学、中软公司、联想公司…

Go-Python-Java-C-LeetCode高分解法-第十一周合集

前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接&#xff1a;LeetCode-Go-Python-Java-C 欢迎订阅CSDN专栏&#xff0c;每日一题&#xff0c;和博主一起进步 LeetCode专栏 我搜集到了50道精选题&#xff0c;适合速成概览大部分常用算法 突…

SpringBoot 入门 参数接收

接口声明 RestController //表示该类为请求处理类public class HttpDeal {RequestMapping("/login")//这个方法处理哪一个地址过来的请求public String hello(){return "返回给浏览器";}}接收参数 RequestMapping("/login")public String logi…

Spring框架(四)

1、Spring6整合JUnit 1、JUnit4 User类: package com.songzhishu.spring.bean;import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;/*** BelongsProject: Spring6* BelongsPackage: com.songzhishu.spring.bean*…

文档的重要性及接口文档模板

随着工作年限的增长&#xff0c;我们逐渐意识到工作中文档的重要性不可忽视。优质的文档不仅能提高工作效率&#xff0c;还能有效降低沟通成本&#xff0c;因此我们必须注重文档的撰写和格式。最近&#xff0c;由于未能及时更新文档&#xff0c;导致在项目开发中出现了信息冲突…

[Golang]多返回值函数、defer关键字、内置函数、变参函数、类成员函数、匿名函数

函数 文章目录 函数多返回值函数按值传递、按引用传递类成员函数改变外部变量变参函数defer和追踪说明一些常见操作实现 使用defer实现代码追踪记录函数的参数和返回值 常见的内置函数将函数作为参数闭包实例闭包将函数作为返回值 计算函数执行时间使用内存缓存来提升性能 参考…

在Lichee RV Dock上的不成功的烧录尝试

最近在学基于risc-v的简单操作系统&#xff0c;刚好手里有块Lichee RV Dock 的板子&#xff0c;所以在学了基础的"hello, world"程序后&#xff0c;想着能不能把这个程序烧录到板子上&#xff0c;简单的做个实验。 要完成这个任务&#xff0c;需要将程序烧录到sd卡上…

文献阅读:The Reversal Curse: LLMs trained on “A is B” fail to learn “B is A”

文献阅读&#xff1a;The Reversal Curse: LLMs trained on “A is B” fail to learn “B is A” 1. 文章简介2. 实验 & 结果考察 1. finetune实验2. 真实知识问答 3. 结论 & 思考 文献链接&#xff1a;https://arxiv.org/abs/2309.12288 1. 文章简介 这篇文章是前…