2.3云计算python作业

1.给定一个包含n+1个整数的数组nums,其数字在1到n之间(包含1和n),
可知至少存在一个重复的整数 假设只有一个重复的整数,请找出这个重复的数 -- 可以使用多种方式 -异或运算/集合

def find_duplicate_set(nums):
    """
    利用集合的唯一性找重复数
    """
    seen = set()
    for num in nums:
        if num in seen:
            return num
        seen.add(num)
    return -1
a = [1,2,3,4,5,6,7,8,9,10,5]
print(find_duplicate_set(a))

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

import pickle
import time
from datetime import datetime

# 定义文件路径
USER_DATA_FILE = "D:/test/b/user_data.pkl"
LOG_FILE = "D:/test/b/login_log.txt"


# 初始化用户数据(首次运行时创建)
def init_user_data():
    """初始化用户数据,序列化保存到文件"""
    # 预设测试用户:{"admin": "123456"}
    default_users = {"admin": "123456"}
    with open(USER_DATA_FILE, "wb") as f:
        pickle.dump(default_users, f)


# 装饰器:记录登录信息(用户名、密码、登录时间)
def login_logger(func):
    def wrapper(*args, **kwargs):
        # 执行原登录函数,获取登录结果和用户名/密码
        username = args[0] if args else kwargs.get("username")
        password = args[1] if len(args) >= 2 else kwargs.get("password")
        result = func(*args, **kwargs)

        # 记录登录信息(无论成功/失败)
        login_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        log_content = f"时间:{login_time} | 用户名:{username} | 密码:{password} | 登录结果:{result}\n"

        # 写入日志文件
        with open(LOG_FILE, "a", encoding="utf-8") as f:
            f.write(log_content)
        return result

    return wrapper

# 读取用户数据(反序列化)
def load_user_data():
    """读取序列化的用户数据"""
    try:
        with open(USER_DATA_FILE, "rb") as f:
            return pickle.load(f)
    except FileNotFoundError:
       # 文件不存在则初始化
       init_user_data()
       return load_user_data()

# 登录函数(带装饰器)
@login_logger
def login(username, password):
    """
    登录校验函数
    """
    user_data = load_user_data()
    if username in user_data and user_data[username] == password:
        return "登录成功"
    else:
        return "登录失败(用户名或密码错误)"


def main():
    print("===== 序列化登录系统 =====")
    username = input("请输入用户名:").strip()
    password = input("请输入密码:").strip()

    # 执行登录
    result = login(username, password)
    print(result)

main()

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

(1)转换 23 和 - 17 为二进制补码

23

十进制转二进制:23 = 00010111

补码:00010111

-17

17 的二进制原码(8 位):00010001

17 的反码:符号位不变,其余取反 → 11101110

-17 的补码: 11101110+1 = 11101111

(2)测试所有位运算

按位与(&):23 & -17

  23补码: 0001 0111
& -17补码:1110 1111
  -----------------
          0000 0111  → 十进制7

按位或(|):23 | -17

  23补码: 0001 0111
| -17补码:1110 1111
  -----------------
          1111 1111  → 补码转十进制:全1的8位补码是-1

按位异或(^):23 ^ -17

  23补码: 0001 0111
^ -17补码:1110 1111
  -----------------
          1111 1000  → 补码转十进制:
                        反码:1111 0111 → 原码:1000 1000 → -8

按位取反(~):~23 和~-17

~23

23 补码:0001011111101000

反码11100111 → 原码10011000 → 十进制 - 24

~-17

补码:1110111100010000

补码转十进制:16

左移(<<):23<<1 和 -17<<1

23<<1

23 补码:00010111 → 左移 1 位:00101110 → 十进制 46

-17<<1

17 补码:11101111 → 左移 1 位:11011110

反码:11011101 → 原码:10100010 → 十进制 - 34

右移(>>):23>>1 和 -17>>1

23>>1

23 补码:00010111 → 右移 1 位:00001011 → 十进制 11

-17>>1

-17 补码:11101111 → 右移 1 位:11110111

反码:11110110 → 原码:10001001 → 十进制 - 9

a = 23
b = -17

print(f"23 & -17 = {a & b}")
print(f"23 | -17 = {a | b}")
print(f"23 ^ -17 = {a ^ b}")
print(f"~23 = {~a}")           
print(f"~-17 = {~b}")
print(f"23<<1 = {a << 1}")
print(f"-17<<1 = {b << 1}")
print(f"23>>1 = {a >> 1}")
print(f"-17>>1 = {b >> 1}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值