当前位置: 首页 > news >正文

迭代器、生成器、装饰器面试题总结

一、迭代器基础

1、什么是迭代器?

答:迭代器是可以记住遍历位置的对象,从第一个元素开始访问只能向前不能后退。对可迭代对象调用__iter__()方法会得到迭代器。

必须实现两个方法:

__iter__()

__next__()

2、可迭代对象VS迭代器?

可迭代对象:能使用for循环遍历的对象就是可迭代对象。

例如:列表、字符串、元组等实现了__ilter__(),可以拿到迭代器。

迭代器:additionally实现了__next__()。

手写一个迭代器:

class MyIterator: def __init__(self): self.number = 0 def __iter__(self): return self def __next__(self): self.number += 1 return self.number # 调用 it = MyIterator() print(it.__next__()) print(it.__next__())

运行结果:

1

2

二、生成器

1、什么是生成器?

答:生成器是懒人版的迭代器,使用yield函数返回数据,一边计算一边循环,可以节省内存。

2、yield与ruturn的区别?

答:return直接返回函数结束,yield暂定到当前位置,下次继续运行。

3、生成器的优点有哪些?

答:省内存、适合大数据/无序数据、惰性计算。

手写一个生成器

def gen(): yield 1 yield 2 yield 3 g = gen() print(next(g)) print(next(g)) print(next(g))

三、装饰器

1、什么是装饰器?

答:不修改原函数代码的基础上,动态给函数加功能,本质上是闭包。

2、装饰器的应用场景?

答:日志记录、性能分析、权限控制、缓存。

手写一个函数装饰器

import time def timer(func): def wrapper(): start = time.time() func() end = time.time() print(end - start) return wrapper @timer def test(): time.sleep(1) test()

带参数的函数装饰器

def log(name): def decorator(func): def wrapper(*args, **kwargs): print(f"{name} 执行函数") return func(*args, **kwargs) return wrapper return decorator @log("测试") def f(): print("hello")

除此之外还有类装饰器:实现__call__方法调用

功能:

(1) 添加修改类的属性或方法

(2) 拦截实例化过程

(3) 实现单例模式、日记记录、权限控制等

添加日志功能:

def log_class(cls): """类装饰器,在调用方法前后打印日志""" class Wrapper: def __init__(self, *args, **kwargs): self.wrapped = cls(*args, **kwargs) # 实例化原始类 def __getattr__(self, name): """拦截未定义的属性访问,转发给原始类""" return getattr(self.wrapped, name) def display(self): print(f"调用 {cls.__name__}.display() 前") self.wrapped.display() print(f"调用 {cls.__name__}.display() 后") return Wrapper # 返回包装后的类 @log_class class MyClass: def display(self): print("这是 MyClass 的 display 方法") obj = MyClass() obj.display()

单例模式代码如下:

class SingletonDecorator: """类装饰器,使目标类变成单例模式""" def __init__(self, cls): self.cls = cls self.instance = None def __call__(self, *args, **kwargs): """拦截实例化过程,确保只创建一个实例""" if self.instance is None: self.instance = self.cls(*args, **kwargs) return self.instance @SingletonDecorator class Database: def __init__(self): print("Database 初始化") db1 = Database() db2 = Database() print(db1 is db2) # True,说明是同一个实例

Python 提供了一些内置的装饰器,例如:

  1. @staticmethod: 将方法定义为静态方法,不需要实例化类即可调用。

  2. @classmethod: 将方法定义为类方法,第一个参数是类本身(通常命名为cls)。

  3. @property: 将方法转换为属性,使其可以像属性一样访问。

代码如下:

class MyClass: @staticmethod def static_method(): print("This is a static method.") @classmethod def class_method(cls): print(f"This is a class method of {cls.__name__}.") @property def name(self): return self._name @name.setter def name(self, value): self._name = value # 使用 MyClass.static_method() MyClass.class_method() obj = MyClass() obj.name = "Alice" print(obj.name)

以上就是总结的一些内容加深理解。

http://www.jsqmd.com/news/580028/

相关文章:

  • 2025-2026年全球空气能热水器十大品牌评测:五款口碑产品推荐评价 - 品牌推荐
  • Pixel Aurora Engine部署教程:多用户共享部署+LoRA权限分级管理方案
  • Z-Image-GGUF提示词工程:从‘樱花寺庙’到‘电影级8K杰作’的结构化编写法
  • HTML 知识点
  • NaViL-9B效果展示:低质量模糊图片中的文字识别与语义补全能力
  • 算法训练之递归(一)
  • 2025-2026年全球空气能热水器十大品牌评测:五款口碑产品推荐评价知名 - 品牌推荐
  • 避开这3个坑,你的火山引擎SFT微调效果才能翻倍
  • 终结混淆:一文分清5G的“双流”与“双通道”
  • NCM格式转换技术解析:从加密限制到音频自由的技术实现
  • LiuJuan Z-Image Generator企业实操:私有化部署规避数据外泄风险
  • 7个高效技巧:BetterJoy实现Switch手柄全场景PC适配
  • 国内顶级的SEO技术网站有哪些
  • OpenClaw性能调优:Qwen3.5-9B任务响应速度提升50%的方法
  • LeaguePrank:英雄联盟段位修改与个性化展示完全指南
  • 条款20:宁以常量引用传递替换值传递
  • 易语言网络验证系统源码(完整可编译版)|支持周/月/季/年/卡密生成
  • STM32项目展示:通过OFA模型为硬件产品实物图生成技术文档描述
  • 5分钟快速上手:智慧树自动化学习工具终极指南
  • 协议解析CPU飙升85%?从Wireshark抓包到JFR火焰图的全链路诊断闭环,立即生效!
  • OFA-VE跨域迁移应用:从SNLI-VE到中文电商图文数据集微调
  • Hunyuan-MT-7B多语翻译实战:跨境电商独立站商品页SEO多语内容批量生成
  • Phi-3-mini-4k-instruct-gguf高算力适配:CUDA加速下RTX3090显存占用仅2.1GB实测
  • bfhggjfffdggfg
  • 如何高效判断一个人的真实能力
  • 【路径规划】一种越野环境下车辆驾驶风险规避运动规划算法(Matlab代码实现)
  • 外贸人填不对形式发票,真的会被气哭...
  • 迎战2026知网新规:AIGC率怎么速降至安全线?亲测有效的“去AI味”实操指南
  • Ragflow Docker部署及问题解决方案(界面为Welcome to nginx,ragflow上传文件失败,Docker中的ragflow-cpu-1一直重启)
  • MogFace-large保姆级教学:webui.py源码结构解读与自定义修改指南