python高级基础

news2024/9/24 3:25:57

文章目录

  • python高级基础
    • 闭包
    • 修饰器
    • 单例模式跟工厂模式
      • 工厂模式
      • 单例模式
    • 多线程多进程
    • 创建websocket
      • 服务端
      • 手写客户端

python高级基础

闭包

简单解释一下闭包就是可以在内部访问外部函数的变量,因为如果声明全局变量,那在后面就有可能会修改
在闭包中的内部函数如果要修改外部变量就要借助nonlocal关键字

def outer(num1):
    def inner(num2):
        nonlocal  num1
        num1+=num2
        print(num1,num2)

    return inner
fn=outer(10)
fn(10) # 20
fn(10)  # 30

修饰器

闭包修饰器语法

def outer(fn):
    def inner():
        print('我睡觉了')
        fn()
        print('醒了')
    return inner

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


fn1=outer(sleep)
fn1()

注意看加粗的两个地方是语法糖 实际原理还是用的是闭包
在这里插入图片描述

单例模式跟工厂模式

工厂模式

优点:创建出来的每个对象都是独立的地址
缺点:部分属性不一致,但是都是独立的内存,消耗内存性能

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

class PersonFac:
    def get_person(self,type):
        if(type=='s'):
            return Student()
        elif(type=='w'):
            return Worker()
        else:
            return Teacher()

pf=PersonFac()
worker=pf.get_person('w')
stu=pf.get_person('s')
teacher=pf.get_person('t')

print(worker,stu,teacher)

在这里插入图片描述

在这里插入图片描述

单例模式

实例化类,然后在这个单例类上面进行添加删除

# class Stu:
#     pass
#
# t1=Stu()
# t2=Stu()
# print(id(t1))   # 1755386051920
# print(id(t2))  # 1755386051984


# 单例写法  工作中常把创建类单独提出文件 然后引入
class Stu:
    pass

t1=Stu()

s1=t1
s2=t1
print(id(s1))   # 1790597823824
print(id(s2))  # 1790597823824

多线程多进程

以下代码是单线程执行,最终输出结果是一直执行sing方法因为是无限循环的

import time


def sing():
    while True:
        print('我在唱歌。。。')
        time.sleep(1)


def dance():
    while True:
        print('我在跳舞。。。')
        time.sleep(1)

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

在这里插入图片描述


def sing(msg):
    while True:
        print(msg)
        time.sleep(1)


def dance(msg):
    while True:
        print(msg)
        time.sleep(1)

if __name__=='__main__':
    singThread=threading.Thread(target=sing,args=('我要唱歌',))  # 使用Thread方法开启线程  参数要一一对应不然就会跑到第一个参数所以这边使用具名参数
    danceThread=threading.Thread(target=dance,kwargs={'msg':'我在跳舞'})

    singThread.start()   #  线程启动
    danceThread.start()

这里面2个注意点

  • 以元祖形式传参,一个参数别忘了逗号
  • 以字典形式传参,参数要与方法参数一一对应不然会报错,参数名也不能变
    在这里插入图片描述

创建websocket

服务端

import socket
# 创建socket对象
socket_server=socket.socket()
# 绑定ip地址和端口
socket_server.bind(("localhost",8888))# 千万注意这里的传参是元组
# 监听端口
socket_server.listen(1)
# listen接收一个整数传参数,表示接收的链接数量

# 等待客户端链接
# result:tuple=socket_server.accept()
# conn=result[0]  # 客户端和服务端的链接对象
# address=result[1]  # 客户端的地址信息
# 简写
conn,address =socket_server.accept() # 返回的是二元元祖(连接对象,客户端地址信息)
# 此方法是阻塞的 accept 如果没有链接下面的代码不执行


print(f'接收到了{address}')
# 无线循环发消息 ,最终根据最后逻辑进行跳出自行解决
while True:
    data:str=conn.recv(1024).decode('GBK')

    print(f'客户顿发来的信息是{data}')

    msg=input('发送信息').encode("GBK")
    conn.send(msg)
    
#关闭链接
conn.close()
socket_server.close()

如果报这种错说明你的数据不是utf-8的格式就可以打印出信息进行转换对应的格式

这种是GBK格式,自行百度

在这里插入图片描述
在这里插入图片描述
最终实现的效果

手写客户端

import socket
# 创建socket对象
socket_client=socket.socket()
# 绑定ip地址和端口
socket_client.connect(("localhost",9999))
while True:
    msg=input('请输入')
    socket_client.send(msg.encode('UTF-8')) # 输入信息转换
    recv_data=socket_client.recv(1024) #  recv缓冲区1024即可  单线程阻塞
    print(f'服务端返回的信息四{recv_data.decode("UTF-8")}')
socket_client.close()

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

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

相关文章

深入探讨API接口测试:从基础到高级策略

引言:API测试的重要性 在当前的技术趋势中,API(应用程序接口)已经成为连接各种系统和服务的基石。API不仅仅是大型企业的领域,中小型公司和初创公司也越来越依赖API来拓展他们的业务功能和跨系统通信。正因如此&#…

企业数字化转型大数据湖一体化平台项目建设方案PPT

