python进阶刷题8
目录
- Python上下文管理器(例如 with 语句)在实际资源管理(如文件操作)中的主要优势是什么?
- 考虑函数实现 def append_item(item, bucket=[]): bucket.append(item); return bucket。关于该实现与修复方式,下列说法正确的是?
- 观察以下 `asyncio` 代码片段。`asyncio.run(main())` 执行后会发生什么?
Python上下文管理器(例如 with 语句)在实际资源管理(如文件操作)中的主要优势是什么?
A
提供更简洁的异常处理机制,替代 try-except
B
自动调用 enter 和 exit 方法,确保资源正确释放
C
实现函数装饰功能,增强代码重用性
D
支持异步操作,提高资源访问速度
正确答案:B
你的答案:A
官方解析:
Python上下文管理器(如with语句)在实际资源管理中的主要优势是自动管理资源的获取和释放,通过调用__enter__
和__exit__
方法确保资源在代码块执行后正确释放,即使发生异常也能安全清理。选项A虽然提到简化异常处理,但上下文管理器的核心优势是资源清理而非替代try-except;选项C错误,因为上下文管理器用于资源管理,与函数装饰器无关;选项D错误,因为标准上下文管理器不支持异步操作,异步操作需使用异步上下文管理器(async with)。
考虑函数实现 def append_item(item, bucket=[]): bucket.append(item); return bucket。关于该实现与修复方式,下列说法正确的是?
A
该实现有缺陷:默认列表在函数定义时只创建一次,调用间会共享;应改为将默认值设为 None 并在函数体内创建新列表
B
该实现没有问题,因为每次调用都会得到新的列表实例
C
应将 bucket 声明为 global,这样每次调用都会互相隔离
D
在函数尾部调用 bucket.clear() 即可彻底避免副作用
正确答案:A
你的答案:B
官方解析:
函数实现 def append_item(item, bucket=[]): bucket.append(item); return bucket 在 Python 中存在缺陷,因为默认参数值(如 bucket=[])在函数定义时仅创建一次,并在后续调用间共享同一个列表实例,导致多次调用时数据意外累积。选项A正确描述了该缺陷及修复方式:应将默认值设为 None 并在函数体内使用 if bucket is None: bucket = [] 来创建新列表,避免共享。选项B错误:每次调用不会得到新列表实例,因为默认列表仅在定义时创建一次。选项C错误:将 bucket 声明为 global 会使所有调用共享全局变量,进一步加剧共享问题,无法隔离调用。选项D错误:在函数尾部调用 bucket.clear() 会清空列表,但 bucket 仍然是共享实例,下次调用时继续使用同一个列表,副作用无法避免。
观察以下 asyncio
代码片段。asyncio.run(main())
执行后会发生什么?
1
2
3
4
5
6
7
8
import asyncio
async def my_coro():
print(“Coroutine is running”)
return “Done”
async def main():
# 注意:这里仅仅是创建了协程对象,但没有 await 它
task_object = my_coro()
print(“Main function finished”)
A
依次打印 “Main function finished” 和 “Coroutine is running”。
B
只打印 “Main function finished”,程序正常退出且没有任何警告。
C
打印 “Main function finished”,随后程序因一个未被等待的协程 (un-awaited coroutine) 而抛出 RuntimeWarning
。
D
代码会抛出 SyntaxError
,因为协程函数调用必须使用 await
关键字。
正确答案:C
你的答案:A
官方解析:
当执行 asyncio.run(main())
时,main
协程运行:它创建了 my_coro
的协程对象但没有 await
,因此只执行 print("Main function finished")
,而 my_coro
不会被运行,不会打印 “Coroutine is running”。随后,在事件循环关闭时,Python 检测到未被等待的协程(un-awaited coroutine),会抛出一个 RuntimeWarning
。选项 C 正确描述了此行为。选项 A 错误,因为 “Coroutine is running” 不会被打印;选项 B 错误,因为有警告;选项 D 错误,因为代码语法正确,没有 SyntaxError
。