资讯动态

Python扩展小练习

发布时间:2026/8/12 18:15:04 来源:尧图企业网站定制
一、位运算(完成56和-18的所有位运算包括与或非等)所有的计算过程都在注释内 #计算56及-18的所有位运算结果 a56 b-18 #56二进制 0011 1000原反补 #-18二进制 1001 0010原、 1110 1101反、 1110 1110补 #与运算有0为0反之为1 res_andab # 0011 1000 #1110 1110 #---------- # 0010 1000原反补 40 print(f56 -18: {res_and}) #或|运算有1为1 res_ora|b # 0011 1000 #|1110 1110 #------------ # 1111 1110补 1111 1101反 0000 0010原 -2 print(f56 | -18: {res_or}) # 按位异或 ^ 不同为1相同为0 res_xor a ^ b # 0011 1000 #^1110 1110 #-------------- # 1101 0110补 1101 0101反 0010 1010原 -42 print(f56 ^ -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(f56 1 {res_a_left}) print(f-18 1 {res_b_left}) # 右移 算术右移正数补0负数补1 res_a_right a 1 # 0011 1000 #1 # 0001 110028 res_b_right b 1 # 1110 1110 #1(算术右移符号位不变低位舍弃高位补1) # 1111 0111补 1111 0110反 1000 1001原 -9 print(f56 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 000117 print(f~56 {res_not_a}) print(f~-18 {res_not_b})运行结果二、完成文件读取功能任意读取某个文件内容时请编写装饰器实现写出文件时增加当前系统时间并打印至控制台最后一行我们先随便创建一个test.txt文件来作为测试文件内部随便添加一些内容就好了from datetime import datetime #先定义装饰器 def add_war_time(func): def wrapper(*args,**kwargs): resultfunc(*args,**kwargs) #获取系统时间当前的 now_timedatetime.now().strftime(%Y-%m-%d %H:%M:%S) #获取文件名/路径 file_pathargs[0] #执行追加操作到末尾 with open(file_path,a,encodingutf-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,encodingutf-8) as f: return f.read() except FileNotFoundError: return f{filepath}不存在 #现在我们可以试试写主函数来测试是否能成功 if __name____main__: #获取读取到的内容 dataread_file(test.txt) print(data)运行结果三、给定一个包含n1个整数的数组nums其数字在1到n之间(包含1和n),可知至少存在一个重复的整数 假设只有一个重复的整数请找出这个重复的数这里我们可以使用快慢指针floyd判圈算法这里小讲解一波这里举例一个nums[1,3,4,2,2] 根据题意我们就知道了数组长度L5,n4,数字只会在[1-4]区间内重复数字明眼一看就知道是2核心就是把数组构建成单向链表我们把下标i看成链表的结点节点i的后继点就等于nums[i]构建链表索引0 1 2 3 40-nums[0]1 1-nums[1]3 2-nums[2]2 3-nums[3]4 4-nums[4]2这样就知道链表链路0-1-3-2-4-2-4-2-4-2-4…………就可以知道2就是环的入口所以2就是重复数字 代码讲解 1.快慢指针第一次相遇 slow:一次只走一步slownums[slow] fast:一次走两步,fastnums[nums[fast]] 2.只要重置其中一个指针回到起到两者同速前进再次相遇的点就是环入口也就是重复数字的位置 演算 第一阶段循环找相遇 初始:slownums[0]1 fastnums[0]1 1.slownums[1]3,fastnums[nums[1]]nums[3]2 - 不等 2.slownums[3]1,fastnums[nums[2]]nums[4]2 - slow fast 相遇成功 此时slow fast 2 第二阶段fast回到起点nums[0]1同速度前进 slow2,fast1 1.slownums[2]4,fastnums[1]3 - 不等 2.slownums[4]2,fastnums[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现在我们开始敲系统代码import json import os #保存用户数据的文件 User_fileusers.json #序列化函数将字典对象转换成json字符串 写入文件中 def save_users(user_dict): with open(User_file,w,encodingutf-8) as f: json.dump(user_dict,f,ensure_asciiFalse,indent2) #反序列化读取文件json字符串到python字典对象 def load_users(): #如果文件不存在就返回空字典 if not os.path.exists(User_file): return {} with open(User_file,r,encodingutf-8) as f: datajson.load(f) return data #定义用户注册函数 def register(): usersload_users() usernameinput(请输入注册账号).strip() if username in users: print(账户已存在) return False passwordinput(请输入密码).strip() users[username]password save_users(users) print(注册成功) return True #定义登录函数 def login(): usersload_users() usernameinput(请输入账户).strip() passwordinput(请输入密码).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.退出系统) choiceinput(请选择功能(1/2/3):) if choice1: register() elif choice2: login() elif choice3: print(系统退出…………) break else: print(输入错误请重新选择) if __name__ __main__: main()运行结果测试

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价