python第四次作业

题目

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

代码

python 复制代码
from typing import List

def test1(nums):
    seem = set()
    for num in nums:
        if num in seem:
            return num
        seem.add(num)
    return -1

def main():
    print()
    nums = [
        [1, 3, 4, 2, 2],          # 重复2
        [3, 1, 3, 4, 2],          # 重复3
        [1, 1],                   # 重复1
        [2, 2, 2, 2, 2],          # 重复2
        [1, 2, 3, 4, 5, 6, 7, 8, 9, 9]] # 重复9

    #遍历每个测试用例
    for i,num in enumerate(nums):
        print(f"{i+1}:{num}")
        res = test1(num)
        print(f"重复的数字是:{res}")
        if res != -1:
            count = num.count(res)
            print(f"数字{res}出现了{count}")
        print()

if __name__ == '__main__':
    main()

运行

题目

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

  • 1.存储文件中的用户名和密码,使用序列化的形式--对象
  • 2.读取文件中的数据-反序列化的对象,
  • 3.用户输入登录的账户和密码,检验,完成登录操作
  • 4.装饰器记录登录的账户和密码,及登录时间

代码

python 复制代码
import pickle
from datetime import datetime
from functools import wraps

class User:
    def __init__(self, username,password):
        self.username = username
        self.password = password
        self.login_count = 0
        self.last_login_time = None

# 1.读取文件(反序列号):
def load_users():
    try:
        with open("users.txt","rb") as f:
            users = pickle.load(f)
            return users
    except  Exception as e:
        print(e)
        return {}

# 2.保存文件(序列化)
def save_users(users):
    try:
        with open("users.txt","wb") as f:
            pickle.dump(users,f)
            print(f"保存了{len(users)}个用户")
    except Exception as e:
        print(e)



# 3.登录
def verify_user(users,username,password):
    if username in users:
        if users[username].password == password:
            return True
    return False

# 4.装饰器记录登录信息
def login_logger(func):
    def wrapper(username, password,users):
        login_time = time.strftime("%Y-%m-%d %H:%M:%S")

        print(f"登录时间:{login_time}")
        print(f"用户名:{username}")
        print(f"密码:{'*'*len(password)}")

        result = func(username,password,users)

        if result:
            users[username].login_count += 1
            users[username].last_login_time = datetime.now()
            save_users(users)
            print(f"登录成功,")
            print(f"登录次数{username[username].login_count}")
        else:
            print(f"失败")

        return result
    return wrapper

# 登录  装饰器
@login_logger
def login(username,password,users):
    return verify_user(users,username,password)

def main():
    #1.读取文件(反序列化)
    users = load_users()
    print(f"加载了 {len(users)} 个用户\n")

    # 2.保存文件
    save_users(users)
    print(f"保存成功")

    # 3. 检验登录
    login("admin", "123456", users)
    login("admin", "wrongpassword", users)
    login("unknown", "123456", users)
    login("admin", "123456", users)

    print("所有用户:")
    for username, user in users.items():
        print(f"{username}:登录{user.login_count}次")


if __name__ == "__main__":
    main()

运行

相关推荐
唐叔在学习5 小时前
Python桌面端应用消息提醒功能开发实践
后端·python·程序员
xjdkxnhcoskxbco5 小时前
Java 多线程“八锁”问题深度解析
java·开发语言·多线程
人还是要有梦想的5 小时前
QT的起源
开发语言·qt
程序员小远5 小时前
单元测试知识详解
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
数形长夏5 小时前
一心多用的艺术:Python多任务处理模式
python·架构
柏箱5 小时前
文件上传漏洞入门:(upload-labs Pass-1 & Pass-2)
开发语言·前端·javascript
人道领域5 小时前
Day | 07 【苍穹外卖:菜品套餐的缓存】
java·开发语言·redis·缓存击穿·springcache
biter down5 小时前
C++ 精准控制对象的创建位置(堆 / 栈)
开发语言·c++
星轨初途5 小时前
类和对象(上)
开发语言·c++·经验分享·笔记
智算菩萨5 小时前
基于ChatGPT 5.4的Windows 11智能命令行维护系统:理论架构与实践应用
人工智能·python·ai·chatgpt·ai编程