第三阶段第二章——Python高阶技巧

时间过得很快,这么快就来到了最后一篇Python基础的学习了。话不多说直接进入这最后的学习环节吧!!!

期待有一天

春风得意马蹄疾,一日看尽长安花

o(* ̄︶ ̄*)o


1.闭包

什么是闭包?

答:

        Python闭包是一个函数,同时还保存了定义这个函数的环境(即在其被定义时存在的非局部变量)。换句话说,闭包是一个函数,它可以记住并访问它被定义时的所有变量和状态,即使在其被调用时,这些变量和状态不再存在于其当前环境中。闭包可以被用来隐藏数据,提供保护,并允许在函数中创建更高级别的功能

(1)简单闭包

来看一个简单的闭包

"""
    演示闭包
"""
# 简单闭包
def outer(logo):

    def inner(msg):
        print(f"<{logo}>{msg}<{logo}>")

    return inner

func1 = outer("麦科集团")
func1("上市啦:)")

func2 = outer("麦科科技有限公司")
func2("被麦科集团全权控股")

这样就达到了,既想获取外部的变量,又不想外部的变量被修改掉

(2)如何修改外部函数变量的值

使用  nonlocal 关键字 


# 使用nonlocal关键字修改外部函数的值
def outer(num1):
    def inner(num2):
        nonlocal num1
        num1 += num2
        print(num1)
    return inner

func3 = outer(10)
func3(141)

 

(3)ATM级机小案例

这种写法,initial_amount很难被其他人修改


# 使用闭包实现ATM小案例
def account_create(initial_amount=0):
    def atm(num, deposit=True):
        nonlocal initial_amount
        if deposit:
            initial_amount += num
            print(f"存款:+{num}, 账户余额:{initial_amount}")
        else:
            initial_amount -= num
            print(f"取款:-{num}, 账户余额:{initial_amount}")

    return atm


atm = account_create()
atm(100)
atm(200)
atm(100, deposit=False)

 

(4)闭包优缺点

优点:

缺点:


2.装饰器

(1)什么是装饰器?

答:

        Python装饰器是一种能够动态修改函数或类行为的语法结构。它们允许将一个函数或类作为输入,并返回一个修改后的函数或类。通过使用装饰器,可以在不修改原始函数或类定义的情况下添加额外的功能或行为。

装饰器通常以函数的形式定义,可以在需要时应用于任何其他函数或类。它们常用于实现缓存、验证、日志记录和性能监视等功能。在Python中,装饰器是高级编程技术,需要对函数和类的工作原理有深刻的理解。

其实就很类似于AOP编程的思路

 

(2)装饰器的一般写法(闭包写法)

"""
    演示装饰器
"""


# 一般写法,闭包
def sleep():
    import random
    import time
    print("我要睡觉了...")
    time.sleep(random.randint(1, 5))


def sleep_pro(func):
    def inner():
        print("我睡觉了")
        func()
        print("我起床了")
    return inner

# sleep()
sleep_pro_max = sleep_pro(sleep)
sleep_pro_max()

 

(3)装饰器的语法(糖写法)


def outer(func):
    def inner():
        print("我要睡觉了...")
        func()
        print("我起床了...")
    return inner
@outer
def sleep2():
    import random
    import time
    print("睡眠中..")
    time.sleep(random.randint(1, 5))

sleep2()


3.设计模式

(1)什么是设计模式

答:

        设计模式,是一种被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。一个设计模式并不会像一个类或一个库那样直接成为代码的一部分,而是更像是一种通用的解决方案,可以用来解决各种不同的问题。

例如面向对象也是一种设计模式。

设计模式有很多,这里主要讲解单例模式工厂模式

(2)单例设计模式

        单例设计模式是一种创建型模式,目的是确保在整个应用程序中只有一个唯一的实例对象被创建,并且该实例对象提供了一个全局访问点,供应用程序的其他模块或对象使用。单例模式的实现方式通常包括:

1. 隐藏构造函数:防止外部直接创建对象实例。

2. 静态方法获取对象实例:提供一个静态的、公共的方法用于获取单例对象实例,该方法会检查是否已经创建了单例对象实例,如果没有则创建一个新的实例并返回,否则直接返回已经存在的对象实例。

        单例模式通常可以用于需要全局访问和管理资源的场景,比如日志系统数据库连接池线程池等。一个经典的单例模式实现方式是使用懒汉式单例(也有饿汉单例),即在第一次调用获取单例对象实例的方法时才创建实例对象。这种实现方式可以延迟对象的创建时间,避免不必要的资源浪费。

 

