新手避坑指南:用薛定谔Maestro处理蛋白结构,从下载4LYW到加氢修复的完整流程
2026/4/20 5:01:33
欢迎来到第98天!
在昨天的课程中,我们复习了 Python 的基础语言特性和数据结构。今天,我们将难度升级,进入面试中更能体现候选人内功的领域:函数式编程、面向对象和并发。
这些问题不仅考验你对语法的熟练度,更考验你对编程思想和设计模式的理解。
本节内容:
*args&**kwargs__new__vs__init__、MRO参考回答:
示例:
defouter(x):definner(y):returnx+yreturninner add_5=outer(5)# x=5 被 inner 记住了print(add_5(10))# 15参考回答:
@my_decorator这种语法糖,等价于my_func = my_decorator(my_func)。wrapper函数,在这个wrapper内部执行"前置操作" -> 调用原函数 -> 执行"后置操作"。wrapper函数。示例:
deftimer(func):defwrapper(*args,**kwargs):# 前置start=time.time()# 调用原函数result=func(*args,**kwargs)# 后置print(f"耗时:{time.time()-start}")returnresultreturnwrapper@timerdefsome_task():time.sleep(1)*args和**kwargs是什么?参考回答:
它们是 Python 中处理函数可变参数的语法。
*args(Arguments):args是一个元组 (tuple)。def func(a, *args),调用func(1, 2, 3)时,a=1,args=(2, 3)。**kwargs(Keyword Arguments):kwargs是一个字典 (dict)。def func(**kwargs),调用func(name='a', age=10)时,kwargs={'name': 'a', 'age': 10}。顺序: 函数定义时,参数顺序必须是:普通参数 -> *args -> 默认参数 -> **kwargs。
__new__和__init__的区别?参考回答:
__new__: 是一个类方法,是真正创建实例的静态方法。它必须返回一个实例对象。__init__: 是一个实例方法,在实例创建好之后,负责初始化实例的属性。它不返回任何东西。__new__,后__init__。__new__创建并返回实例,这个实例作为self传给__init__。应用场景:
__init__。__new__主要用于实现一些高级功能,比如单例模式,或者继承不可变类型 (如tuple,str)。参考回答:
ClassName.__mro__或ClassName.mro()查看。示例 (菱形继承):
classA:passclassB(A):passclassC(A):passclassD(B,C):passprint(D.__mro__)# 输出: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)# 顺序是 D -> B -> C -> A参考回答:
| 特性 | 多线程 (Threading) | 多进程 (Multiprocessing) | 协程 (AsyncIO) |
|---|---|---|---|
| 优点 | 资源开销小,线程间共享内存 | 能利用多核 CPU,真正并行 | 开销极小,单线程实现高并发 |
| 缺点 | 受 GIL 限制,无法并行计算 | 资源开销大,进程间通信复杂 | 不能用阻塞代码,生态不完善 |
| 适用场景 | I/O 密集型(爬虫, Web) | CPU 密集型(计算, 视频处理) | 超高并发 I/O(Web服务器, IM) |
面试官可能会问:“请设计一个秒杀系统”。
回答思路:
decr)。系列导航: