python第四次作业

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()

运行结果:

思路分析:

  1. 文件打开模式

    • 序列化写入必须用 wb(二进制写入模式)
    • 反序列化读取必须用 rb(二进制读取模式) 不能用普通的 w / r 文本模式,否则会报错。
  2. 异常处理 第一次运行程序时,user_data.pkl 文件还不存在,用 try-except 捕获文件不存在的错误,直接返回空字典,避免程序崩溃。

  3. 数据结构 用字典存储用户数据,格式为 {用户名: 密码},查找和校验都非常方便。

Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明),个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Python多模态情感分析-基于BERT+ResNet的多种融合方法(源码+文档说明)Pyth
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值