# 测试类
from str_tools import str_tool

s1 = str_tool
s2 = str_tool

print(id(s1))
print(id(s2))


# 导入的类
class StrTools:
    pass

str_tool = StrTools()

(3)工厂设计模式
 

        工厂设计模式是一种创建型模式,它定义了一个创建对象的接口,但是由子类来决定要实例化哪个类。即通过一个工厂类来创建其它对象,而不是直接使用 new 关键字来创建对象。这样可以将对象的创建与使用进行解耦,从而使代码更加灵活和可扩展。

工厂设计模式的实现包括以下角色:

1. 抽象工厂(Abstract Factory):定义了创建对象的接口,它包含多个工厂方法,用于创建不同类型的对象。

2. 具体工厂(Concrete Factory):实现抽象工厂接口中的工厂方法,用于创建具体的产品对象。

3. 抽象产品(Abstract Product):定义了产品对象的接口。

4. 具体产品(Concrete Product):实现抽象产品接口中定义的方法,完成具体的业务逻辑。

        使用工厂设计模式的好处是,当需要增加新的产品时,只需要扩展具体工厂和具体产品的实现,而无需修改现有的代码。同时,工厂设计模式可以为复杂的产品对象创建提供一个相对简单的统一接口,从而降低了代码的复杂度和耦合度。

        工厂设计模式应用广泛,比如在Java中,就有许多标准库和框架中都用到了工厂设计模式,比如:JDBC、Servlet、Spring等。

"""
    演示工厂模式
"""


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')
print(type(worker))
stu = pf.get_person('s')
print(type(stu))
tea = pf.get_person('t')
print(type(tea))


4.多线程

(1)进程,线程和并行执行

1.进程和线程

什么是进程和线程?

答:

        进程和线程都是操作系统中用于支持多任务的概念。

        进程是操作系统中分配资源的基本单位,它有自己独立的地址空间、堆栈以及数据段等,它由操作系统来分配资源,每个进程都有一个独立的进程控制块来管理进程的运行状态。

        线程是操作系统中独立调度的基本单位,它是进程中的一个执行单位,与同一进程中的其它线程共享进程的资源,包括地址空间、文件描述符、信号处理等。线程的引入可以使得进程中的多个任务可以并发执行,提高了系统的执行效率。

        相比于进程,线程的创建、销毁以及切换开销更小,可以更好地利用CPU资源。但是,由于线程共享进程的资源,线程之间的安全问题也要格外注意。

        需要注意的是,进程和线程的概念并不是Python特有的,而是操作系统的基本概念,在不同操作系统上还可能有所区别。在Python中,我们可以通过多线程和多进程模块来实现线程和进程的操作。

注意点:

2.什么是并行执行?

(2)多线程编程

1.什么是多线程编程,如何实现

        threading模块是Python中用于支持多线程编程的模块,它提供了一些用于创建和管理线程的类和函数。以下是一些常用的threading模块中的类和函数:

- threading.Thread:用于创建线程的类,继承自object类。可以通过继承Thread类并重写run()方法来创建自己的线程类。


- threading.current_thread():用于获取当前线程对象。


- threading.active_count():用于获取当前活动线程的数量。


- threading.enumerate():返回当前活动的线程列表。


- threading.Lock():创建一个锁对象,用于控制多个线程对共享资源的访问。


- threading.RLock():创建一个可重入锁对象,支持单个线程对同一锁的多次调用。


- threading.Condition():创建一个条件变量对象,用于多个线程之间的等待、唤醒操作。


- threading.Event():创建一个事件对象,用于多个线程之间的信号通知和等待操作。


- threading.Timer():创建一个定时器对象,用于在指定时间后执行某个操作。


- threading.ThreadLocal():创建一个线程局部变量对象,用于在不同线程之间共享数据。

        使用threading模块可以方便地实现多线程编程,提高程序性能和效率。但是,在多线程编程中需要注意线程安全问题,尤其是对共享资源的访问,需要使用锁等机制进行控制,以保证程序的正确性和可靠性。

2.小练习(没有传参)

代码示例:

"""
    多线程演示示例
"""
import time
import threading

