1.位运算: 计算56及-18的所有位运算符结果,并使在注释中体现计算过程
代码:
a = 56 # 补码:0011 1000
b = -18 # 补码:1110 1110
# ---------- 1. 按位与 & (两位"都为 1"才是 1,否则为 0) ----------
# 0011 1000 ( 56)
# & 1110 1110 (-18)
# = 0010 1000 = 40
# 逐位看:第 4、6 位(从右数,从 0 开始)两边都是 1
print("56 & -18 =", a & b) # 结果:40
# ---------- 2. 按位或 | (两位"只要有 1"就是 1,否则为 0) ----------
# 0011 1000 ( 56)
# | 1110 1110 (-18)
# = 1111 1110 = -2
# 说明:1111 1110 最高位是 1,是负数;按口诀倒推
# 先 -1:1111 1101,再取反:0000 0010 = 2,所以原值 = -2
print("56 | -18 =", a | b) # 结果:-2
# ---------- 3. 按位异或 ^ (两位"不同"为 1,"相同"为 0) ----------
# 0011 1000 ( 56)
# ^ 1110 1110 (-18)
# = 1101 0110 = -42
# 说明:1101 0110 最高位是 1,是负数;
# 先 -1:1101 0101,再取反:0010 1010 = 42,所以原值 = -42
print("56 ^ -18 =", a ^ b) # 结果:-42
# ---------- 4. 按位取反 ~ (0 变 1,1 变 0,单目运算) ----------
# ~56: 0011 1000 -> 1100 0111
# 1100 0111 是负数;先 -1:1100 0110,取反:0011 1001 = 57,所以 = -57
# 也可直接用口诀:~x = -x - 1 => ~56 = -56 - 1 = -57
print("~56 =", ~a) # 结果:-57
# ~(-18):1110 1110 -> 0001 0001
# 最高位是 0,是正数,直接读 = 17
# 也可直接用口诀:~x = -x - 1 => ~(-18) = 18 - 1 = 17
print("~(-18) =", ~b) # 结果:17
# ---------- 5. 左移 << (整体左移 n 位,低位补 0,高位丢弃) ----------
# 直觉:每左移 1 位 = 乘 2,所以 x << n ≈ x × 2^n
#
# 56 << 2:0011 1000 左移 2 位 -> 1110 0000 0000(高位会扩展)
# 结果 = 56 × 2^2 = 56 × 4 = 224
print("56 << 2 =", a << 2) # 结果:224
# -18 << 2:1110 1110 左移 2 位 -> ...1011 1000 00
# 结果 = -18 × 2^2 = -18 × 4 = -72
# 注意:左移会让"数值变大",8 位装不下,Python 用任意精度存储,结果是 -72
print("-18 << 2 =", b << 2) # 结果:-72
# ---------- 6. 右移 >> (整体右移 n 位,低位丢弃,高位补"符号位") ----------
# 直觉:每右移 1 位 ≈ 除以 2(向下取整)
# 注意:负数右移高位补 1(叫"算术右移"),正数高位补 0
#
# 56 >> 2:0011 1000 右移 2 位 -> 0000 1110 = 14
# 结果 = 56 // 2^2 = 56 // 4 = 14
print("56 >> 2 =", a >> 2) # 结果:14
# -18 >> 2:1110 1110 算术右移 2 位 -> 1111 1011
# 最高位补符号位 1;这是负数
# 先 -1:1111 1010,取反:0000 0101 = 5,所以 = -5
# 结果 = -18 // 4 = -5 (Python 整除向"负无穷"取整,-18/4=-4.5 -> -5)
print("-18 >> 2 =", b >> 2) # 结果:-5
运行结果:

2.完成文件读取功能,任意读取某个文件内容时,请编写装饰器,实现写出文件时增加当前系统时间,并打印至控制台最后一行
代码:
import functools
from datetime import datetime
def add_timestamp(func):
@functools.wraps(func)
def wrapper(file_path, *args, **kwargs):
result = func(file_path, *args, **kwargs)
now = datetime.now()
time_str = now.strftime("%Y-%m-%d %H:%M:%S")
timestamp_line = f"\n写入时间:{time_str}\n"
with open(file_path, "a", encoding="utf-8") as f:
f.write(timestamp_line)
print(time_str)
return result
return wrapper
def read_file(file_path):
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
return content
@add_timestamp
def write_file(file_path, content):
with open(file_path, "w", encoding="utf-8") as f:
f.write(content)
if __name__ == "__main__":
src_file = "hello python.py"
dst_file = "result.txt"
text = read_file(src_file)
write_file(dst_file, text)
运行结果:

