学习日志19 python
1 Python 合并字典的方法
在 Python 里,有多种方式可以合并两个字典。下面为你介绍常见的方法及其示例:
方法 1:使用update()
方法
python
运行
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}dict1.update(dict2) # 把dict2的键值对更新到dict1中
print(dict1) # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
!!!!!特点:会直接修改原字典dict1
,不会返回新字典。
方法 2:使用**
解包操作符(Python 3.5 及以后版本)
python
运行
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}merged_dict = {**dict1, **dict2} # 创建一个新字典,包含dict1和dict2的所有键值对
print(merged_dict) # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
特点:生成一个新字典,不会改变原字典。
方法 3:使用collections.ChainMap
(Python 3.3 及以后版本)
python
运行
from collections import ChainMapdict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}merged_dict = ChainMap(dict1, dict2) # 创建一个逻辑上的合并视图
print(dict(merged_dict)) # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
特点:只是创建一个视图,并非真正合并,适合处理大规模数据。
方法 4:循环遍历添加(适用于所有 Python 版本)
python
运行
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}merged_dict = dict1.copy() # 复制dict1
for key, value in dict2.items():merged_dict[key] = value # 添加dict2的键值对
print(merged_dict) # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
特点:兼容性强,逻辑清晰。
处理键冲突的情况
若两个字典存在相同的键,后面字典的值会覆盖前面的。例如:
python
运行
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4} # 注意dict2中也有'b'键merged_dict = {**dict1, **dict2}
print(merged_dict) # 输出: {'a': 1, 'b': 3, 'c': 4},'b'的值被dict2覆盖
推荐用法
在 Python 3.5 及以后的版本中,推荐使用{**dict1, **dict2}
这种方式,因为它简洁明了,而且能生成新字典,不会修改原字典。
2 Python 的 socket
模块
Python 的 socket
模块提供了一个用于创建网络套接字的接口,使程序能够通过网络进行通信。套接字是网络编程的基础,可用于实现客户端 - 服务器模型、点对点通信等各种网络应用。
1. 套接字基础概念
- 套接字(Socket):网络通信的端点,类似电话的 “听筒”,用于发送和接收数据。
- IP 地址:标识网络中的设备(如
127.0.0.1
表示本地主机)。 - 端口号:标识设备上的特定应用程序(如
80
通常用于 HTTP 服务)。 - 协议:常用的有 TCP(可靠连接)和 UDP(无连接,不可靠但高效)。
2. TCP 套接字示例
服务器端(server.py)
python
运行
import socket# 创建 TCP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)# 监听连接
server_socket.listen(1)
print(f"服务器正在监听 {server_address}...")# 接受客户端连接
client_socket, client_address = server_socket.accept()
print(f"客户端 {client_address} 已连接")# 接收数据
data = client_socket.recv(1024).decode('utf-8')
print(f"收到消息: {data}")# 发送响应
response = f"已收到: {data}"
client_socket.sendall(response.encode('utf-8'))# 关闭连接
client_socket.close()
server_socket.close()
客户端(client.py)
python
运行
import socket# 创建 TCP 套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接服务器
server_address = ('localhost', 8888)
client_socket.connect(server_address)# 发送消息
message = "Hello, server!"
client_socket.sendall(message.encode('utf-8'))# 接收响应
data = client_socket.recv(1024).decode('utf-8')
print(f"来自服务器的响应: {data}")# 关闭连接
client_socket.close()
3. UDP 套接字示例
服务器端(udp_server.py)
python
运行
import socket# 创建 UDP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定地址和端口
server_address = ('localhost', 9999)
server_socket.bind(server_address)print(f"UDP 服务器正在监听 {server_address}...")# 接收数据
data, client_address = server_socket.recvfrom(1024)
print(f"来自 {client_address} 的消息: {data.decode('utf-8')}")# 发送响应
response = "UDP 消息已收到"
server_socket.sendto(response.encode('utf-8'), client_address)# 关闭套接字
server_socket.close()
客户端(udp_client.py)
python
运行
import socket# 创建 UDP 套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 服务器地址和端口
server_address = ('localhost', 9999)# 发送消息
message = "Hello, UDP server!"
client_socket.sendto(message.encode('utf-8'), server_address)# 接收响应
data, server = client_socket.recvfrom(1024)
print(f"来自服务器的响应: {data.decode('utf-8')}")# 关闭套接字
client_socket.close()
4. 核心方法解析
TCP 套接字方法
socket.socket(family, type)
:创建套接字(AF_INET
表示 IPv4,SOCK_STREAM
表示 TCP)。socket.bind(address)
:绑定地址和端口。socket.listen(backlog)
:开始监听连接,backlog
为最大等待连接数。socket.accept()
:接受客户端连接,返回新的套接字和客户端地址。socket.sendall(data)
:发送数据(TCP 保证数据到达)。socket.recv(bufsize)
:接收数据,bufsize
为缓冲区大小(字节)。
UDP 套接字方法
socket.sendto(data, address)
:发送数据到指定地址。socket.recvfrom(bufsize)
:接收数据并返回发送方地址。
5. 关键区别:TCP vs UDP
特性 | TCP | UDP |
---|---|---|
连接类型 | 面向连接(需建立连接) | 无连接(直接发送) |
可靠性 | 可靠(自动重传、排序) | 不可靠(可能丢包、乱序) |
效率 | 较低(有连接开销) | 较高(无连接开销) |
应用场景 | 文件传输、HTTP、SMTP 等 | 实时音视频、游戏、DNS 等 |
6. 注意事项
- 编码问题:发送和接收数据时需使用相同的编码(如
utf-8
)。 - 异常处理:网络操作可能失败,建议使用
try-except
捕获异常。 - 资源关闭:使用完毕后需调用
socket.close()
关闭套接字。 - 缓冲区大小:
recv(bufsize)
的bufsize
需根据数据量调整。
7. 高级应用
- 多线程服务器:使用
threading
模块处理多个客户端连接。 - 非阻塞套接字:使用
socket.setblocking(0)
实现异步通信。 - 超时设置:使用
socket.settimeout(seconds)
避免长时间阻塞。
通过 socket
模块,Python 可以轻松实现各种网络应用,从简单的聊天程序到复杂的分布式系统。
3 基于socket模块做出的一点尝试
一、Python 与网络编程基础
socket
库运用socket
是 Python 内置库,无需pip install
,直接import socket
就能开展网络编程,可实现创建套接字、绑定地址端口、监听连接、收发数据等操作,用于搭建简单的 TCP 服务器 / 客户端。- 代码编写时,
bind
方法参数需为元组格式,如s.bind(("127.0.0.1", 9999))
,否则会因参数传递错误报错。
二、Miniconda 与环境管理
- 环境激活与验证
- 通过
conda activate 环境名
激活 Miniconda 虚拟环境,确保在对应环境中进行 Python 开发。 - 利用
python --version
检查环境内 Python 版本,借助import socket; print(socket.__file__)
验证socket
等内置库是否正常可用,排查环境异常问题。
- 通过
三、VMware 与虚拟机实践
软件安装与准备
- 卸载 VMware 后重新安装,需清理残留文件(安装目录、注册表项等)、关闭相关服务 / 进程,再运行安装包。安装时留意进度,正常完成后即可使用。
- 下载 Ubuntu 系统镜像,推荐选择 LTS 版本(如 Ubuntu 24.04.2 LTS ),长期支持更稳定,适合学习与实践。
虚拟机系统安装
- 在 VMware 中创建虚拟机,启动后加载 Ubuntu 镜像安装。过程中涉及选项选择:
- 应用集合:“默认集合” 轻量基础,“扩展集合” 预装办公工具,按需选取。
- 安装类型:“擦除磁盘并安装” 仅作用于虚拟机虚拟磁盘(存于物理机指定路径的虚拟文件),不会删除物理机真实数据,可放心操作。
- 安装前会有配置回顾界面,确认磁盘配置、应用选择、分区方案合理后,点击 “安装” 完成系统部署。
- 在 VMware 中创建虚拟机,启动后加载 Ubuntu 镜像安装。过程中涉及选项选择:
四、网络调试与工具运用
nc
(netcat
)工具- 作为网络调试工具,在 Linux/macOS 终端或 Windows 安装后,通过
nc 127.0.0.1 端口号
连接虚拟机中运行的socket
服务端,测试数据收发,验证网络程序功能。
- 作为网络调试工具,在 Linux/macOS 终端或 Windows 安装后,通过
这些实践知识覆盖了 Python 网络编程、虚拟环境管理、虚拟机安装与系统部署、网络调试工具使用,从代码编写到环境搭建、工具实操都有涉及,后续可基于此深入拓展网络应用开发、虚拟机多系统测试等实践~