3.1 python高阶应用

news2024/12/27 15:36:24

文章目录

    • 闭包
    • 装饰器
    • 设计模式
      • 单例模式
      • 工厂模式
    • 多线程
      • 进程、线程和并行执行
      • 多线程编程
    • 网络编程
      • 服务端开发
      • 客户端开发
    • 正则表达式
      • 基础匹配
      • 元字符匹配
    • 递归

闭包


def account_create(inital_account = 0) :
    def atm(num:int,deposite:bool = True) :
        # 声明inital_account是外部声明的inital_account的值,也代表着可以通过内部修改外部的值。
        nonlocal inital_account
        if deposite:
            inital_account+=num
            print(f"存款+{num}元,账户余额{inital_account}元")
        else:
            inital_account -= num
            print(f"取款-{num}元,账户余额{inital_account}元")
    return atm

atm1 = account_create(100)
atm1(200)
atm1(100,False)

小总结:

优点:

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

缺点:

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

装饰器

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

比如我们原本一个函数:

def sleep():
    import random
    import time
    print("睡眠中")
    time.sleep(random.randint(1,5))

# 我们想要输出的结果是:
""" 我要睡觉了
	睡眠中
	我起床了"""
# 我们可以采用下列方法:
print("我要睡觉了")
sleep()
print("我起床了")
# 但是这样子很不优雅,所以可以采用下面的方法
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()

设计模式

设计模式就是一种变成套路,事实上面向对象也是一种设计模式。

设计模式:使用特定的套路得到特定的结果。

单例模式

单例模式是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。

在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。(举个例子,比如一个工具类,我们调用这个工具的时候并不希望每次的调用都产生一个新的类对象来进行使用,毕竟工具只需要一把就行,多了浪费空间。)

定义: 保证一个类只有一个实例,并提供一个访问它的全局访问点。

适用场景: 一个类只能有一个实例,而客户可以从一个从所周知的访问点访问它。

单例的实现模式:

在一个文件中定义如下代码:

class Tool:
	pass

tool = Tool()

在另外一个文件中导入对象

from test import tool
s1 = tool
s2 = tool
print(s1)
print(s2)

输出的结果s1和s2的地址是一致的,其实也说明二者使用的工具也是同一个。

总结:
单例模式就是对一个类,只获取其唯一的类实例对象,持续重复的使用它。

  1. 节省内存。
  2. 节省创建对象的开销。

工厂模式

当需要大量创造一个类的实例的时候,就可以使用工厂模式,即从原生的使用类的构造去创建对象的形式迁移到,基于工厂提供的方法去创建对象的形式。

class Person :
    pass
class Teacher(Person):
    pass
class Student(Person):
    pass

class Factory :
    def get_person_class(self,type :str):
        if type == 's':
            return Student()
        elif type == 't':
            return Teacher()

factory =Factory()
student = factory.get_person_class('s')
teacher = factory.get_person_class('t')

小总结:

优点

  1. 大批类创建对象的时候有统一的入口,易于代码维护。
  2. 当发生修改,仅仅修改工厂类创建方法即可

多线程

进程、线程和并行执行

进程:就是一个程序,运行在系统之上,那么便称这个程序为一个运行进程,并分配进程id方 便系统管理。
线程:线程是归属进程的,一个进程可以开启多个线程,执行不同的工作,是进程实际工作的最小单元。

注意点:

进程之间是存在内存隔离 ,即不同的进程拥有各自的内存空间。

线程之间是内存共享的,线程是属于进程的,一个进程内部的多个线程之间是共享这个进程所拥有的内存空间的。

并行执行:同一时间做不同的工作。进程之间就是并行执行的,操作系统可以同时运行好多程序,这些程序都是并行执行的。相同的线程也是并行执行的。

多个进程同时运行,称之为多任务并行执行,多个线程同时运行,称之为多线程并行执行。

多线程编程

先举个单线程的例子:

def sing() :
    while True:
        print("我在唱歌")
        time.sleep(1)
def dance() :
    while True:
        print("我在跳舞")
        time.sleep(1)

if __name__ == '__main__':
    sing()
    dance()

输出结果:
在这里插入图片描述
他只会出现唱歌,但是并不会出现跳舞,这就是单线程模式。

如果要采用多线程,则需要用到以下的方式:

import threading

thread_obj = threading.Thread([group[,target[,name[,args[,kwards]]]]])
- group: 展示没有作用,未来功能的预留参数
- target: 执行的目标任务名
- args: 以元组的方式给执行的人物传参
- kwards:以字典的方式给执行任务传参
- name: 线程名,一般不用设置。

样例:

import time
import threading
def sing(msg) :
    while True:
        print(msg)
        time.sleep(1)
def dance(msg) :
    while True:
        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负责进程之间的网络数据传输,好比数据的搬运工。

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

socket服务端:等待其他进程的连接,可接受发来的消息,可以回复消息
socket客户端:主动连接服务端,可以发送消息,可以接收回复

一个服务端可以接收多个客户端的消息,并返回信息。

服务端开发

建立一个服务端:

# 1. 创建socket对象
improt socket
socket_server = socket.socket()
# 2. 绑定socket_server到指定的IP和地址
socket_server.bind((host,port))
# 3. 服务端开始监听端口
# backlog为int整数,表示允许的连接数量,超出的会等待,可以不填,不填会自动设置一个合理的值。
socket_server.listen(backlog)
# 4. 接收客户端连接,获得连接对象
# accept方法是阻塞方法:如果没有连接,会卡在当前这一行不向下执行代码
# accept返回的值是一个二元元组,可以使用上述形式,用两个变量接收二元元组的2个元素。
conn,address = socket_server.accept()
print(f"接收到客户端连接,连接来自:{address}")
# 5. 客户端连接后,通过recv方法,接收客户端发送的消息
while True:
	data = conn.recv(1024).decode("UTF-8")
	# recv方法的返回值是字节数组(Byte),可以通过decode使用UTF-8解码为字符串。
	# recv方法的传参是buffsize,缓冲区大小,一般设置为1024即可
	if data =='exit':
		break
	print("接收到的发送过来的消息为:",data)
# 可以通过while True无限循环来持续和客户端进行数据交互。
# 可以通过判定客户端发来的特殊标记,如exit,来退出无限循环。
# 6. 通过conn(客户端当次连接对象),调用send方法可以回复消息
while True:
	data = conn.recv(1024).decode("UTF-8")
	if data =='exit':
		break
	print("接收到的发送过来的消息为:",data)
	
	conn.send("你好",encode("UTF-8"))
# 7. conn和socket_server对象调用close方法,关闭连接。
conn.close()
socker_server.close()

客户端开发

建立一个客户端:

# 1. 创建socket对象
improt socket
socket_server = socket.socket()
# 2.连接到服务端
socket_client.connect(("localhost",8888))
# 3. 发送消息
while True :
	send_msg = input("请输入要发送的消息")
	if send_msg == 'exit' :
		break
	socket_client.send(send_msg.encode("UTF-8"))# 消息需要编码为字节编码
# 4. 接收返回消息
while True :
	send_msg = input("请输入要发送的消息")
	if send_msg == 'exit' :
		break
	socket_client.send(send_msg.encode("UTF-8"))# 消息需要编码为字节编码
	#recv也是阻塞的。
	recv_data = socket_client.recv(1024).decode("UTF-8")
	print("服务端回复的消息是:",recv_data)
# 5. 关闭连接
socket_client.close()

正则表达式

正则表达式,又称作规则表达式,是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索,替换那些复合某个模式(规则)的文本。

基础匹配

  1. re.match(匹配规则,被匹配的字符串),含义是从被匹配的字符串的开头进行匹配,匹配成功则返回匹配对象,匹配不成功则返回空
  2. re.search(匹配规则,被匹配的字符串),含义是搜索整个字符串,找出匹配的。从前往后,找到第一个后,就停止,不会继续往后。
  3. re.findall(匹配规则,被匹配的字符串),找出全部匹配规则的数据,找不到返回空list[].

样例:

import re
s = 'python and python'
# match从头匹配
result1 = re.match('python',s)
print(result1)
result2 = re.match('ython',s)
print(result2)
# search搜索匹配
result3 = re.search('python',s)
print(result3)
result4 = re.search('ht',s)
print(result4)
# findall 搜索全部匹配
result5 = re.findall('python',s)
print(result5)

输出结果:
在这里插入图片描述

元字符匹配

