python知识点总结(九)

news2024/9/23 5:34:23

在这里插入图片描述


python知识点总结九

  • 1、TCP中socket的实现
    • 代码实现TCP协议
      • a、服务端
      • b、客户端:
  • 2、写装饰器,限制函数被执行的频率,如10秒一次
  • 3、请实现一个装饰器,通过一次调用函数重复执行5次
  • 4、写一个登录装饰器对一下函数进行装饰,要求输入账号和密码才能运行该函数
  • 5、字典的fromkeys
  • 6、字典推导式
  • 7、字典 setdefault() 方法
  • 8、len(dict)
  • 9、将"python is shell" 转为 “nohtyp si llehs”

1、TCP中socket的实现

在这里插入图片描述

listen():监听客户端的连接,客户端有链接,listen马上就有返回。
accept():连接之后,会返回客户端的信息(ip地址、端口号),如果没有连接则一直堵塞。连接成功后,服务器就可以发数据,同时会创建一个新的socket
recvfrom:接收客户端的数据,如果服务端没有收到客户端发来的数据,会滞留,下面的代码不会执行。
read():读取客户端发过来的数据
write():将数据返回给客户端
由new_socket来完成与客户端数据的传输
如果new_socket关闭,则说明当前的这个客户端请求结束,服务端服务完毕;如果有新的请求来了,服务器会创建新的new_socket与它通讯。
如果关掉第一个socket,则说明整个服务端程序关闭了

代码实现TCP协议

a、服务端

from socket import *

# todo 1、创建server-socket      TCP协议
server_socket = socket(AF_INET, SOCK_STREAM)

# todo 2、创建目标服务器,绑定一个IP和端口  服务器里面空的字符串代表server_socket绑定这台机器下的任何ip地址
host_port = ('', 8088)
server_socket.bind(host_port)

# todo  3、监听服务器的socket,listen让socket处于被动。这时就可以接收客户端的连接请求了
server_socket.listen(5)  # 一般为5,表示客户端线程挂起的个数

# todo 4、等待客户端的连接请求,当前函数是线程阻塞的函数,accept返回2个值,第一个:新的socket,第二个:客户端地址
new_socket, client_addr = server_socket.accept()  # todo 新创建的socket是server_socket中的子socket,只是和当前的客户端(一个客户端)收发数据

# todo 5、服务器接收客户端发送过来的数据,recv一般用于TCP协议的接收数据,recvfrom用于UDP
data = new_socket.recv(1024)  # data是字节数据

print('服务器接收的数据是:', data.decode('utf-8'))

# todo 6、服务器端发送数据给客户端,在TCP中发送数据用send,UDP用sendto
new_socket.send('THANK you'.encode('utf-8'))

# 关闭套接字
new_socket.close()  # todo  new_socket关闭意味着当前客户端的服务已经完成
server_socket.close()  # todo  server_socket关闭意味着整个服务器全部关闭

代码注释:

1、host_port = (‘’, 8088)
server_socket.bind(host_port)
创建目标服务器,绑定一个IP和端口 服务器里面空的字符串代表server_socket绑定这台机器下的任何ip地址
2、new_socket, client_addr = server_socket.accept()
等待客户端的连接请求,当前函数是线程阻塞的函数,accept返回2个值,第一个:新的socket,第二个:客户端地址,
新创建的socket是server_socket中的子socket,只是和当前的客户端(一个客户端)收发数据
3、data = new_socket.recv(1024) # data是字节数据
服务器接收客户端发送过来的数据,recv一般用于TCP协议的接收数据,recvfrom用于UDP
4、new_socket.send(‘THANK you’.encode(‘utf-8’))
服务器端发送数据给客户端,在TCP中发送数据用send,UDP用sendto

b、客户端:

from socket import *

# todo 1、客户端、创建client-socket    TCP协议
client_socket = socket(AF_INET, SOCK_STREAM)

# todo  2、客户端发送连接的请求(不是传输数据的请求,是创建连接的请求)

# todo  目标服务器的ip和端口号
server_ip_port = ('192.168.1.112', 8088)