def sing():
    while True:
        print("我在唱歌,呀啦嗦~~~~~~")
        time.sleep(1)


def dance():
    while True:
        print("我在跳舞,动次打次动次打次")
        time.sleep(1)

if __name__ == '__main__':
    # 唱歌线程
    sing_thread = threading.Thread(target=sing)
    # 跳舞线程
    dance_thread = threading.Thread(target=dance)

    # 线程工作
    sing_thread.start()
    dance_thread.start()

3.小练习(有传参)

"""
    多线程演示示例
"""
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()



5.网络编程

(1)服务端开发

1.初识socket

        Socket(套接字)是一种用于网络通信的底层技术,是网络编程的基础。它是一种抽象的概念,可以用来创建网络连接、进行数据传输和接收。

        在编程中,套接字通常被用来实现客户端与服务器之间的通信,通过套接字可以在两个计算机之间建立一条通信管道。在网络编程中,我们常用的套接字有两种,即TCP套接字和UDP套接字。其中,TCP套接字是面向连接的可靠传输协议,它提供了一种可靠的数据传输方式,确保数据的可靠性和完整性;UDP套接字则是一种无连接的不可靠传输协议,它没有连接的概念,也不保证数据的可靠性和完整性。

        Python中提供了socket模块,可以用来实现网络编程中的套接字操作。在socket模块中,常用的方法包括socket()、bind()、listen()、accept()、connect()、send()和recv()等,用于创建套接字、绑定IP地址和端口、监听客户端连接请求、接受客户端连接、连接服务器、发送数据和接收数据等。

2.客户端和服务端

3.服务端开发主要分为一下几个步骤

"""
    服务端开发
"""
import socket
# 创建socket对象
socket_server = socket.socket()
# 绑定socket_server到指定IP和地址
socket_server.bind(("127.0.0.1", 8888))
# 服务端开始监听端口,参数为允许链接的数量
socket_server.listen(1)
# 接收客户端连接,获得连接对象
# 返回的是一个二元组,可以使用两个变量接收
# 返回的分别是连接对象和客户端地址信息
# accept()是阻塞的方法,也就是如果没有客户端连接,就会卡在这里等待
conn, address = socket_server.accept()

print(f"接收客户端连接,连接来自:{address}")

while True:
    # 发送客户端消息
    # recv接收的参数是缓冲区大小,一般赋值1024
    # 返回值是一个字节数组bytes,通过decode方法转换为字符串对象
    data: str = conn.recv(1024).decode("UTF-8")

    print(f"客户端发来消息是:{data}")

    # 发送回复消息
    # 通过encode,将字符串编码为字节数组
    msg = input("请输入回复消息")
    if msg == 'exit':
        break
    conn.send(msg.encode("UTF-8"))

# 关闭链接
conn.close()
socket_server.close()

(2)客户端开发

