【黑马程序员】Python高阶

文章目录

  • 闭包
    • 定义
    • nonlocal关键字作用
    • 优缺点
      • 优点
      • 缺点
    • 装饰器
      • 装饰器闭包写法
  • 设计模式
    • 单例模式
    • 工厂模式
      • 优点
      • 代码示例
  • 多线程
    • 基本概念
    • threading模块
  • 网络编程
    • 服务端开发
      • socket
      • socket服务端编程
    • 客户端开发
  • 正则表达式
    • 正则的三个基础方法
      • match
      • search
      • findAll
    • 元字符匹配
      • 单字符匹配
      • 数量匹配
      • 边界匹配
      • 分组匹配

闭包

定义

  • 定义双层嵌套函数,内层函数可以访问外层函数的变量
  • 将内层函数作为外层函数的返回,此内层函数就是闭包函数
  • 代码示例
def out_func1(label):def in_func1(msg):print(f'{label}{msg}{label}')return in_func1out = out_func1("边框")
out("hello")

nonlocal关键字作用

  • 在闭包函数修改外层函数的变量值
  • 代码示例
def outer_func(out_num):def in_func(in_num):# 修改外层变量nonlocal out_numout_num += in_numprint(out_num)return in_func

优缺点

优点

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

缺点

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

装饰器

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

装饰器闭包写法

  • 定义一个闭包函数,在闭包函数内部
    • 执行目标函数
    • 完成功能的添加
  • 代码示例
# 装饰器语法糖写法
def outer1(func):def inner():print("start")func()print("end")return inner@outer1
def sleep1():import randomimport timeprint("sleep...")time.sleep(random.randint(1, 5))sleep1()

设计模式

单例模式

  • 一个类无论获取多少次类对象,都只提供一个具体的实例
  • 好处:节省创建类对象的开销和内存开销
  • 使用场景:当一个类只有一个实例,而客户可以从一个众所周知的访问节点访问它
  • 代码示例
# 在一个文件中定义要实现单例的类
# *_*coding:utf-8 *_*class StrTools:passstr_tools = StrTools()# 在另一个文件中导入单例对象
# *_*coding:utf-8 *_*
from 单例模式 import str_toolss1 = str_tools
s2 = str_tools
print(s1)
print(s2)

工厂模式

优点

  • 大批量创建对象的时候有统一的入口,易于代码维护
  • 当发生修改,进修改工厂类的创建方法即可
  • 符合现实世界的模式,即由工厂来制作产品

代码示例

# *_*coding:utf-8 *_*
class Person:passclass Worker(Person):passclass Sturent(Person):passclass Teacher(Person):passclass Factory:def get_person(self, p_type):if p_type == 'w':return Worker()elif p_type == 's':return Sturent()else:return Teacher()factor = Factory()
worler = factor.get_person('w')
student = factor.get_person('s')
teacher = factor.get_person('t')

多线程

基本概念

  • 进程:程序在操作系统内运行,即成为一个运行进程
  • 线程:进程内部可以有多个线程,程序的运行本质上是由进程内部的线程在实际工作的
  • 并行执行
    • 多个进程同时在运行,即不同的程序同时运行,称之为:多任务并行执行
    • 一个进程内的多个线程同时在运行,称之为:多线程并行执行

threading模块

  • Python的多线程可以通过threading模块来实现
  • 语法
import threadingthread_obj = threading.Thread([group[, target[, name[, args[, kwargs]]]]])
group:预留参数,暂未使用
target:执行的目标任务名
args:以元组的方式给执行任务传参
kwargs:以字典的方式给执行任务传参
name:线程名,一般不设置# 启动线程
thread_obj.start()
  • 代码示例
# *_*coding:utf-8 *_*import time
import threadingdef sing(msg):while True:print(f"{msg}")time.sleep(1)def dance(msg):while True:print(f'{msg}')time.sleep(1)if __name__ == '__main__':# 创建一个sing线程,通过元组方式传参sing_thread_obj = threading.Thread(target=sing, args=("sing sing sing",))# 创建一个dance线程,通过字段方式传参dance_thread_obj = threading.Thread(target=dance, kwargs={"msg": "dance dance dance"})# 启动两个线程sing_thread_obj.start()dance_thread_obj.start()

网络编程

服务端开发

socket

  • socket是进程之间的一个通信工具,socket负责进程之间的网络数据传入
  • socket服务端:等到其它进程的连接、可接受发来的消息,可以回复消息
  • socket客户端:主动连接服务端、可以发送消息,可以接收消息

socket服务端编程

  • 步骤
    • 创建socket对象
    • 绑定socket_server到指定IP和地址
    • 服务端开始监听端口
    • 接收客户端连接,获取连接对象
    • 客户端连接后,通过recv方法,接收客户端发送的消息
    • 通过conn,调用send方法可以回复消息
    • conn和socket_server对象调用close方法关闭连接
  • 代码示例
