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

news2024/11/26 5:31:00

时间过得很快,这么快就来到了最后一篇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~

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

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

相关文章

Postgresql数据类型-字符类型

PostgreSQL支持的字符类型如表所示。 character varying(n)存储的是变长字符类型&#xff0c;n是一个正整数&#xff0c;如果存储的字符串长度超出n则报错&#xff1b;如果存储的字符串长度比n小&#xff0c;character varying(n)仅存储字符串的实际位数。character(n)存储定长…

DDoS攻击剧增,深入解析抗DDoS防护方案

当下DDoS攻击规模不断突破上限&#xff0c;攻击方式越发复杂。面对复杂的攻击形式&#xff0c;对于企业和组织来说无疑需要更完备的抗DDoS方案&#xff0c;依靠传统的解决方法并不能做到一劳永逸。在服务器抵抗DDoS防护上&#xff0c;你不会忽略F5的产品&#xff0c;让我们一起…

aws亚马逊:什么是 Amazon EC2?

Amazon Elastic Compute Cloud&#xff08;Amazon EC2&#xff09;在 Amazon Web Services&#xff08;AWS&#xff09;云中按需提供可扩展的计算容量。使用 Amazon EC2 可以降低硬件成本&#xff0c;因此您可以更快地开发和部署应用程序。您可以使用 Amazon EC2 启动所需数量的…

金融帝国实验室(Capitalism Lab)官方正版游戏『最新销售政策』

「金融帝国实验室」&#xff08;Capitalism Lab&#xff09;Enlight 官方正版游戏「2023双11特卖」 ■优惠时限&#xff1a;2023.11.01&#xff5e;11.30 ■游戏开发商&#xff1a;Enlight Software Ltd. 请您认准以下官方正版游戏购买链接&#xff1a;支持“支付宝&am…

OPC DA客户端工具Opc quick client使用

OPC DA客户端工具Opc quick client使用 什么是OPC OPC是工业控制和生产自动化领域中使用的硬件和软件的接口标准&#xff0c;以便有效地在应用和过程控制设备之间读写数据。O代表OLE(对象链接和嵌入)&#xff0c;P (process过程)&#xff0c;C (control控制)。 OPC服务器包括…

【MySQL】表的增删改查(强化)

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《MySQL》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&a…

一分钟秒懂人工智能对齐

文章目录 1.什么是人工智能对齐2.为什么要研究人工智能对齐3.人工智能对齐的常见方法 1.什么是人工智能对齐 人工智能对齐&#xff08;AI Alignment&#xff09;指让人工智能的行为符合人的意图和价值观。 人工智能系统可能会出现“不对齐”&#xff08;misalign&#xff09;…

Linux--gcc与make

文章目录 gcc/g的使用背景知识gcc与ggcc的编译过程预处理编译汇编链接 函数库自动化构建工具--make三个时间伪目标文件其他表示方法mybin的推导过程 gcc/g的使用 背景知识 GCC是一个开源的编译器套件&#xff0c;支持多种编程语言&#xff0c;并提供了广泛的语言特性和标准库…

真的设计师做图只需要一个炫云客户端就够了

真的设计师做图只需要一个炫云客户端就够了&#xff0c;为什么这么说呢&#xff1f;因为炫云的这个客户端功能真的太全了&#xff0c;设计师想要的功能在炫云客户端上都有&#xff0c;而且还很多功能是免费的&#xff0c;非常的实用&#xff0c;具体有哪些功能我们一起来看看吧…

无人机航迹规划:五种最新智能优化算法(SWO、COA、LSO、GRO、LO)求解无人机路径规划MATLAB

一、五种算法&#xff08;SWO、COA、LSO、GRO、LO&#xff09;简介 1、蜘蛛蜂优化算法SWO 蜘蛛蜂优化算法&#xff08;Spider wasp optimizer&#xff0c;SWO&#xff09;由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模型雌性蜘蛛蜂的狩猎、筑巢和交配行为&…

一键批量转码:将MP4视频转为MP3音频的简单方法

随着数字媒体设备的普及&#xff0c;视频和音频格式转换的需求也越来越常见。其中&#xff0c;将MP4视频批量转换为MP3音频的需求尤为普遍。无论是为了提取视频中的背景音乐&#xff0c;还是为了在手机或电脑上方便地收听视频音频&#xff0c;这个过程都变得非常重要。接下来我…

数字滤波器设计---FIR 滤波器设计

数字滤波器设计---FIR 滤波器设计 FIR 滤波器与 IIR 滤波器的比较 与无限持续时间冲激响应 (IIR) 滤波器相比&#xff0c;具有有限持续时间冲激响应的数字滤波器&#xff08;全零或 FIR 滤波器&#xff09;既有优点又有缺点。 FIR 滤波器具有以下主要优点&#xff1a; 它们可…

Java中的反射机制

获取字节码文件对象的三种方式 1&#xff0c;&#xff08;常用&#xff09;源代码阶段&#xff0c;Class.forName("全类名") 2&#xff0c;&#xff08;传参&#xff09;加载阶段 类名.class 3&#xff0c;&#xff08;前提有对象&#xff09;运行阶段 对象.getClas…

LeetCode算法心得——全排列(回溯型排列)

大家好&#xff0c;我是晴天学长&#xff0c;排列型的回溯&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按…

外贸企业GMS认证|SD-WAN专线解决方案支持 IPv6、IPv4

IP地址是英文internet protocol的缩写&#xff0c;是网络之间互连的协议。互联网诞生后&#xff0c;很长一段时间都是使用v4版本的IP协议&#xff0c;也就是 IPv4 &#xff0c;目前全球使用互联网的人数达到了48.8亿&#xff0c;而IPv4的地址库总共约43亿个地址&#xff0c;每个…

CCLink转Modbus TCP网关_MODBUS报文配置

兴达易控CCLink转Modbus TCP网关是一种功能强大的设备&#xff0c;可实现两个不同通信协议之间的无缝对接。它能够将CCLink协议转换为Modbus TCP协议&#xff0c;并通过报文配置实现灵活的通信设置。兴达易控CCLink转Modbus TCP网关可以轻松实现CCLink和Modbus TCP之间的数据转…

竞赛 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域&#xff0c;在无人驾驶领域中机器学习的各种算法随处可见&#xff0c;今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂&#xff0c;看上去无从下手。那么面对这样极其…

2011年09月06日 Go生态洞察:Go语言的反射法则

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

STM32——STM32F4系统架构

文章目录 前言STM32F4XX系统架构 前言 本篇文章为STM32F4系列的系统架构&#xff0c;因为最近在学习F4的板子&#xff0c;暂时先更F4的&#xff0c;有需要F1的后续再更新。 主系统由 32 位多层 AHB 总线矩阵构成&#xff0c;可实现以下部分的互连&#xff1a; STM32F4XX系统架…

(自适应移动端)响应式门窗定制pbootcms板 门窗门业网站板下载-带视频功能

(自适应移动端)响应式门窗定制pbootcms模板 门窗门业网站模板下载-带视频功能 PbootCMS内核开发的网站模板&#xff0c;该模板适用于门窗门业网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b; 自适应移动端&#xff0c;…