一、位运算(完成56和-18的所有位运算包括与或非等)
所有的计算过程都在注释内 !!!
python
#计算56及-18的所有位运算结果
a=56
b=-18
#56二进制 = 0011 1000原反补
#-18二进制 = 1001 0010原、 1110 1101反、 1110 1110补
#与&运算,有0为0,反之为1
res_and=a&b
# 0011 1000
#&1110 1110
#----------
# 0010 1000原反补 = 40
print(f"56 & -18: {res_and}")
#或|运算,有1为1
res_or=a|b
# 0011 1000
#|1110 1110
#------------
# 1111 1110补 = 1111 1101反 =0000 0010原 = -2
print(f"56 | -18: {res_or}")
# 按位异或 ^ 不同为1,相同为0
res_xor = a ^ b
# 0011 1000
#^1110 1110
#--------------
# 1101 0110补 = 1101 0101反 = 0010 1010原 = -42
print(f"56 ^ -18 = {res_xor}")
# 左移 << 所有位向左移动,右侧补0
res_a_left = a << 1
# 0011 1000
#<<1
#0111 0000 = 112
res_b_left = b << 1
# 1110 1110(左右移符号位不变,左移低位补0)
# <<1
#1101 1100补 = 1101 1011反 = 1010 0100原 = -36
print(f"56 << 1 = {res_a_left}")
print(f"-18 << 1 = {res_b_left}")
# 右移 >> 算术右移,正数补0,负数补1
res_a_right = a >> 1
# 0011 1000
#>>1
# 0001 1100=28
res_b_right = b >> 1
# 1110 1110
#>>1(算术右移符号位不变,低位舍弃,高位补1)
# 1111 0111补 = 1111 0110反 = 1000 1001原 = -9
print(f"56 >> 1 = {res_a_right}")
print(f"-18 >> 1 = {res_b_right}")
# 按位取反 ~x = -x -1
res_not_a = ~a
#0011 1000
#~
#1100 0111补 = 1100 0110反 = 1011 1001=-57
res_not_b = ~b
#1110 1110
#~
#0001 0001=17
print(f"~56 = {res_not_a}")
print(f"~-18 = {res_not_b}")
运行结果:

二、完成文件读取功能,任意读取某个文件内容时,请编写装饰器,实现写出文件时增加当前系统时间,并打印至控制台最后一行
我们先随便创建一个test.txt文件来作为测试文件:内部随便添加一些内容就好了
python
from datetime import datetime
#先定义装饰器
def add_war_time(func):
def wrapper(*args,**kwargs):
result=func(*args,**kwargs)
#获取系统时间当前的
now_time=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
#获取文件名/路径
file_path=args[0]
#执行追加操作到末尾
with open(file_path,"a+",encoding="utf-8") as f:
f.write(f"文件写入时间:{now_time}\n")
#打印
print(f"文件写入时间:{now_time}\n")
return result
return wrapper
#现在随便定义一个文件函数,再使用我们定义的装饰器来修饰,看是否成功
@add_war_time
def read_file(filepath:str):
#读取任意文件内容
try:
with open(filepath,"r",encoding="utf-8") as f:
return f.read()
except FileNotFoundError:
return f"{filepath}不存在"
#现在我们可以试试写主函数来测试是否能成功
if __name__=="__main__":
#获取读取到的内容
data=read_file("test.txt")
print(data)
运行结果:

三、给定一个包含n+1个整数的数组nums,其数字在1到n之间(包含1和n),可知至少存在一个重复的整数 假设只有一个重复的整数,请找出这个重复的数
这里我们可以使用快慢指针floyd判圈算法,这里小讲解一波
这里举例一个nums=1,3,4,2,2 根据题意我们就知道了数组长度L=5,n=4,数字只会在1-4区间内,重复数字明眼一看就知道是2
核心就是把数组构建成单向链表
我们把下标i看成链表的结点
节点i的后继点就等于numsi
构建链表:(索引:0 1 2 3 4)
0-nums0=1 1-nums1=3 2-nums2=2 3-nums3=4 4-nums4=2
这样就知道链表链路:
0-1-3-2-4-2-4-2-4-2-4............
就可以知道2就是环的入口,所以2就是重复数字
python
"""
代码讲解:
1.快慢指针第一次相遇:
slow:一次只走一步,slow=nums[slow]
fast:一次走两步,fast=nums[nums[fast]]
2.只要重置其中一个指针回到起到,两者同速前进,再次相遇的点就是环入口,也就是重复数字的位置
演算:
第一阶段:循环找相遇 初始:slow=nums[0]=1 fast=nums[0]=1
1.slow=nums[1]=3,fast=nums[nums[1]]=nums[3]=2 -> 不等
2.slow=nums[3]=1,fast=nums[nums[2]]=nums[4]=2 -> slow == fast 相遇成功 此时slow == fast == 2
第二阶段:fast回到起点nums[0]=1,同速度前进
slow=2,fast=1
1.slow=nums[2]=4,fast=nums[1]=3 -> 不等
2.slow=nums[4]=2,fast=nums[3]=2 -> 相等 相遇值=2,则就是重复数字,答案就出来了
"""
def findDuplicate(nums):
slow = nums[0]
fast = nums[0]
# 第一阶段:快慢指针相遇
while True:
slow = nums[slow]
fast = nums[nums[fast]]
if slow == fast:
break
# 第二阶段:快指针从头开始,同速
fast = nums[0]
while slow != fast:
slow = nums[slow]
fast = nums[fast]
return slow
print(findDuplicate([1,3,4,2,2])) #2
运行结果:这里重新给了一个数组,代码还是一样的

四、完成登录系统,登录时数据使用序列化和反序列
我们先创建一个json文件用来存放用户密码信息users.json,举例我们创建两个用户zhangsan和lisi密码分别是123456和666888

现在我们开始敲系统代码:
python
import json
import os
#保存用户数据的文件
User_file="users.json"
#序列化函数,将字典对象转换成json字符串 写入文件中
def save_users(user_dict):
with open(User_file,"w",encoding="utf-8") as f:
json.dump(user_dict,f,ensure_ascii=False,indent=2)
#反序列化,读取文件json字符串到python字典对象
def load_users():
#如果文件不存在就返回空字典
if not os.path.exists(User_file):
return {}
with open(User_file,"r",encoding="utf-8") as f:
data=json.load(f)
return data
#定义用户注册函数
def register():
users=load_users()
username=input("请输入注册账号:").strip()
if username in users:
print("账户已存在!")
return False
password=input("请输入密码:").strip()
users[username]=password
save_users(users)
print("注册成功")
return True
#定义登录函数
def login():
users=load_users()
username=input("请输入账户:").strip()
password=input("请输入密码:").strip()
if username not in users:
print("账户不存在!")
return False
if users[username] == password:
print("登录成功!欢迎您", username)
return True
else:
print("密码错误")
return False
#开始定义主函数
def main():
while True:
print("\n=======登录系统=======")
print("1.注册")
print("2.登录")
print("3.退出系统")
choice=input("请选择功能(1/2/3):")
if choice=="1":
register()
elif choice=="2":
login()
elif choice=="3":
print("系统退出............")
break
else:
print("输入错误,请重新选择!")
if __name__ == "__main__":
main()
运行结果测试:
