那些年我错过的代码

print(divmod(17,5))与print(-17 % 5)的输出分别是(A)
A(3,2)和-3
B(3,2)和3
C(3,2)和2
D(4,-3)和3
错因:没掌握python的取模规则。divmod(17,5)是(3,2)没问题,但-17%5在python里是3,不是-3.python取模向{负无穷}取整,结果符号与除数一致。

请写出以下代码的最终输出结果。
1.
d1 = {"a": [1, 2, 3], "b": 20}
d2 = d1.copy()
d2["a"].append(99)
d2["c"] = 100
print(d1)
print(d2)
输出结果:{“a”=[ 1,2,3,99], “b”= 20 }
{“a”=[ 1,2,3,99], “b”= 20, “c”= 100}
原理:d1.copy() 是浅拷贝,顶层是新 dict,但 value 若为可变对象(这里是 list)仍共享。d2["a"].append(99) 改的是共享的 list,d1 也看到。而 d2["c"] = 100 是给 d2 自己新增键,不影响 d1。
{'a': [1, 2, 3, 99], 'b': 20, 'c': 100}

def add_item(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst

print(add_item(1))
print(add_item(2))
print(add_item(3, [10, 20]))
输出结果:[1]
[2]
[3,10,20]
[10, 20, 3]
[2]
[1]
正确答案:
错因:add_item(3, [10, 20]) 中 item=3 是要 append 到 [10, 20] 的元素,不是放在前面。append 是把元素追加到列表末尾,结果应为 [10, 20, 3]。
✗ 答错(得 2/5)。第三个输出写反了。
3.
total = 0
def outer():
global total
def add(n):
global total
total += n
add(5)
add(3)
outer()
outer()
print(total)
输出结果:5+5+3+3=16

def safe_read(path):
try:
f = open(path, "r", encoding="utf-8")
except FileNotFoundError:
print("NOT FOUND")
return None
else:
content = f.read()
print("READ OK")
return content
finally:
print("FINALLY")

safe_read("data.txt")
输出结果:NOT FOUND
FINALLY
NOT FOUND
正确答案:
错因:finally 块里的代码无论是否发生异常都会执行。return None 不会跳过 finally,所以还应该打印一行 FINALLY。

  1. 举例说明什么场景下必须使用深拷贝(copy.deepcopy),而浅拷贝(copy.copy)无法满足需求。
    答: 在递归复制所有层级,副本与原件完全独立,任意修改互不影响,使用深拷贝
    浅拷贝只能在只复制对象本身一层,嵌套的可变子对象仍与原件共享引用。
    补充:题目要求「举例说明」,所以最好加一个嵌套 dict 或嵌套 list 的例子,比如 d = {"info": {"name": "Tom"}}; d2 = d.copy(); d2["info"]["name"] = "Jerry" 后原 d 也变了——这就必须用 deepcopy。

  2. 如果要让一个自定义类支持 with 语句,需要实现哪两个魔术方法?分别说明它们的作用。
    答:open with()
    exit(self, exc_type, exc_val, exc_tb):离开 with 块时调用,无论是否异常都执行,负责清理。返回 True 会吞掉 with 块内抛出的异常。
    enter(self):进入 with 块时调用,做初始化工作(比如打开文件、获取锁),返回值赋给 as 后面的变量。

  3. 面向对象与文件操作(15 分)
    设计一个 Book 基类和一个 EBook 子类:
    • Book 属性:title(书名,字符串)、author(作者,字符串)。
    • Book 方法:info(),返回字符串 "《{title}》- {author}"。
    • EBook 在 Book 基础上新增属性 file_size_mb(文件大小,浮点数),重写 info(),返回 "《{title}》- {author} [{file_size_mb}MB]"。
    • 编写测试代码:创建 1 本 Book 和 1 本 EBook,调用 info() 获取字符串后写入 books.json(UTF-8 编码),键为 'books',值为一个列表,每个元素是 info() 返回的字符串。

import json

class Book:
def init(self, title, author):
self.title = title
self.author = author

def info(self):
return f"《{self.title}》- {self.author}"

class EBook(Book):
def init(self, title, author, file_size_mb):
super().init(title, author)
self.file_size_mb = file_size_mb

def info(self):
return (f"《{self.title}》- {self.author}"
f" [{self.file_size_mb}MB]")

测试

b1 = Book("Python 编程", "张三")
b2 = EBook("Python 进阶", "李四", 5.6)
books_info = [b1.info(), b2.info()]

with open("books.json", "w", encoding="utf-8") as f:
json.dump({"books": books_inf

posted @ 2026-09-10 18:00  singsong_xt  阅读(6)  评论(0)    收藏  举报