思路分析:
装饰器 = 在"不修改原函数代码"的前提下,给函数"加新功能"的工具。
一、首先,定义装饰器,给"写文件函数"加两个新功能:
① 写完文件后,在文件末尾追加当前系统时间
② 把该时间打印到控制台最后一行;
wrapper = "包装器",是实际替换了原函数的"新函数"。它会先做原函数的事,再做装饰器想加的事。file_path :写文件的目标路径;*args :剩下的"位置参数",全部打包转发给原函数; **kwargs :剩下的"关键字参数",全部打包转发给原函数;
先跑原函数,把正常的写文件做完,func 就是"原来的 write_file,把接收到的所有参数原样传回去,得到它的返回值 result。datetime.now() 会拿到当前"年月日时分秒",strftime = string format time,把时间对象"转成"指定格式的字符串,拼出要写进文件的那行字(前面加个 \n 换行,免得粘到原来的最后一行);
追加模式把时间写进文件,注意模式是 "a"(append),这样不会覆盖刚刚写完的内容,之后控制台打印时间;
return result把原函数的返回值返还,return wrapper把包装好的"新函数 wrapper"返回出去,替换原来的函数;
二、定义"读文件"函数
用 with 打开,自动关闭文件,encoding="utf-8" 防止中文乱码,如果文件不存在,Python 会自动报 FileNotFoundError。.read() 一次性读整个文件的所有内容,读取后返回内容;
三、定义"写文件"函数,并用 @add_timestamp 给它"套壳"
把 content 写入到 file_path因为加了 @add_timestamp 装饰器,写入完成后会自动:在文件末尾追加当前系统时 在控制台最后一行打印这个时间。
3.给定一个包含 n+1 个整数的数组 nums,其数字在 1 到 n 之间 (包含 1 和 n), 可知至少存在一个重复的整数 假设只有一个重复的整数,请找出这个重复的数
代码:
def Num(nums):
seen = set()
for num in nums:
if num in seen:
return num
seen.add(num)
nums = [3, 1, 3, 4, 2]
print(Num(nums))
运行结果:

思路分析:
利用集合(set)元素具有唯一性,遍历数组时记录已经出现过的数字。遇到已经在集合里的数,说明它就是重复的。
4.完成登录系统,登录时数据使用序列化和反序列化
代码:
import pickle
USER_DATA_FILE = "user_data.pkl"
def load_user_data():
try:
with open(USER_DATA_FILE, "rb") as f:
user_dict = pickle.load(f)
except FileNotFoundError:
user_dict = {}
return user_dict
def save_user_data(user_dict):
with open(USER_DATA_FILE, "wb") as f:
pickle.dump(user_dict, f)
def register():
user_dict = load_user_data()
username = input("请设置用户名:")
if username in user_dict:
print("注册失败:该用户名已存在")
return
password = input("请设置密码:")
user_dict[username] = password
save_user_data(user_dict)
print("注册成功")
def login():
user_dict = load_user_data()
username = input("请输入用户名:")
password = input("请输入密码:")
if username in user_dict and user_dict[username] == password:
print(f"登录成功,欢迎 {username}")
else:
print("登录失败:用户名或密码错误")
def main():
while True:
print("\n===== 登录系统 =====")
print("1. 注册账号")
print("2. 账号登录")
print("3. 退出程序")
choice = input("请输入选项序号:")
if choice == "1":
register()
elif choice == "2":
login()
elif choice == "3":
print("程序已退出")
break
else:
print("输入无效,请重新选择")
if __name__ == "__main__":
main()
运行结果:

思路分析:
-
文件打开模式
- 序列化写入必须用
wb(二进制写入模式) - 反序列化读取必须用
rb(二进制读取模式) 不能用普通的w/r文本模式,否则会报错。
- 序列化写入必须用
-
异常处理 第一次运行程序时,
user_data.pkl文件还不存在,用try-except捕获文件不存在的错误,直接返回空字典,避免程序崩溃。 -
数据结构 用字典存储用户数据,格式为
{用户名: 密码},查找和校验都非常方便。

4860

被折叠的 条评论
为什么被折叠?