导读:原文《企业数字化转型大数据湖一体化平台项目建设方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 喜欢文章,您可以点赞评论转发…

(搜索) 剑指 Offer 38. 字符串的排列 ——【Leetcode每日一题】

❓剑指 Offer 38. 字符串的排列 难度:中等 输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面 不能有重复元素。 示例: 输入:s “abc” 输出:[“abc”,“acb”,“bac”…

【学习日记】【FreeRTOS】时间片的实现

前言 本文以野火的教程和代码为基础,对 FreeRTOS 中时间片的概念作了解释,并且给出了实现方式,同时发现并解决了野火教程代码中的 bug。 一、时间片是什么 在前面的文章中,我们已经知道任务根据不同的优先级被放入就绪列表中不…

符号随机梯度下降算法SIGNSGD

考虑随机优化问题: 符号随机梯度下降(SIGNSGD)算法: 假设基础: 收敛定理: 联邦优化:

[Java优选系列第2弹]SpringMVC入门教程:从零开始搭建一个Web应用程序

想和你们分享我眼里的代码世界🗺️ 优选系列持续更新中💫 一直在等你,你终于来啦💖 绿色代表解释说明 黄色代表重点 红色代表精髓 SpringMVC是一个基于Java的Web框架,它使用了MVC&…

旅行越野SUV——捷途旅行者即将与大家见面!

从2020年开始,国内车市踊跃出许多性格鲜明的车型,例如坦克300、极氪001、蔚来ET5旅行版以及五菱悦野,虽然它们属于小众车型,但奈何销量都非常亮眼,这也从另一角度证明现如今的年轻消费群体很喜欢特点鲜明的汽车产品。前段时间,捷途汽车发布的捷途旅行者,一款定位旅行越野SUV的新…

JVM的前世今生之类加载过程

1. 什么是JVM VM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它可以实现跨操作系统运行,即一…

CMake语法复习

前言 此文总结了库的制作和一些CMake常用的一些语法。 一:创建静态库和动态库 静态库的生成和使用 动态库的生成和使用 二:使用CMake来生成Makefile,生成可执行文件 顶层目录下的CMakeLists.txt project(HELLO) add_subdirectory(libhell…

设计模式之备忘录模式(Memento)的C++实现

1、备忘录模式的提出 在软件功能开发过程中,某些对象的状态在转换过程中,由于业务场景需要,要求对象能够回溯到对象之前某个点的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节。备忘录模式是在不…

ps打开出现dll文件丢失怎么回事?该如何修复

今天在看到一个ps的相关问题,可能很多同学也遇到过,安装好ps软件之后,打开会提示无法启动此程序。然后会有各种文件的丢失一般都是xxx.dll文件的格式,并提示尝试重新安装该程序,以解决此问题。不但是PS,还有…

226、仿真-基于51单片机楼道教室走道智能灯光光照人体感应检测控制Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&…

Hlang--用Python写个编程语言-函数与基本数据结构实现

文章目录 前言语法表述解析器修改词法解析函数节点函数节点解析List的解析实现解释器节点函数操作String和List处理总结前言 okey,经过一段时间的努力,接下来要实现的是函数。当然还有对应的基本数据结构,那么之后的话,我们的工作就开始进一步转换了。 那么在这块我们要实…

java:数据库连接池

概念 举个例子来说吧,假设我们开了一家餐馆,客人来了,我们就请一个服务员,使用完后再把他开除了,下个客人再来了,我们再请一个,使用完再开除。 这是不是我们现在使用 JDBC 连接数据库的场景&a…

电脑提示缺少vcomp140.dll怎样修复-vcomp140.dll丢失怎么办?

在使用电脑软件或者玩游戏时候,我们有时候会遇到提示系统丢失DLL状况,相信很多用电脑的都遇到过,我曾多次遇到提示丢失DLL,每次都要折腾了几小时,终于!在我多次折腾后,,有幸得到这个…

ForkJoinPool 你真的明白和用对了吗

ForkJoinPool 是一个功能强大的 Java 类,用于处理计算密集型任务,使用 ForkJoinPool 分解计算密集型任务,并并行执行它们,能够产生更好的性能。它的工作原理是将任务分解成更小的子任务,使用分而治之的策略进行操作&am…

mysql数据传输到mssql

一、找开Navicat Premium 12 此时目标数据库会创建一个同名的表

ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等)

文章目录 DSL 查询种类DSL query 基本语法1、全文检索2、精确查询3、地理查询4、function score (算分控制)5、bool 查询 搜索结果处理1、排序2、分页3、高亮 RestClient操作 DSL 查询种类 查询所有:查询所有数据,一般在测试时使…

【C++11新特性】lambda表达式

文章目录 1. lambda表达式概念2. lambda表达式语法3. lambda表达式应用 1. lambda表达式概念 lambda表达式是一个匿名函数,恰当使用lambda表达式可以让代码变得简洁,并且可以提高代码的可读性。 见见lambda表达式的使用 现在要对若干商品分别按照价格和…

Java并发----创建线程的三种方式及查看进程线程

一、直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务} }; // 启动线程 t.start(); 例如: // 构造方法的参数是给线程指定名字,推荐 Thread t1 new Thread("t1") {Override// run 方法内实现…