Python扩展小练习

一、位运算(完成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()

运行结果测试:

相关推荐
coder!mq2 小时前
说几个常见的语法糖?
java·开发语言·算法
不爱学英文的码字机器3 小时前
推荐算法梳理,六种主流模型与九步训练流程
算法·机器学习·推荐算法
白狐_7983 小时前
408数据结构第5章:树与二叉树②——遍历、线索树、森林与哈夫曼
数据结构·算法·深度优先
致Great7 小时前
科研人的 AI,不该只回答问题:我用字节TraeWork 跑了一遍真实研究任务
算法
纵有疾風起7 小时前
线性表的定义与基本操作 — 从逻辑结构到 ADT 接口
数据结构·算法·408·线性表·adt
测试_AI_一辰7 小时前
AI Agent 评测最隐蔽的坑-记忆
人工智能·算法·ai·自动化·ai编程
lucas_AI7 小时前
给YOLO检测器插 LoRA,'插对地方'比'插什么'更要命
人工智能·算法
LuminousCPP8 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
Nil2088 小时前
leetcode 三数之和
数据结构·算法·leetcode