# *_*coding:utf-8 *_*
import socket# 创建socket对象
socket_servre = socket.socket()
# 绑定socket_server到指定IP和地址
socket_servre.bind(("127.0.0.1", 9000))
# 服务端开始监听端口,参数表示允许的链接数量,超出会等待,可以不填,不填会自动设置一个合理值
socket_servre.listen(10)
# 接收客户端连接,获得连接对象,accept是阻塞方法
# conn为客户端和服务端的连接对象
# addr为客户端的地址信息
conn, addr = socket_servre.accept()
print(f'Accept,address:{addr}')
# 客户端连接后,通过recv方法,接收客户端发送的消息
while True:# recv方法的返回值是字节数组(Bytes),可以通过decode使用UTF-8解码为字符串# recv方法的传参是buffsize,缓冲区大小data = conn.recv(1024).decode("UTF-8")if data == 'exit':breakprint(f'接收到发送的数据:{data}')# 将字符串编码为字节数组对象conn.send(input('输入要回复给客户端的信息:').encode("UTF-8"))
conn.close()
socket_servre.close()

客户端开发

  • 步骤
    • 创建socket对象
    • 连接到服务端
    • 发送消息
    • 接收返回消息
    • 关闭连接
  • 代码示例
# *_*coding:utf-8 *_*
import socket# 创建socket对象
socket_client = socket.socket()
# 连接到服务端
socket_client.connect(('127.0.0.1', 9000))
# 发送消息
while True:send_msg = input("请输入要发送的消息:")if send_msg == 'exit':break# 将字符串转化为字节数组socket_client.send(send_msg.encode('UTF-8'))# 接收返回消息recv_data = socket_client.recv(1024).decode('UTF-8')print(f'服务端回复的消息:{recv_data}')# 关闭客户端连接
socket_client.close()

正则表达式

正则的三个基础方法

  • Python正则表达式,使用re模块,并基于match、search、findall来做正则匹配

match

  • 语法:re.match(匹配规则,被匹配的字符串)
  • 从被匹配字符串开头进行匹配,匹配成功返回匹配对象,匹配不成功返回空
  • 特点:从头开始匹配
  • 代码示例
# *_*coding:utf-8 *_*
import re# 从开头开始匹配,如果开头都不匹配直接返回None
# 匹配成功
s = "python itheima python itheima python itheima"
result = re.match('python', s)
print(result)
# span 匹配成功所在的字符串下标
print(result.span())
# 匹配成功的值是什么
print(result.group())# 匹配不成功
s1 = "1python itheima python itheima python itheima"
result = re.match('python', s1)
print(result)

search

  • 语法:search(匹配规则, 被匹配字符串)
  • 功能:搜索整个字符串,找出匹配的。从前向后,找到第一个后,就停止,不会继续向后
  • 特点:只匹配一个
  • 代码示例
# *_*coding:utf-8 *_*
import re# 匹配不成功
s1 = "1python itheima python itheima python itheima"
result = re.search('python', s1)
print(result)
# span找到后的下标位置
print(result.span())
# 找到后匹配的字符串
print(result.group())

findAll

  • 语法:findall(匹配规则, 被匹配字符串)
  • 功能:匹配整个字符串,找出全部匹配项,找不到返回空list
  • 代码示例
# *_*coding:utf-8 *_*
import re# 匹配不成功
s1 = "1python itheima python itheima python itheima"
result = re.findall('python', s1)
print(result)

元字符匹配

单字符匹配

在这里插入图片描述

数量匹配

在这里插入图片描述

边界匹配

在这里插入图片描述

分组匹配

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot 博客_002 项目环境配置

引入相关依赖 mysqlmybatis <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-…

idea远程试调jar、远程试调war

idea远程试调jar、远程试调war 目的&#xff1a;测试运行时与ide开发时是否一致。 配置jar Maven中添加 <packaging>jar</packaging>将其打包为jar。 设置运行入口main 编译jar 看到jar输出 配置试调 添加jar运行 远程试调 先在源码中打好断点试调 debug运行…

机器人路径规划:基于双向A*算法(bidirectional a star)的机器人路径规划(提供Python代码)

一、双向A*算法简介 传统A*算法是一种静态路网中求解最短路径最有效的方法&#xff0c; 它结合了BFS 算法和迪杰斯特拉算法(Dijkstra)的优点。 和迪杰斯特拉算法(Dijkstra)一样&#xff0c; A*算法能够用于 搜索最短路径&#xff1b; 和BFS 算法一样&#xff0c; A*算法可以用…

【异常处理】SpringMVC无法跳转视图问题

浏览器发送请求给控制器&#xff0c;但是结果是404报错&#xff0c;又试了一下返回json字符串&#xff0c;json可以获取到&#xff0c;所以应该springmvc出了问题。 查看controller&#xff0c;发现无法加载视图

基于FPGA的光纤通信系统的实现的优化技巧与方法

逻辑电路基本框架回顾 跨时钟域同步技术 读写操作相互独立时钟域 A 和 B 不需要一致的相位由专门逻辑控制读写操作的切换 高速数据的乒乓缓存技术

深入理解模板进阶:掌握C++模板的高级技巧

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

分析基于解析物理模型的E模式p沟道GaN高电子迁移率晶体管(H-FETs)

来源&#xff1a;Analyzing E-Mode p-Channel GaN H-FETs Using an Analytic Physics-Based Compact Mode&#xff08;TED 24年&#xff09; 摘要 随着近期对用于GaN互补技术集成电路&#xff08;ICs&#xff09;开发的p沟道GaN器件研究兴趣的激增&#xff0c;一套全面的模型…

ssh免密登陆更换目标主机后无法连接

在进行hadoop分布式环境搭建时&#xff08;三台机&#xff0c;master&#xff0c;slave1&#xff0c;slave2&#xff09;&#xff0c;后期slave2系统出现问题&#xff0c;更换新机后&#xff0c;master与slave2文件传输失败&#xff1a; 以为是秘钥过期的问题&#xff0c;更换…

【C语言】C语言内存函数

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《C语言》 &#x1f389;道阻且长&#xff0c;行则将至 前言 这篇博客是关于C语言内存函数(memcpy,memmove,memset,memcmp)的使用以及部分的模拟实现 memcpy,memmove,memset,memc…

DHCP在企业网的部署及安全防范

学习目标&#xff1a; 1. DHCP能够解决什么问题&#xff1f; 2. DHCP服务器如何部署&#xff1f; 3. 私接设备会带来什么问题以及如何防范&#xff1f; 给DHCP服务器配置地址&#xff1a; 地址池&#xff1a; DHCP有2种分配模式&#xff1a;全局分配和接口分配 DHCP enable

Unity在UGUI上通过绘制网格顶点自由画线

该插件的实现是使用UI组件的绘图API来动态生成和修改几何形状&#xff0c;可自由动态更改画线的粗细、拐角圆滑度、颜色&#xff0c;自由增减节点&#xff0c;不额外增加gameobject&#xff0c;并且在原生的UGUI上以ScreenSpace-Overlay的状态下&#xff0c;显示效果如下所示 …

Vue2(七):超详细vue开发环境搭建(win7),nodejs下载与安装,安装淘宝镜像(报错已解决),配置脚手架

一、安装node.js 本来想粗略写一下的&#xff0c;但是搭建脚手架的时候&#xff0c;遇到了很多问题&#xff0c;浪费快两天时间&#xff0c;记录一下自己的解决办法希望对你们有帮助&#xff01; 1.下载nodejs 安装包下载链接【CNPM Binaries Mirror】 下载我划线的这个&am…

HTML案例-1.标签练习

效果 源码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&g…

蓝桥杯-Sticks-DFS搜索

题目 样例输出是 6 5 题目中给错了&#xff0c;不知道什么时候会改。 思路 --剪枝&#xff0c;否则时间复杂度和空间复杂度过大&#xff0c;会超时。 --注意有多组测试样例时&#xff0c;需要将bool数组重新赋值为false。 --函数类型不是void&#xff0c;return语句不能省…

Wmware安装Linux(centerOS、Ubuntu版本)

目录 1、安装wmware 2、center版本 3、ubuntu版本 1、安装wmware 此处不做展开。 2、center版本 需要提前下载的文件&#xff1a; 无图形化界面https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso 有图形化界面https://mirrors.a…

论文阅读——Vision Transformer with Deformable Attention

Vision Transformer with Deformable Attention 多头自注意力公式化为&#xff1a; 第l层transformer模块公式化为&#xff1a; 在Transformer模型中简单地实现DCN是一个non-trivial的问题。在DCN中&#xff0c;特征图上的每个元素都单独学习其偏移&#xff0c;其中HWC特征图上…

爱恩斯坦棋小游戏使用C语言+ege/easyx实现

目录 1、游戏介绍和规则 2、需要用到的头文件 3、这里我也配上一个ege和easyx的下载链接吧&#xff0c;应该下一个就可以 4、运行结果部分展示 5、需要用到的图片要放在代码同一文件夹下 6、代码地址&#xff08;里面有需要用到的图片&#xff09; 1、游戏介绍和规则 规则如…

C++ Qt开发:QUdpSocket网络通信组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QUdpSocket组件实现基于UDP的网络通信…

Windows server 2008 R2 在VMware虚拟机上的安装

Windows server 2008 R2 在VMware虚拟机上的安装 准备工作VMware 新建并配置虚拟机安装和启动Windows server 2008 R2 准备工作 Windows server 2008 R2 ISO镜像的下载&#xff1a;Windows server 2008 R2 ISO VMware 新建并配置虚拟机 第一步&#xff0c;点击新建虚拟机 第…

sqllab第二十关通关笔记

知识点&#xff1a; cookie注入 可以进行url解析错误注入传参位置 get请求post请求cookie传参 输入admin admin进行登录&#xff0c;抓取当前数据包 通过放包发现是一个302跳转的响应包&#xff0c;页面只有一个 I Love Cookies&#xff1b;没什么信息 通过点击页面上方的按钮…