# todo 发送连接请求,此时服务端产生了新的new_socket
client_socket.connect(server_ip_port)

#client_socket.close()

# todo 客户端发送请求,用send不用sendto,客户端知道服务器的ip和端口,服务器也知道客户端的端口和ip,因为是面向连接的
send_data = input('请输入:')
client_socket.send(send_data.encode('utf-8'))

# todo  接收服务器返回的数据
recv_data = client_socket.recv(1024)

print('客户端接收到的服务器的数据为:', recv_data.decode(encoding='utf-8'))

# todo 关闭socket
client_socket.close()

代码注释:
send_data = input(‘请输入:’)
client_socket.send(send_data.encode(‘utf-8’))
客户端发送请求,用send不用sendto,客户端知道服务器的ip和端口,服务器也知道客户端的端口和ip,因为是面向连接的

2、写装饰器,限制函数被执行的频率,如10秒一次

def A(func):
    start = 0

    def inner(*args, **kwargs):
        nonlocal start
        now = time.time()
        if now - start > 10:
            res = func(*args, **kwargs)
            start = now
            return res
        else:
            return ("访问过于频繁")

    return inner


@A
def func(a, b):
    return a + b


print(func(2, 3))
# time.sleep(11)
print(func(2, 3))

3、请实现一个装饰器,通过一次调用函数重复执行5次


def outer(func):
    i = 0

    def inner(*args, **kwargs):
        nonlocal i
        while i < 5:
            res = func(*args, **kwargs)
            print(f'执行第{i}次,结果为{res}')
            i += 1

    return inner


@outer
def func(a, b):
    return a + b


func(5, 5)

4、写一个登录装饰器对一下函数进行装饰,要求输入账号和密码才能运行该函数

def outer(func):
    def inner(*args, **kwargs):
        user = kwargs.get('user')
        pwd = kwargs.get('pwd')
        if user and pwd:
            res = func(*args, **kwargs)
            return res
        else:
            return "函数不执行"
    return inner


@outer
def func6(user=None, pwd=None):
    return "函数开始执行"


print(func6(pwd='123', user="wer"))

5、字典的fromkeys

Python 字典 fromkeys() 函数用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。

fromkeys() 方法语法:

dict.fromkeys(seq[, value])

seq – 字典键值列表。
value – 可选参数, 设置键序列(seq)对应的值,默认为 None。
该方法返回一个新字典。

seq = ('name', 'age', 'sex')
 
tinydict = dict.fromkeys(seq)
print ("新的字典为 : %s" %  str(tinydict))
 
tinydict = dict.fromkeys(seq, 10)
print ("新的字典为 : %s" %  str(tinydict))

输出结果为:
新的字典为 : {‘age’: None, ‘name’: None, ‘sex’: None}
新的字典为 : {‘age’: 10, ‘name’: 10, ‘sex’: 10}

6、字典推导式

{键表达式:值表达式 for k , v in dict.items() if 表达式}
d = {“a”: 1, “b”: 2}变为{“A”:1,“B”:2}

{k.upper:v for k,v in d.items()}

将键值互换

print({v: k for k, v in d.items()})

统计字符串中各个字符出现的次数

s1 = 'afsddasdas'
print({item:s1.count(item) for item in s1})

7、字典 setdefault() 方法

Python 字典 setdefault() 方法和 get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。

setdefault()方法语法:

dict.setdefault(key, default=None)

key – 查找的键值。
default – 键不存在时,设置的默认键值。

如果 key 在 字典中,返回对应的值。如果不在字典中,则插入 key 及设置的默认值 default,并返回 default ,default 默认值为 None。

tinydict = {'Name': 'Runoob', 'Age': 7}
 
print ("Age 键的值为 : %s" %  tinydict.setdefault('Age', None))
print ("Sex 键的值为 : %s" %  tinydict.setdefault('Sex', None))
print ("新字典为:", tinydict)

以上实例输出结果为:

Age 键的值为 : 7
Sex 键的值为 : None
新字典为: {‘Age’: 7, ‘Name’: ‘Runoob’, ‘Sex’: None}

关于字典中 get() 和 setdefault() 的区别:
主要在于当查找的键值 key 不存在的时候,setdefault()函数会返回默认值并更新字典,添加键值;而 get() 函数只返回默认值,并不改变原字典。

tinydict = {'Name': 'Runoob', 'Age': 7}

print("Age 键的值为 : %s" % tinydict.get('Age', None))
print("Sex 键的值为 : %s" % tinydict.get('Sex', "女"))
print("新字典为:", tinydict)

执行结果:
Age 键的值为 : 7
Sex 键的值为 : 女
新字典为: {‘Name’: ‘Runoob’, ‘Age’: 7}

8、len(dict)

计算字典元素个数,即键的总数。

>>> tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
>>> len(tinydict)
3

9、将"python is shell" 转为 “nohtyp si llehs”

a="python is shell"
aa=list(map(lambda x:x[::-1],a.split(" ")))
aaa=' '.join(aa)
print(aaa)
range

在这里插入图片描述

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

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

相关文章

一道很有意思的题目(考初始化)

这题很有意思&#xff0c;需要你对初始化够了解才能解出来 &#xff0c;现在我们来看一下吧。 这题通过分析得出考的是初始化。关于初始化有以下知识点 &#xff08;取自继承与多态&#xff08;继承部分&#xff09;这文章中&#xff09; 所以根据上方那段知识点可知&#xf…

聊聊k8s服务发现的优缺点

序 本文主要研究一下使用k8s服务发现的优缺点 spring cloud vs kubernetes 这里有张spring cloud与kubernetes的对比&#xff0c;如果将微服务部署到kubernetes上面&#xff0c;二者有不少功能是重复的&#xff0c;可否精简。 这里主要是讲述一下如果不使用独立的服务发现&am…

008——根文件系统(基于鸿蒙liteos-a内核)

目录 一、根文件系统 1.1 鸿蒙根文件系展示 1.2 根文件系统的内容 1.3 根文件系统的制作 1.3.1 Makefile分析 1. ROOTFS目标&#xff1a; 2. 编译APP 1.3.2 演示 二、正式版本的init进程 1.1 测试版本 1.2 正式版本 1.2.1 配置文件 1. 分析配置文件 2. 示例 3. …

MinIO+Docker从零搭建一个文件存储服务

本文&#xff0c;将带你使用 MinIO Docker 来从零搭建一个文件存储服务&#xff0c;并在 SpringBoot 项目中上传图片到 MinIO 中。 一.为什么要自己搭建&#xff1f; 对于个人来说&#xff0c;当然是攻击风险。第三方对象存储服务通常会收取费用&#xff0c;尤其随着数据量的…

[自研开源] MyData 数据集成之任务调度模式 v0.7

开源地址&#xff1a;gitee | github 详细介绍&#xff1a;MyData 基于 Web API 的数据集成平台 部署文档&#xff1a;用 Docker 部署 MyData 使用手册&#xff1a;MyData 使用手册 试用体验&#xff1a;http://demo.mydata.work 交流 Q 群&#xff1a;430089673 概述 本…

[C++]C/C++内存管理——喵喵要吃C嘎嘎5

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

vscode 问题汇总

vscode vscode 问题汇总 一: vscode 大纲 文档中找不到符号二:vscode 找不到头文件三:级目录 一: vscode 大纲 文档中找不到符号 报错原因&#xff1a; 缺少c/c必要插件 安装插件&#xff1a;名称: C/C名称: C/C Extension Pack名称: C Intellisense名称: CMake名称: CMake To…

学习网络编程No.15【高级IO之多路转接】

引言&#xff1a; 北京时间&#xff1a;2024/3/19/11:16&#xff0c;若是说记忆有克星的话&#xff0c;那么一定是时间。若是说耐心有克星的话&#xff0c;那么一定是人的心态。连续几天睡眠问题&#xff0c;加上环境影响&#xff0c;上篇博客还有部分知识只能放在该篇博客介绍…

