文章目录
- 说说python中的迭代器
- 迭代器和可迭代对象的区别
- 对象能不能作为字典的key
- [有用过with statement吗?它的好处是什么?](#有用过with statement吗?它的好处是什么?)
- 说说python中`setattr`、`getattr`、`delattr`方法
- python中pass的作用
- python字典和json的区别
- yeild和return的区别
说说python中的迭代器
迭代器本质是一个可以被逐个取值的对象。迭代器特点是不一次性加载全部数据、按需返回下一个值。依赖于两个方法__iter__返回一个迭代器本身,__next__返回迭代器的下一个值。迭代器的作用:解决大数据问题(不需要一次性读取所有数据,节省内存)
认为拥有__iter__和__next函数的类就是迭代器,下面是一个自定义迭代器示例
class MyIterator:
def __init__(self, n):
self.n = n
self.current = 0
def __iter__(self):
return self
def __next__(self):
if self.current < self.n:
self.current += 1
return self.current
else:
raise StopIteration
迭代器和可迭代对象的区别
可迭代对象:只要实现了__iter__(),就是可迭代对象。本质是一个数据容器,能够被遍历的对象。特点:
- 可以使用
for遍历 - 不能直接使用
next
迭代器:同时实现了__iter()和__next()方法。本质是一个遍历工具,执行遍历的对象。特点: - 可以
next() - 可以记录当前位置
- 一次性消费,不能回溯。
对象能不能作为字典的key
只有满足一下条件的对象才能作为字典的key
- 可哈希(需要使用hash值确定位置)
- 不可变(可变会导致位置发生错乱)
常见可以作为key的对象有:
- int
- float
- str
- bool
- tuple(内部元素也要可hash)
下列是自定义一个可以作为key的对象示例
from dataclasses import dataclass
# 会自动生成__eq__和__hash__,且限制对象不可变
@dataclass(frozen=True)
class Point:
x: int
y: int
有用过with statement吗?它的好处是什么?
with语句的作用是简化"资源管理(获取 + 释放)"的语法糖,它底层依赖上下文管理器机制,例如常见一种使用方式。
with open('input.txt', 'w') as f:
f.write('Hi there!')
使用with statement的好处:
- 自动释放资源,防止资源泄漏
- 异常安全,出现异常情况,资源仍然可以释放
- 更优雅的代码实现
要使用with的条件必须实现两个方法
__enter__()__exit__()
上面示例等同于下面代码
f_obj = open('input.txt', 'w') # 创建文件对象(上下文管理器)
f = f_obj.__enter__() # 进入上下文(打开文件)
try:
f.write('Hi there!')
finally:
f_obj.__exit__(None, None, None) # 退出上下文(关闭文件)
说说python中__setattr__、__getattr__、__delattr__方法
__setattr__方法:
- 触发时机:给类设置属性时触发。
- 常见用途:
- 属性校验
- 自动转换类型
- 限制字段
__getattr__方法:
- 触发时间:获取不存在属性时调用,一般用于兜底。
- 常见用途
- 动态属性
- 兼容旧字段
- 默认值
__delattr__:
- 触发时机:删除属性时调用
- 常见用途:
- 保护关键字段。限制属性不能被删除
- 删除时记录日志
- 删除时额外清理操作(资源释放等)
python中pass的作用
占位符在编写代码时只写框架思路,具体实现还未编写就可以用 pass 进行占位,使程序不报错,不会进行任何操作。
python字典和json的区别
主要区别:
- 字典是一种数据结构(哈希表)。json是数据的一种表现形式。
- 字典的key只要能hash和不可变就行。json的键必须为字符串。
yeild和return的区别
return: 一旦执行了return语句,函数就会结束执行,并且所有局部变量变成不可访问对象,结束作用域。
yeild: 每当执行yield语句时,函数会暂停并返回一个值给调用者,会保存当前函数执行帧、局部变量和执行指针。下次调用时可以从上次暂停地方继续执行。