python代码小练-4

1.位运算: 计算56及-18的所有位运算符结果,并使在注释中体现计算过程

python 复制代码
a = 56
b = -18

# 1. 按位与 &:对应位都为1则为1,否则0
# 56补码:00111000;-18补码:11101110 → 按位与:00101000(十进制40)
and_result = a & b
print(f"a & b = {and_result}")  # 输出:40

# 2. 按位或 |:对应位有1则为1,否则0
# 56补码:00111000;-18补码:11101110 → 按位或:11111110(十进制-2)
or_result = a | b
print(f"a | b = {or_result}")  # 输出:-2

# 3. 按位异或 ^:对应位不同则为1,否则0
# 56补码:00111000;-18补码:11101110 → 按位异或:11010110(十进制-42)
xor_result = a ^ b
print(f"a ^ b = {xor_result}")  # 输出:-42

# 4. 按位取反 ~:0→1,1→0(结果 = -x -1)
# ~56:补码00111000 → 取反11000111(十进制-57)
a_result1 = ~a
print(f"~a = {a_result1}")  # 输出:-57
# ~-18:补码11101110 → 取反00010001(十进制17)
b_result1 = ~b
print(f"~b = {b_result1}")  # 输出:17

# 5. 左移 <<:高位丢弃,低位补0(相当于 ×2^n)
# 56 << 2:00111000 → 11100000(十进制224 = 56×4)
a_left2 = a << 2
print(f"a << 2 = {a_left2}")  # 输出:224
# -18 << 2:11101110 → 10111000(十进制-72 = -18×4)
b_left2 = b << 2
print(f"b << 2 = {b_left2}")  # 输出:-72

# 6. 右移 >>:正数高位补0,负数高位补1(相当于 ÷2^n,向下取整)
# 56 >> 2:00111000 → 00001110(十进制14 = 56÷4)
a_right2 = a >> 2
print(f"a >> 2 = {a_right2}")  # 输出:14
# -18 >> 2:11101110 → 11111011(十进制-5 = -18÷4向下取整)
b_right2 = b >> 2
print(f"b >> 2 = {b_right2}")  # 输出:-5

2.完成文件读取功能,任意读取某个文件内容时,请编写装饰器,实现写出文件时增加当前系统时间,并打印至控制台最后一行

python 复制代码
import time
from functools import wraps


def add_system_time(func):
    """装饰器:读取文件后追加当前系统时间,并重写文件"""

    @wraps(func)  # 保留原函数信息
    def wrapper(file_path, *args, **kwargs):
        # 1. 调用原函数读取文件内容
        content = func(file_path, *args, **kwargs)

        # 2. 获取当前系统时间(格式化:年-月-日 时:分:秒)
        current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

        # 3. 追加时间到内容末尾
        new_content = content + f"\n\n文件读取时间:{current_time}"

        # 4. 重写文件(覆盖原内容,增加时间)
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(new_content)

        # 5. 打印结果(最后一行是时间)
        print("文件内容(含读取时间):")
        print(new_content)
        return new_content  # 返回包含时间的内容

    return wrapper


@add_system_time
def read_file(file_path):
    """读取文件内容的原始函数"""
    try:
        with open(file_path, "r", encoding="utf-8") as f:
            return f.read().strip()  # 读取并去除首尾空白
    except FileNotFoundError:
        print(f"错误:文件 {file_path} 不存在!")
        return ""


# 测试:读取任意文件(如 test.txt)
read_file("test.txt")

3.给定一个包含n+1个整数的数组nums,其数字在1到n之间(包含1和n),可知至少存在一个重复的整数 假设只有一个重复的整数,请找出这个重复的数

