python正则表达式
"""
正则表达式
"""
"""
re.match 函数
原形:match(pattern, string, flags=0)
pattern:匹配的正则表达式
string:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式,值如下:
re.I 忽略大小写
re.L 做本地户识别
re.M 多行匹配,影响^和¥
re.S 是.匹配包括换行符在内的所有字符
re.U 根据Unicode字符集解析字符,影响\W \w \B \b
re.X 使我们以更灵活的格式理解正则表达式
参数:
功能:尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,返回None
"""
redis6集群主从复制 有更新!
环境
1.服务器均为Ubuntu 20.04
2.Redis使用6.2版本
3.3台服务器
将192.168.50.88这一台设为master主数据库,其余三台作为slave从库
IP | 角色 | 端口 |
---|---|---|
192.168.50.88 | master | 6379 |
192.168.50.98 | slave | 6378 |
192.168.50.99 | slave | 6380 |
python员工信息档案管理系统开发实例-2(改)
import os
filename = 'employee.txt'
def main():
while True:
menu()
choice = int(input('请选择功能菜单:'))
# print(type(choice),choice.isdigit(),type(choice.isdigit()))
# if choice.isdigit():
if choice in [0, 1, 2, 3, 4, 5, 6, 7]:
if choice == 0:
answer = input('你确定要退出系统吗?退出按y键,不退出按n键')
if answer == 'y' or answer == 'Y' or answer == 'YY' or answer == 'yy':
print('谢谢使用!再见!')
break # 退出系统
else:
continue
elif choice == 1:
insert() # 录入员工信息
elif choice == 2:
search() # 查找员工信息
elif choice == 3:
delete() # 删除员工信息
elif choice == 4:
modify() # 修改员工信息
elif choice == 5:
sort() # 员工信息排序
elif choice == 6:
total() # 统计员工总人数
elif choice == 7:
show() # 显示所有员工信息
else:
print('请选择正确的序号')
python员工信息档案管理系统开发实例-1(增、删)
import os
filename = 'employee.txt'
def main():
while True:
menu()
choice = int(input('请选择功能菜单'))
# print(type(choice),choice.isdigit(),type(choice.isdigit()))
# if choice.isdigit():
if choice in [0, 1, 2, 3, 4, 5, 6, 7]:
if choice == 0:
answer = input('你确定要退出系统吗?退出按y键,不退出按n键')
if answer == 'y' or answer == 'Y' or answer == 'YY' or answer == 'yy':
print('谢谢使用!再见!')
break # 退出系统
else:
continue
elif choice == 1:
insert() # 录入员工信息
elif choice == 2:
search() # 查找员工信息
elif choice == 3:
delete() # 删除员工信息
elif choice == 4:
modify() # 修改员工信息
elif choice == 5:
sort() # 员工信息排序
elif choice == 6:
total() # 统计员工总人数
elif choice == 7:
show() # 显示所有员工信息
else:
print('请选择正确的序号')
# if choice in [0, 1, 2, 3, 4, 5, 6, 7]:
# if choice == 0:
# answer = input('你确定要退出系统吗?退出按y键,不退出按n键')
# if answer == 'y' or answer == 'Y' or answer == 'YY' or answer == 'yy':
# print('谢谢使用!再见!')
# break # 退出系统
# else:
# continue
# elif choice == 1:
# insert() # 录入员工信息
# elif choice == 2:
# search() # 查找员工信息
# elif choice == 3:
# delete() # 删除员工信息
# elif choice == 4:
# modify() # 修改员工信息
# elif choice == 5:
# sort() # 员工信息排序
# elif choice == 6:
# total() # 统计员工总人数
# elif choice == 7:
# show() # 显示所有员工信息
def menu():
print('========================================员工信息管理系统========================================\n')
print('\t\t\t\t\t\t\t\t\t\t1.录入员工信息')
print('\t\t\t\t\t\t\t\t\t\t2.查找员工信息')
print('\t\t\t\t\t\t\t\t\t\t3.删除员工信息')
print('\t\t\t\t\t\t\t\t\t\t4.修改员工信息')
print('\t\t\t\t\t\t\t\t\t\t5.员工信息排序')
print('\t\t\t\t\t\t\t\t\t\t6.统计员工总人数')
print('\t\t\t\t\t\t\t\t\t\t7.显示所有员工信息')
print('\t\t\t\t\t\t\t\t\t\t0.退出\n')
def insert():
employee_list = []
while True:
employee_id = input('请输入工号如(1001):')
if not employee_id:
break
employee_name = input('请输入姓名:')
if not employee_name:
break
try:
age = int(input('请输入年龄:'))
except:
print('输入无效')
continue
# 将录入的员工信息保存到字典中
employee = {'id': employee_id, 'name': employee_name, 'age': age}
# 将员工信息添加到列表
employee_list.append(employee)
answer = input('是否继续添加?y/n\n')
if answer == 'y' or answer == 'Y':
continue
else:
break
# 调用save函数
save(employee_list)
print('员工信息录入完毕')
def save(lst):
try:
employee_txt = open(filename, 'a', encoding='UTF-8')
except:
employee_txt = open(filename, 'w', encoding='UTF-8')
for item in lst:
employee_txt.write(str(item) + '\n')
employee_txt.close()
def search():
pass
def delete():
while True:
employee_id = input('请输入要删除的员工工号ID:')
if employee_id != '':
delete_warning = input(f'是否要删除工号为{employee_id}的员工信息?y/n\n')
if delete_warning == 'y' or delete_warning == 'Y':
if os.path.exists(filename): # 判断文件是否存在
with open(filename, 'r', encoding='utf-8') as file:
employee_old = file.readlines()
else:
employee_old = []
flag = False # 标记是否删除
if employee_old:
with open(filename, 'w', encoding='utf-8') as w_file:
d = {}
for item in employee_old:
d = dict(eval(item)) # 将字符串转成字典
if d['id'] != employee_id:
w_file.write(str(d) + '\n')
else:
flag = True
if flag:
print(f'id为{employee_id}的员工信息已被删除')
else:
print(f'没有找到ID为{employee_id}的员工信息')
else:
print('无此员工信息')
break
show() # 删除之后重新显示所有员工信息
answer = input('是否继续删除员工信息y/n\n')
if answer == 'y' or answer == 'Y':
continue
else:
break
else:
break
def modify():
pass
def sort():
pass
def total():
pass
def show():
pass
if __name__ == '__main__':
main()
浅拷贝与深拷贝
在 Python 中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,Python 并没有拷贝这个对象,而只是拷贝了这个对象的引用,我们称之为浅拷贝。
在 Python 中,为了使当进行赋值操作时,两个变量互补影响,可以使用 copy 模块中的 deepcopy 方法,称之为深拷贝。
class Cpu:
pass
class Disk:
pass
class Computer:
def __init__(self,cpu,disk):
self.cpu=cpu
self.disk=disk
#(1)变量的赋值
cpu1=Cpu()
cpu2=cpu1
print(cpu1,id(cpu1))
print(cpu2,id(cpu2))
'''
执行结果
<__main__.Cpu object at 0x00000205C5903310> 2223812653840
<__main__.Cpu object at 0x00000205C5903310> 2223812653840
'''
#(2)类的浅拷贝
print('---------------------------------------------------------')
disk=Disk() #创建一个硬盘类的实例对象
print(disk,id(disk))
computer=Computer(cpu1,disk) #创建一个计算机类的实例对象
#浅拷贝
import copy
computer2=copy.copy(computer)
print(computer,computer.cpu,computer.disk)
print(computer2,computer2.cpu,computer2.disk)
#深拷贝
computer3=copy.deepcopy(computer)
print(computer3,computer3.cpu,computer3.disk)
执行结果:
---------------------------------------------------------
<__main__.Disk object at 0x000002299EC2EEF0> 2377780489968
<__main__.Computer object at 0x000002299EC2EF20> <__main__.Cpu object at 0x000002299EC2F6D0> <__main__.Disk object at 0x000002299EC2EEF0>
<__main__.Computer object at 0x000002299E7A7C40> <__main__.Cpu object at 0x000002299EC2F6D0> <__main__.Disk object at 0x000002299EC2EEF0>
<__main__.Computer object at 0x000002299EC6B820> <__main__.Cpu object at 0x000002299EC69B70> <__main__.Disk object at 0x000002299EC69AB0>
特殊方法__new__创建对象的过程 有更新!
class Person:
def __new__(cls, *args, **kwargs):
print('__new__被调用执行了,cls的ID为:{0}'.format(id(cls)))
obj = super().__new__(cls)
print('创建的对象的ID为:{0}'.format(id(obj)))
return obj
def __init__(self, name, age):
print('__init__被调用了,self的ID为:{0}'.format(id(self)))
self.name = name
self.age = age
print('object这个对象的ID为:{0}'.format(id(object)))
print('Person这个类对象的ID为:{0}'.format(id(Person)))
# 创建Person的实例对象
p1 = Person('zhangsan', 20)
print('p1这个Person类的实例对象的ID为:{0}'.format(id(p1)))
执行结果:
object这个对象的ID为:140704941193088
Person这个类对象的ID为:2358520473904
__new__被调用执行了,cls的ID为:2358520473904
创建的对象的ID为:2358521573152
__init__被调用了,self的ID为:2358521573152
p1这个Person类的实例对象的ID为:2358521573152
python继承 有更新!
**类(Class): **用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
**方法:**类中定义的函数。
**类变量:**类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
**方法重写:**如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
**局部变量:**定义在方法中的变量,只作用于当前实例的类。
**实例变量:**在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
**继承:**即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
**实例化:**创建一个类的实例,类的具体对象。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
python标识符&关键字
在程序中自定义的类名、函数名、变量等符号和名称,叫做标识符
Python中,标识符由字母、数字、下划线(_)组成,不能以数字开头,区分大小写,不能与python关键字重复
'''
No_12 = 13 #合法标识符
age$#=18 #不合法的标识符,不能包含¥特殊符号
12name = "ali" #不合法的标识符,不能以数字开头
type = "name" #不合法的标识符,type是python关键字
VM虚拟机centos stream 9 里的KVM虚拟机 创建桥接物理机 (双层虚拟化)
1.创建网桥
nmcli conn add type bridge con-name br0 ifname br0
2.配置IP地址
nmcli connection modify br0 ipv4.addresses '192.168.50.10/24' ipv4.gateway '192.168.50.1' ipv4.dns '202.103.24.68' ipv4.method manual
3.为网桥关联物理接口
nmcli conn add type ethernet slave-type bridge con-name br0-ens192 ifname ens192 master br0
nmcli conn up br0 //启动网桥
MySQL基础-1 有更新!
MySQL服务的启动和停止
方式一:计算机--右击管理--服务
方式二:通过管理员身份运行
net start 服务名
net stop 服务名
HCIP-PIM-1 有更新!
PIM(Protocol Independent Multicast)称为协议无关组播。这里的协议无关指的是与单播路由协议无关,即PIM不需要维护专门的单播路由信息。作为组播路由解决方案,它直接利用单播路由表的路由信息,对组播报文执行RPF(Reverse Path Forwarding,逆向路径转发)检查,检查通过后创建组播路由表项,从而转发组播报文。
HCIP-VxLAN 有更新!
VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网)是一种网络虚拟化技术,可以改进大型云计算在部署时的扩展问题,是对VLAN的一种扩展。VXLAN是一种功能强大的工具,可以穿透三层网络对二层进行扩展。它可通过封装流量并将其扩展到第三层网关,以此来解决VMS(虚拟内存系统)的可移植性限制,使其可以访问在外部IP子网上的服务器。
HCIP-SDN
软件定义网络(Software Defined Network,SDN)是由美国斯坦福大学clean-slate课题研究组提出的一种新型网络创新架构,是网络虚拟化的一种实现方式。其核心技术OpenFlow通过将网络设备的控制面与数据面分离开来,从而实现了网络流量的灵活控制,使网络作为管道变得更加智能,为核心网络及应用的创新提供了良好的平台。
HCIP-IPsec2 有更新!
1.创建安全提议及安全策略
对数据加密和认证的一个方案(认证算法、加密算法、以及隧道封装模式、IKE版本、认证密码等)
AH:只能用来做认证和校验
ESP:既可以用来做认证、校验也能用来做数据加密
HCIP-IPsec 有更新!
IPSec协议族是IETF(Internet Engineering Task Force)制定的一系列协议,它为IP数据包提供了高质量的、可互操作的、基于密码学的安全性。特定的通信双方在IP层通过加密与数据源认证等方式,来保证数据报在网络上传输时的私有性、完整性、真实性和防重放。
IPSec通过认证头AH(Authentication Header)和封装安全载荷ESP(Encapsulating Security Payload)这两个安全协议来实现上述目标。因特网密钥交换协议IKE(Internet Key Exchange)为IPSec提供自动协商交换密钥、建立和维护安全联盟的服务,以简化IPSec的使用和管理。
HCIP-BGP路由选路 有更新!
HCIP-GRE
通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。
GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一种三层隧道封装技术,使报文可以通过GRE隧道透明的传输,解决异种网络的传输问题。
HCIP-BGP路由反射器
为保证IBGP对等体之间的连通性,需要在IBGP对等体之间建立全连接关系。假设在一个AS内部有n台设备,那么建立的IBGP连接数就为n(n-1)/2。当设备数目很多时,设备配置将十分复杂,而且配置后网络资源和CPU资源的消耗都很大。在IBGP对等体间使用路由反射器可以解决以上问题。
HCIP-BGP属性 有更新!
在BGP路由表中,到达同一目的地可能存在多条路由。此时BGP会选择其中一条路由作为最佳路由,并只把此路由发送给其对等体。BGP为了选出最佳路由,会根据BGP的路由优选规则依次比较这些路由的BGP属性。