字符串的r的标记表示:字符串内转移字符无效,作为普通字符使用。

单字符匹配:

字符功能
.匹配任意一个字符(除了\n),\.匹配.本身
[]匹配[]中列举的字符
\d匹配数字
\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匹配非单词的边界

分组匹配:

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

下面给出三个案例:

  1. 匹配账号,只能由字母和数字组成,长度限制在6-10位。
  2. 匹配QQ号,要求纯数字,长度5-11,第一位不为0
  3. 匹配邮箱地址,只允许qq\163\gmail这三种邮箱地址
import re
# 1. 匹配账号,只能由字母和数字组成,长度限制在6-10位。
r ='^[0-9a-zA-Z]{6,10}$'
s = '12345a'
print(re.findall(r,s))
# 2. 匹配QQ号,要求纯数字,长度5-11,第一位不为0
r = '^[1-9][0-9]{4,10}$' # 值得注意的是如果取的是子串,则不需要加上开头结尾,如果需要是完整的,就需要加上^和$
r1 = '[1-9][0-9]{4,10}'
s = '012345678'
print(re.findall(r,s))
print(re.findall(r1,s))
# 3. 匹配邮箱地址,只允许qq\163\gmail这三种邮箱地址
r = r'^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$' # 带有括号分组时需要这么操作

递归

def func() :
	if ... :
		func()
	return ...

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

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

相关文章

【Ajax】服务器的基本概念

一、客户端与服务器上网的目的通过互联网的形式来获取和消费资源。2. 服务器上网过程中,负责存放和对外提供资源的电脑,叫做服务器。3. 客户端上网过程中,负责获取和消费资源的电脑,叫做客户端。二、URL地址URL地址的概念URL&…

工业互联网2022:第一梯队成型、专精玩家突围

文|智能相对论作者|沈浪回顾2022年,市场依旧对工业互联网领域保持着高度的热情与专注。近期,IDC、Gartner等各大国际研究机构接连发布多份工业互联网相关报告,包括《2022年度中国工业互联网平台企业侧市场分析报告》《2022年度工业互联网平台…

唯一杰出级!百度智能云曦灵获信通院权威认证

​中国信通院公布“数字人系统评测结果” 百度智能云曦灵平台 继首批通过48项基础能力评测后 在第二轮性能分级评测中 以超高分获得行业唯一“杰出级”证书 代表了当前数字人的最高标准 该评测标准依托国际电信联盟(ITU)、中国通信标准化协会&#xff08…

JNPF低代码开发平台 全新版本 使用讨论 多用户商城系统源码 框架源码部署文档

JNPF快速开发平台是一套成熟的快速开发框架, JNPF作为承重墙,强大支撑保障,提供所有操作系统的生长土壤,JNPF快速开发平台采用前后端分离技术、采用B/S架构开发,形成一站式开发多端(APPPC)使用&…

【手写 Vue2.x 源码】第二十九篇 - diff算法-节点比对

一,前言 上篇,diff 算法问题分析与 patch 方法改造,主要涉及以下几点: 初始化与更新流程分析;问题分析与优化思路;新老虚拟节点比对模拟;patch 方法改造; 下篇,diff 算…

Mysql的锁问题:

Mysql的锁问题: 1.1锁的概述: ​ Mysql锁的机制比较简单,不同的存储引擎支持不同的锁机制:MyISAM和MEMORY存储引擎支持表级锁;DBD支持页面锁,但是它也支持表级锁;InnoDB既支持行级锁也支持表级…

23-1-18 文件上传

步骤 file01 / file02 分别是两台java服务 功能: 主要负责接收用户上传的文件存储在指定目录 并记录(上传时间、上传人、文件信息(大小,源文件名,存储后的文件名 ....) 文件权限(共享、私有))。负责接收处理用户的下载请求,用户可以根据文件…

【开发Log】C++QT连连看

1.10开发的初衷是闲来无事开了把宠物连连看,然后发现打了几遍第一关都过不去,于是想自己写个,这样就可以任意使用提示次数了(bushi。其实今天正好是老妈生日,问了下老妈她竟然还玩连连看,还ak了orz。于是乎…

分布式理论

目录 1.定义 2.关键技术 3.关键问题 4.基本定理 4.1.CAP定理 4.2.BASE定理 1.定义 分布式的本质是一系列计算机集群通过网络共同完成一串连贯的任务。 2.关键技术 分布式主要关注的几个关键点技术是: 性能容错通信 性能: 可扩展性&#xff0c…

深度学习入门基础CNN系列——池化(Pooling)和Sigmoid、ReLU激活函数

想要入门深度学习的小伙伴们,可以了解下本博主的其它基础内容: 🏠我的个人主页 🚀深度学习入门基础CNN系列——卷积计算 🌟深度学习入门基础CNN系列——填充(padding)与步幅(stride&…

Acwing - 算法基础课 - 笔记(数学知识 · 三)(补)

数学知识(三) 这一小节讲的是高斯消元,组合数。 高斯消元 高斯消元是用来解方程的,通常来说可以在 O(n3)O(n^3)O(n3) 的时间复杂度内,求出包含 n 个未知数的,n个方程的多元线性方程组的解。如下的方程组…

人机界面石油行业应用:一个设备构建石油罐区状态监测系统

一、应用背景 石油罐区是石油石化企业重要的生产设施,负责存储和输送各类油品,而石油罐区状态参数的监控是生产管理的重要部分,不仅可以及时准确地获取现场设备数据,保证罐区的正常运行,还可以防止安全事故的发生。 …

Python如何解决“快手滑块验证码”(4)

前言 本文是该专栏的第32篇,后面会持续分享python的干货知识,记得关注。 很多时候,我们打开一个页面还没开始进行浏览,就跳出一个滑块验证的图片,需要拖到滑块至缺口处,才可以正常浏览。这对于我们正常人浏览页面来说,几乎没什么难度,但是当我们需要用到脚本去实现的时…

本地服务器如何让外网远程桌面连接?

远程访问是远程办公和服务器管理常用的网络应用场景。那么,当我们需要面对远程目标主机是内网服务器电脑时,在不是同个局域网的跨网环境下,内网可以远程控制电脑吗?答案是可以,使用快解析内网映射方案就能实现将本地服…

MyBatis一级缓存 二级缓存

MyBatis一级缓存 二级缓存什么是缓存?一级缓存一级缓存失效的四种情况二级缓存怎样开启二级缓存使二级缓存失效的情况二级缓存相关配置缓存查询的数据顺序整合第三方缓存EHCache(代替二级缓存)什么是缓存? 这是一个地图软件上的根据城市查询模块,对于那…

Freemarker页面静态化开发

4.5 页面静态化 4.5.1 什么是页面静态化 根据课程发布的操作流程,执行课程发布后要将课程详情信息页面静态化,生成html页面上传至文件系统。 什么是页面静态化? 课程预览功能通过模板引擎技术在页面模板中填充数据,生成html页…

Mybatis Plus轻松上手

Mybatis Plus 今日目标: 了解mybatisplus的特点能够掌握mybatisplus快速入门能够掌握mybatisplus常用注解能够掌握mybatisplus常用的增删改查能够掌握mybatisplus自动代码生成 Mybatis: ✔需要程序员编写sql语句程序员可以干预sql对sql进行调优(优化) MybatisPlu…

强化学习笔记:基于价值的学习方法之价值估计(python实现)

目录 1. 前言 2. 数学原理 3. 代码实现 3.1 游戏设定 3.2 class State 3.3 class Action 3.4 Class Agent 3.5 Class Environment 4. 仿真结果及其分析 4.1 play() 4.2 value_evaluation_all_states(grid, max_steps) 4.3 value_evaluation_one_state(grid, s) 4.4…

ZYNQ FPGA嵌入式开发 - 小梅哥(二)

创建工程打开Xilinx SDK创建工程Next 创建Empty Application添加文件编写代码参考文档 UG585 Zynq 7000 Technical Reference Manual寄存器说明 Appx.B: Registe Detial查看帮助文档Import Examples跨平台使用:头文件:unistd.h 每个平台都会提供sleep() …

论文阅读笔记:Attention is All You Need

论文标题:Attention is All You Need 目录 论文标题:Attention is All You Need 1.摘要 2.前言 3.模型结构 自注意力机制 多头自注意力机制 注意力机制在Transformer中的应用 1.摘要 过去最优的模型是带有attention连接的encoder-decoder模型&…