太牛逼了!视频号下载器手机版(工具+方法)绝了

在众多的视频号下载中&#xff0c;可以说这个工具真的是很牛逼了&#xff01;这里问大家一个问题&#xff01; 你使用视频号下载工具以及视频号下载器都会不会因时间导致而失效呢&#xff1f; 自从小编使用了这款工具后&#xff0c;就不会因为视频失效而烦恼。 很多人免费推荐…

c++进阶(c++里的多态)

文章目录 1.多态的概念1.1多态的概念 2.动态的定义及实现2.1多态的构成条件2.2虚函数2.3虚函数的重写虚函数重写的两个例外 2.4 C11 override和final2.5重载、覆盖&#xff08;重写&#xff09;、隐藏&#xff08;重定义&#xff09;的对比 3.抽象类3.1概念3.2接口继承和实现继…

记录微信小程序云开发的增删改查

目录 一、准备工作 1、创建集合添加数据 2、设置数据权限 3、小程序连接数据库 二、增删改查 1.查 1、查询单集合所有数据 2、条件查询 1、直接:相当于等于 2、调用指令 3、查询单条&#xff08;根据id查询&#xff09; 2.增 3.改 4.删 一、准备工作 1、创建集合添…

Linux--任务管理与守护进程

目录 任务管理 进程组概念 作业概念 会话概念 补充 守护进程 基本概念 守护进程的查看 守护进程的创建 自己手写守护进程 使用系统调用函数创建守护进程 任务管理 进程组概念 每一个进程除了有一个进程ID之外&#xff0c;还有一个进程组ID&#xff0c;进程组是一个或…

由浅到深认识Java语言(29):集合

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

光致发光荧光量子产率测试光纤光谱仪

光致发光荧光量子产率测试系统是一种用于测量材料发光效率的高精度设备&#xff0c;它通过光致发光方法来确定样品的发射效率。光致发光荧光量子产率测试系统不仅提供了一种高效、可靠的测量手段&#xff0c;而且对于提升科学研究和工业应用中的发光材料性能具有重要作用。通过…

Python:基础语法

一、import与from.....import 有时候我们需要使用一些第三方库或包时&#xff0c;我们就需要通过import或from.....import导入模块。 # 导入库 import sys print("hello,world") 当我们自己写了些函数&#xff0c;在其他py文件&#xff0c;我们也可以通过from.....im…

【Java程序设计】【C00361】基于Springboot的考勤管理系统(有论文)

基于Springboot的考勤管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及idea&…

「10」文本(GDI+):添加文字,可设置背景添加移动效果

「10」文本&#xff08;GDI&#xff09;添加文字&#xff0c;可设置背景添加移动效果 在OBS软件里&#xff0c;通过来源组件「文本&#xff08;GDI&#xff09;」&#xff0c;您可以添加任意您想要呈现的文字&#xff0c;在直播窗口中显示&#xff0c;它可以是提示语、广告词、…

SQLServer SEQUENCE用法

SEQUENCE&#xff1a;数据库中的序列生成器 在数据库管理中&#xff0c;经常需要生成唯一且递增的数值序列&#xff0c;用于作为主键或其他需要唯一标识的列的值。为了实现这一功能&#xff0c;SQL Server 引入了 SEQUENCE 对象。SEQUENCE 是一个独立的数据库对象&#xff0c;用…

python.类

1.类用class定义 name等是属性 是成员变量 定义完类了要定义对象 class Student: #定义了一个Student的类nameNoneageNonegenderNonesdu1Student() #创建了一个Student类的对象 sdu1.nameleo sdu1.age20 sdu1.gendermaleprint(sdu1.name) print(sdu1.age) print(sdu1.…

Day21|二叉树part07:530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

530. *二叉搜索树的最小绝对差&#xff08;双指针题型&#xff09; 众所周知二叉搜索树的中序遍历序列是一个有序数组&#xff0c;因此最基本的方法就是遍历得到中序序列再进行计算&#xff0c;实际上可以用双指针法&#xff0c;记录中序遍历前一个指针和当前指针的差值&#…