python 复制代码
def find_duplicate(nums):
    """
    寻找数组中唯一的重复数(快慢指针法)
    :param nums: 长度为n+1,元素1~n的数组
    :return: 重复数
    """
    # 1. 初始化快慢指针(慢指针走1步,快指针走2步)
    slow = nums[0]
    fast = nums[nums[0]]

    # 2. 找到快慢指针相遇点(确定有环)
    while slow != fast:
        slow = nums[slow]  # 慢指针走1步
        fast = nums[nums[fast]]  # 快指针走2步

    # 3. 找到环的入口(重复数):慢指针回到起点,两者同步走1步
    slow = 0
    while slow != fast:
        slow = nums[slow]
        fast = nums[fast]

    return slow


# 测试用例
test_cases = [
    [1, 3, 4, 2, 2],  # 输出:2
    [3, 1, 3, 4, 2],  # 输出:3
    [1, 1],  # 输出:1
    [1, 2, 3, 4, 4, 5]  # 输出:4
]

for case in test_cases:
    print(f"数组 {case} 的重复数:{find_duplicate(case)}")

4.完成登录系统,登录时数据使用序列化和反序列化.

python 复制代码
import pickle
import os

# 存储用户数据的文件路径
USER_DATA_FILE = "user_data.pkl"


def serialize_data(data, file_path):
    """序列化:将Python对象写入文件"""
    with open(file_path, "wb") as f:
        pickle.dump(data, f)  # 序列化并写入


def deserialize_data(file_path):
    """反序列化:从文件读取Python对象"""
    if not os.path.exists(file_path):
        return {}  # 文件不存在时返回空字典
    with open(file_path, "rb") as f:
        return pickle.load(f)  # 读取并反序列化


def register(username, password):
    """用户注册:序列化存储用户名和密码"""
    # 1. 读取已有用户数据
    user_data = deserialize_data(USER_DATA_FILE)

    # 2. 校验用户名是否已存在
    if username in user_data:
        print(f"错误:用户名 {username} 已被注册!")
        return False

    # 3. 存储新用户(密码明文存储,实际项目需加密)
    user_data[username] = password
    serialize_data(user_data, USER_DATA_FILE)
    print(f"注册成功!用户名:{username}")
    return True


def login(username, password):
    """用户登录:反序列化验证用户名和密码"""
    # 1. 读取用户数据
    user_data = deserialize_data(USER_DATA_FILE)

    # 2. 校验用户名和密码
    if username not in user_data:
        print(f"错误:用户名 {username} 不存在!")
        return False
    if user_data[username] != password:
        print("错误:密码不正确!")
        return False

    print(f"登录成功!欢迎 {username}!")
    return True


# 测试登录系统
if __name__ == "__main__":
    # 注册用户
    register("zhangsan", "123456")
    register("lisi", "abcdef")

    # 登录测试
    login("zhangsan", "123456")  # 成功
    login("zhangsan", "654321")  # 密码错误
    login("wangwu", "111111")  # 用户名不存在
相关推荐
charlie1145141913 小时前
如何把 Win32 窗口“置顶”(Windows + C++)
开发语言·c++·windows·笔记·学习·软件工程
luoluoal3 小时前
基于python的反爬虫技术的研究(源码+文档)
开发语言·python·mysql
妮妮喔妮3 小时前
Nextjs的SSR服务器端渲染为什么优化了首屏加载速度?
开发语言·前端·javascript
老歌老听老掉牙3 小时前
圆柱立铣刀容屑槽几何要素仿真及计算分析
python·立铣刀·容屑槽
SmoothSailingT3 小时前
C/C++与C#——指针的作用
开发语言·c++·c
Yan-英杰3 小时前
从Free Tier到Serverless:用亚马逊云科技打造零门槛AI应用
服务器·开发语言·科技·ai·大模型
hugh_oo3 小时前
100 天学会爬虫 · Day 11:如何合理控制爬虫请求频率?让访问行为更像真人
开发语言·爬虫·python
长安牧笛3 小时前
房贷提前还款测算程序,输入贷款总额,利率,还款年限,计算提前还款后的利息节省金额和月供变化。
python
嘻哈baby3 小时前
Python开发Telegram Bot实现服务器监控告警
python