学习日志19 python

发布于:2025-07-27 ⋅ 阅读:(17) ⋅ 点赞:(0)

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 ChainMap

dict1 = {'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. 注意事项

  1. 编码问题:发送和接收数据时需使用相同的编码(如 utf-8)。
  2. 异常处理:网络操作可能失败,建议使用 try-except 捕获异常。
  3. 资源关闭:使用完毕后需调用 socket.close() 关闭套接字。
  4. 缓冲区大小recv(bufsize) 的 bufsize 需根据数据量调整。

7. 高级应用

  • 多线程服务器:使用 threading 模块处理多个客户端连接。
  • 非阻塞套接字:使用 socket.setblocking(0) 实现异步通信。
  • 超时设置:使用 socket.settimeout(seconds) 避免长时间阻塞。

通过 socket 模块,Python 可以轻松实现各种网络应用,从简单的聊天程序到复杂的分布式系统。

3 基于socket模块做出的一点尝试 

一、Python 与网络编程基础

  1. socket 库运用
    • socket 是 Python 内置库,无需 pip install,直接 import socket 就能开展网络编程,可实现创建套接字、绑定地址端口、监听连接、收发数据等操作,用于搭建简单的 TCP 服务器 / 客户端。
    • 代码编写时,bind 方法参数需为元组格式,如 s.bind(("127.0.0.1", 9999)) ,否则会因参数传递错误报错。

二、Miniconda 与环境管理

  1. 环境激活与验证
    • 通过 conda activate 环境名 激活 Miniconda 虚拟环境,确保在对应环境中进行 Python 开发。
    • 利用 python --version 检查环境内 Python 版本,借助 import socket; print(socket.__file__) 验证 socket 等内置库是否正常可用,排查环境异常问题。

三、VMware 与虚拟机实践

  1. 软件安装与准备

    • 卸载 VMware 后重新安装,需清理残留文件(安装目录、注册表项等)、关闭相关服务 / 进程,再运行安装包。安装时留意进度,正常完成后即可使用。
    • 下载 Ubuntu 系统镜像,推荐选择 LTS 版本(如 Ubuntu 24.04.2 LTS ),长期支持更稳定,适合学习与实践。
  2. 虚拟机系统安装

    • 在 VMware 中创建虚拟机,启动后加载 Ubuntu 镜像安装。过程中涉及选项选择:
      • 应用集合:“默认集合” 轻量基础,“扩展集合” 预装办公工具,按需选取。
      • 安装类型:“擦除磁盘并安装” 仅作用于虚拟机虚拟磁盘(存于物理机指定路径的虚拟文件),不会删除物理机真实数据,可放心操作。
    • 安装前会有配置回顾界面,确认磁盘配置、应用选择、分区方案合理后,点击 “安装” 完成系统部署。

四、网络调试与工具运用

  1. ncnetcat)工具
    • 作为网络调试工具,在 Linux/macOS 终端或 Windows 安装后,通过 nc 127.0.0.1 端口号 连接虚拟机中运行的 socket 服务端,测试数据收发,验证网络程序功能。

这些实践知识覆盖了 Python 网络编程、虚拟环境管理、虚拟机安装与系统部署、网络调试工具使用,从代码编写到环境搭建、工具实操都有涉及,后续可基于此深入拓展网络应用开发、虚拟机多系统测试等实践~


网站公告

今日签到

点亮在社区的每一天
去签到