"""
    客户端开发
"""
import socket
# 创建socket对象
socket_client = socket.socket()
# 连接到服务端
socket_client.connect(("127.0.0.1", 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()



6.正则表达式

(1)基础匹配

1.什么是正则表达式

2.正则的三个基础方法

代码示例:

"""
    演示正则表达式的三个基础方法
"""
import re

s1 = "mmm wakanda"
# match方法 从头匹配,头部匹配不到会返回none
result1 = re.match("mmm", s1)
print(result1)
print(result1.span())
print(result1.group())
# 分别打印
# <re.Match object; span=(0, 3), match='mmm'>
# (0, 3)
# mmm

print('------------')

s2 = "a python haha python"
# search方法 搜索匹配
result2 = re.search("python", s2)
print(result2)
print(result2.span())
print(result2.group())

print("--------")

s3 = "a python haha python la la la python python"
# findall 方法 搜索全部匹配
result3 = re.findall("python", s3)
print(result3)


(2)元字符匹配

1.单字符匹配

2.数量匹配

3.边界匹配

4.分组匹配

5.案例

代码示例:

"""
    案例
"""
import re

# 匹配账号,只能由字母和数字组成,长度限制6到10位
# 在正则表达式里千万不要带空格了
r1 = '^[0-9a-zA-Z]{6,10}$'
s01 = '123456789012345'
s02 = '12345678'
s03 = '12345678_'
print(re.findall(r1, s01))
print(re.findall(r1, s02))
print(re.findall(r1, s03))


print("--------------")
# 匹配QQ号,要求纯数字,长度5-11,第一位不为0
r2 = '^[1-9][0-9]{4,10}$'
s11 = '012345678'
print(re.findall(r2, s11))

# 匹配邮箱地址,只允许qq,163,gmail这三种邮箱格式
# {}.{}@{}.{}.{}
# 123.354.456@qq.com
# 123@qq.com
r3 = '(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)'
s31 = 'a.b.c.e.f.g@qq.com.a.c.e'
s32 = 'a.b.c.e.f.g@126.com.a.c.e'
print(re.match(r3, s31))
print(re.match(r3, s32))


7.递归

什么是递归?
答:

        递归是指在编程中一个函数调用自己的过程。递归可以用来解决一些分治的问题,如快速排序,归并排序等。

        在递归函数中,通常存在一个停止递归的条件,即递归终止条件。当递归到达终止条件时,递归就会停止,并开始回溯执行之前的操作。

        递归函数具有一定的优点和缺点。优点是可以简化代码,使代码更加清晰、易懂,适用于一些可分解为重复子问题的场景。缺点是递归过程中会产生多次函数调用和多次栈的开辟和回收,会导致时间和空间上的性能问题,如果递归调用次数太多,可能会导致栈溢出。

在Python中,递归函数需要考虑Python的递归深度限制,如果递归深度太大,可能会导致程序崩溃。可以使用sys模块中的setrecursionlimit()方法来设置递归深度限制。

或者是例如在算法的二叉树那里,遍历二叉树很多操作都可以使用递归完成

例如:实现x的n次幂,使用递归实现

def power(x, n):
    if n == 0:
        return 1
    else:
        return x * power(x, n-1)

print(power(2, 3))

 


结语

好了有关python的全部基础内容就全部结束了,大家在学习完Python基础之后是不是感觉到了无限的快乐呐^_^

离成功又进一步~~~~!!!!!!

\(^o^)/欧耶~!

再见ヾ( ̄▽ ̄)Bye~Bye~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM的课程管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

初识面向对象(类和对象)

目录 1. 面向对象的初步认知 2.面向对象与面向过程 3.类定义和使用 4.类的定义格式 练习 5.类的实例化 什么是实例化 6.this引用 为什么要有this引用 什么是this引用 this引用的特性 7.对象的初始化 默认初始化 就地初始化 使用构造方法初始化 1. 面向对象的初步…

完全零基础,教你创建数码配件小程序商城

现如今&#xff0c;随着数码产品的普及&#xff0c;数码配件市场也越来越火爆。如果你有兴趣进入这个行业&#xff0c;并且想要开设一家数码配件小程序商城&#xff0c;那么不要担心&#xff0c;即使你完全零基础也可以轻松实现。 首先&#xff0c;登录【乔拓云】网后台&#x…

武汉某母婴用品公司 - 集简云连接ERP和营销系统,实现库存管理的自动化

品牌介绍与关怀理念 武汉某母婴用品公司是一家专注于高端孕婴童护理用品的企业&#xff0c;积极响应和关怀孕产人群&#xff0c;全方位提供从待产用品到产后护理用品&#xff0c;再到婴童洗护用品和初生婴儿用品等一系列全面的母婴产品。我们的使命是满足客户的需求&#xff0…

Python语法基础(字符串 列表 元组 字典 集合)

目录 字符串(str)字符串的创建特殊情况字符串的转义字符字符串的运算符字符串常用方法求字符串长度去掉多余空格是否包含某子串分割字符串合并字符串替换字符串统计统计字符串出现的次数 练习&#xff1a;判断字符串是否为回文串 列表(list)列表的创建列表常用方法遍历列表列表…

高校教务系统登录页面JS分析——长沙理工大学教务系统

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文将是本专栏最后一篇文章&#xff0c;我看了绝大多数高…

计算机毕设 基于情感分析的网络舆情热点分析系统

文章目录 0 前言1 课题背景2 数据处理3 文本情感分析3.1 情感分析-词库搭建3.2 文本情感分析实现3.3 建立情感倾向性分析模型 4 数据可视化工具4.1 django框架介绍4.2 ECharts 5 Django使用echarts进行可视化展示5.1 修改setting.py连接mysql数据库5.2 导入数据5.3 使用echarts…

【前端】TypeScript核心知识点讲解

1.TypeScript简介及入门案例 &#xff08;1&#xff09;什么是TypeScript&#xff1f; TypeScript 是 JavaScript 的一个超集&#xff0c;支持 ECMAScript 6 &#xff08;ES6&#xff09;标准。 TypeScript 由微软开发的自由和开源的编程语言。 TypeScript 设计目标是开发大…

基于SSM的软考系统设计实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Ubuntu 安装常见问题

1. 安装oh my zsh 搜狗输入法不能用 vim /etc/environmentexport XIM_PROGRAMfcitx export XIMfcitx export GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERS“imfcitx” export LANG“zh_CN.UTF-8”配置完后重启&#xff0c;稍等一会&#xff0c;右上角会有个…

判断子序列

给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一个子序列&#…

RT-Thread 组件学习

FinSH控制台 在计算机发展的早期&#xff0c;图形系统出现之前&#xff0c;没有鼠标&#xff0c;甚至没有键盘。那时候人们如何与计算机交互呢&#xff1f;最早期的计算机使用打孔的纸条向计算机输入命令&#xff0c;编写程序。 后来随着计算机的不断发展&#xff0c;显示器、…

使用Java语言实现基本RS触发器

使用Java语言实现计算机程序来模拟基本RS触发器的工作过程&#xff0c;通过本账号2023年10月17日所发布博客“使用Java语言实现数字电路模拟器”中模拟基本逻辑门组成半加器电路的方法来模拟基本触发器的组成和时间延迟。 1 基本RS触发器电路结构 基本RS触发器&#xff08;又…

Linux软件包(源码包和二进制包)

Linux下的软件包众多&#xff0c;且几乎都是经 GPL 授权、免费开源&#xff08;无偿公开源代码&#xff09;的。这意味着如果你具备修改软件源代码的能力&#xff0c;只要你愿意&#xff0c;可以随意修改。 GPL&#xff0c;全称 General Public License&#xff0c;中文名称“通…

C++学习贴---C++预处理器

文章目录 前言预处理器#define预处理条件编译#ifdef#ifndef#if、#elif、#else 和 #endif #和##运算符 预定义宏 前言 预处理器 预处理器是指一些指示编译器在实际编译之前所需要完成的指令。 预处理器负责处理以**井号&#xff08;#&#xff09;**开头的预处理指令&#xff0…

【Git】Gui图形化管理、SSH协议私库集成IDEA使用

一、Gui图形化界面使用 1、根据自己需求打开管理器 2、克隆现有的库 3、图形化界面介绍 1、首先在本地仓库更新一个代码文件&#xff0c;进行使用&#xff1a; 2、进入图形管理界面刷新代码资源&#xff1a; 3、点击Stage changed 跟踪文件&#xff0c;将文件处于暂存区 4、通过…

C语言实现给出一位数不大于7位的整型数字,取整数从右端开始的4~7位数字

完整代码&#xff1a; // 给出一位数不大于7位的整型数字&#xff0c;取整数从右端开始的4&#xff5e;7位数字 //就是一个数为abcdefg&#xff0c;取它从右端开始的4&#xff5e;7位数字&#xff0c;就为dcba //如果位数不足7位时&#xff0c;会在数字高位补0 //例如一个数为…

【Vue】【uni-app】工单管理页面实现

用的是uni-app的uni-ui拓展组件实现的 功能是对工单进行一个展示&#xff0c;并对工单根据一些筛选条件进行搜索 目前是实现了除了日期之外的搜索功能&#xff0c;测试数据是下面这个tableData.js&#xff0c;都是我自己手写的&#xff0c;后端请求也稍微写了一些&#xff0c;…

让你认识C++中的模板

目录 一. 泛型编程1、定义 二、函数模板1、定义2、格式3、函数模板的实例化&#xff08;1&#xff09;、强制转化&#xff08;2&#xff09;、显式实例化 三、类模板1、 类模板的定义格式2、实例3、 类模板的实例化 一. 泛型编程 1、定义 泛型编程&#xff1a;编写与类型无关…

电大搜题:为湖北开放大学学子提供便捷学习辅助工具

湖北开放大学作为一所具有重要社会影响力的学府&#xff0c;为广大在职人士和学习追求者提供了便利的高等教育机会。然而&#xff0c;在学习过程中&#xff0c;同学们常常会遇到繁重的课业压力和难以解决的学习难题。为了解决这一问题&#xff0c;湖北开放大学与广播电视大学合…