python第四次作业

1.给定一个包含n+1个整数的数组nums,其数字在1到n之间(包含1和n),

可知至少存在一个重复的整数 假设只有一个重复的整数,请找出这个重复的数 -- 可以使用多种方式 -异或运算/集合

代码:

python 复制代码
def find_repeated_num(nums):
    n = len(nums) - 1  # n+1个整数的数组nums,范围在1到n之间(包含1和n)
    xor_n = 0
    xor_nums = 0
    # 通过异或1到n中所有数
    for i in range(1, n+1):
        xor_n ^= i
    # 异或数组nums中所有元素
    for j in nums:
        xor_nums ^= j
    # 最终异或结果即为重复数
    return xor_n ^ xor_nums

# 测试
nums = [1,2,3,4,5,3,6,7]
print(find_repeated_num(nums))  # 3

运行结果:

2.编写一个登录功能,使用序列化完成,并使用装饰器完成用户名和密码的记录及每次登录时间

  • 1.存储文件中的用户名和密码,使用序列化的形式--对象

  • 2.读取文件中的数据-反序列化的对象,

  • 3.用户输入登录的账户和密码,检验,完成登录操作

  • 4.装饰器记录登录的账户和密码,及登录时间

代码:

python 复制代码
import pickle
import time

# 装饰器:记录登录时间、用户名、密码、结果
def login_log(func):
    def wrapper(user, pwd):
        # 登录时间
        log_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        # 执行原登录函数,获取结果
        res = func(user, pwd)
        # 追加写入日志
        with open("login_log.txt", "a", encoding="utf-8") as f:
            f.write(f"时间:{log_time},用户名:{user},密码:{pwd},结果:{res}\n")
        return res
    return wrapper

# 序列化/反序列化,读取/初始化用户数据
def get_users():
    try:
        # 反序列化:读取文件中的用户字典对象
        with open("user.pkl", "rb") as f:
            return pickle.load(f)
    except FileNotFoundError:
        # 首次运行无文件,手动输入初始用户信息
        print("=== 首次运行 ===")
        init_user = input("请设置初始用户名:").strip()
        init_pwd = input("请设置初始用户密码:").strip()
        # 构造用户对象并序列化存储
        init_obj = {init_user: init_pwd}
        with open("user.pkl", "wb") as f:
            pickle.dump(init_obj, f)
        print("用户数据初始化完成\n")
        return init_obj

# 登录函数
@login_log
def login(username, password):
    users = get_users()
    if username not in users:
        return "用户名不存在"
    elif users[username] == password:
        return "登录成功"
    else:
        return "密码错误"

# 主程序
if __name__ == "__main__":
    print("=== 系统登录 ===")
    uname = input("请输入用户名:").strip()
    pwd = input("请输入密码:").strip()
    print("登录结果:", login(uname, pwd))

运行结果:

3.测试位运算符,数字为23和-17的,并详细列出位运算的全过程

代码:

python 复制代码
a = 23
b = -17

"""
十进制转二进制转补码
    a:0001 0111 原
      0001 0111 补
    b:0001 0001 原
      1110 1110 反
      1110 1111 补  
"""

"""
位与
    a:0001 0111
    b:1110 1111
    &:0000 0111 补
      0000 0111 原 = 7
"""
print("a & b:", a & b)  # 7

"""
位或
    a:0001 0111
    b:1110 1111
    |:1111 1111 补
      1111 1110 反 
      0000 0001 原 = -1  
"""
print("a | b:", a | b)  # -1

"""
异或
    a:0001 0111
    b:1110 1111
    ^:1111 1000 
      1111 0111
      0000 1000 = -8
"""
print("a ^ b:", a ^ b)  # -8

"""
取反
    a:0001 0111
    ~:1110 1000 ==>反:1110 0111 ==>原 0001 1000 = -24
    b:1110 1111
    ~:0001 0000 ==> 16
"""
print("~a:", ~a)  # -24
print("~b:", ~b)  # 16

"""
左移
    a:0001 0111
    <<2:0101 1100 = 92
    b:1110 1111
    <<2:1011 1100 ==>反:1011 1011 ==>原 0100 0100 = -68
"""
print("a<<2:", a << 2)  # 92
print("b<<2:", b << 2)  # -68

"""
右移
    a:0001 0111
    >>2:0000 0101 = 5
    b:1110 1111
    >>2:1111 1011 ==>反:1111 1010 ==>原 0000 0101 = -5
"""
print("a>>2:", a >> 2)  # 5
print("b>>2:", b >> 2)  # -5

运行结果:

相关推荐
方安乐3 小时前
python之向量、向量和、向量点积
开发语言·python·numpy
zh1570234 小时前
JavaScript中WorkerThreads解决服务端计算瓶颈
jvm·数据库·python
Old Uncle Tom5 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆5 小时前
洛谷题单入门1 顺序结构
数据结构·算法·golang
生信碱移5 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
蜡台5 小时前
Python包管理工具pip完全指南-----2
linux·windows·python
Mr.朱鹏5 小时前
【Python 进阶 | 第四篇】Psycopg3 + Flask 实现 PostgreSQL CRUD 全流程:从连接池到RESTful接口
python·postgresql·flask·virtualenv·fastapi·pip·tornado
智者知已应修善业5 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
2401_871492856 小时前
Vue.js监听器watch利用回调函数处理级联下拉框数据联动
jvm·数据库·python
FreakStudio6 小时前
亲测可用!可本地部署的 MicroPython 开源仿真器
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机