1.网络编程
1.Socket
Socket 负责进程之间的网络数据传输,好比数据的搬运工。进程之间想要进行网络通信需要 socket。
2 个进程之间通过 Socket 进行相互通讯,就必须有服务端和客户端
服务端:等待其它进程的连接、可接受发来的消息、可以回复消息 Socket
客户端:主动连接服务端、可以发送消息、可以接收回复
2.服务端开发
import socket
# 创建socket对象
socket_server = socket.socket()
# 绑定ip地址和端口
socket_server.bind(("localhost", 8888))
# 监听端口 listen方法接受一个整数参数,表示接受的链接数量
socket_server.listen(1)
# 等待客户端连接
# accpet方法返回的是二元元组(链接对象, 客户端地址信息)
# 可以通过 变量1, 变量2 = socket_server.accept() 接受
# accpet()是阻塞方法, 等待客户端的连接, 如果没有就不会继续执行
conn, address = socket_server.accept()
print(f"接受到了客户端的信息,客户端地址信息为:{address}")
while True:
# 接受客户端信息 要使用连接对象,不是socket_server对象
# recv方法返回的是一个字节数组(bytes对象),不是字符串,也是阻塞方法
# 可以通过decode方法使用UTF-8编码,将字节数组转换为字符串对象
data = conn.recv(1024).decode("UTF-8")
print(f"客户端发来的信息是:{data}")
# 发送回复消息
# encode可以将字符串编码转换为字节数组对象
msg = input("请输入你和客户端回复的信息:")
if msg == 'exit': # 使用exit关闭
break
conn.send(msg.encode("UTF-8")) # 发送回去
# 关闭连接
conn.close()
socket_server.close()
3.客户端编程
import socket
# 创建对象
socket_client = socket.socket()
# 连接服务器
socket_client.connect(("localhost", 8888))
while True:
# 发送消息
msg = input("发送消息:")
if msg == 'exit':
break
socket_client.send(msg.encode("UTF-8"))
# 接受消息
recv_data = socket_client.recv(1024) # 1024是缓冲区大小, 一般大小1024即可,同样recv方法是阻塞的
print(f"服务端消息:{recv_data.decode('UTF-8')}")
# 关闭连接
socket_client.close()
2.正则表达式
正则表达式,又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则)的文本。
字符串定义规则,并通过规则去验证字符串是否匹配。
正则规则: (^[\w-]+(。[\w-]+)*@[\w-]+(.[\w-]+)+$) 即可匹配一个字符串是否是标准邮箱格式
1.基础匹配
re.match(匹配规则, 被匹配字符串)从头匹配
import re
s = 'aaa bbb ccc ddd eee fff'
result = re.match('aaa', s)
print(result) # 从头开始匹配,必须从头一样
print(result.span())
print(result.group())
# 结果
# <re.Match object; span=(0, 3), match='aaa'>
# (0, 3)
# aaa
search(匹配规则, 被匹配字符串)搜索整个字符串,从前向后,找一个
import re
s = 'aaa bbb ccc ddd eee aaa fff'
result = re.search('aaa', s)
print(result)
print(result.span())
print(result.group())
# 结果
# <re.Match object; span=(0, 3), match='aaa'>
# (0, 3)
# aaa
findall(匹配规则, 被匹配字符串)匹配整个字符串,找出全部匹配项
import re
s = 'aaa bbb ccc ddd eee aaa fff'
result = re.findall('aaa', s)
print(result)
# 结果
# ['aaa', 'aaa']
2.元字符匹配
1.单字符匹配
2.数量匹配
3.边界匹配
4.分组匹配
re.findall(r'\d', s) # 全部数字
re.findall(r'\W', s) # 特殊字符
re.findall(r'[a-zA-Z]', s) # 找出全部英文字母
# []内可以写:[a-zA-Z0-9] 这三种范围组合或指定单个字符如[aceDFG135]
# 匹配账号,只能由字母和数字组成,长度限制6到10位
规则为: ^[0-9a-zA-Z]{6,10}$
# 匹配QQ号,要求纯数字,长度5-11,第一位不为0
规则为:^[1-9][0-9]{4,10}& # {,}没有空格
[1-9]匹配第一位,[0-9]匹配后面4到10位
# 匹配邮箱地址,只允许qq、163、gmail这三种邮箱地址
规则为:^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+&
[\w-]+ 表示出现a-z A-Z 0-9 _ 和 - 字符最少一个,最多不限
(\.[\w-]+)*,表示出现组合 . 和 a-z A-Z 0-9 _ -的组合最少0次,最多不限
用于匹配:abc.ced.efg@123.com中的ced.efg这部分
@表示匹配@符号
(qq|163|gmail)表示只匹配这3个邮箱提供商
(\.[\w-]+)+表示a-z A-Z 0-9 _ -的组合最少1次,最多不限
用于匹配abc.ced.efg@123.com.cn中的.com.cn这种
最后使用+表示最少一次,即比如:.com
多了可以是:.com.cn.eu这样
3.递归
递归在编程中是一种非常重要的算法 递归: 即方法(函数)自己调用自己的一种特殊编程写法
os.listdir,列出指定目录下的内容
os.path.isdir,判断给定路径是否是文件夹,是返回 True,否返回 False
os.path.exists,判断给定路径是否存在,存在返回 True,否则返回 False
import os
def get_files_recursion_from_dir(path):
print(f"当前判断文件:{path}")
file_list = []
if os.path.exists(path):
for f in os.listdir(path):
new_path = path + "/" + f
if os.path.isdir(new_path):
file_list += get_files_recursion_from_dir(new_path)
else:
file_list.append(new_path)
else:
print(f"指定的目录{path},不存在")
return []
return file_list
if __name__ == '__main__':
print(get_files_recursion_from_dir("D:/python文件/学习/Python进阶/递归测试"))
#当前判断文件:D:/python文件/学习/Python进阶/递归测试
#当前判断文件:D:/python文件/学习/Python进阶/递归测试/a
#当前判断文件:D:/python文件/学习/Python进阶/递归测试/a/b
#['D:/python文件/学习/Python进阶/递归测试/1.txt', 'D:/python文件/