高频面试题之Python三大器
Python三大器之首-- 装饰器
从三大器面试频率来讲, 问的最多的当属装饰器, 究其原因是装饰器在开发场景中明面上使用的非常多导致的, 我们遇到这个问题一般从以下几点入手:
- 1.什么是闭包?
- 2.什么是装饰器?
- 3.装饰器的作用是什么?
- 4.你的项目中哪些地方使用了装饰器?
1. 什么是闭包
闭包(closure) 就是: 外部函数中定义一个内部函数,内部函数引用外部函数中的变量,外部函数的返回值是内部函数闭包(closure) 的作用: 1) 内部函数可以操作函数外部变量 2) 让函数内部的变量始终保存在内存中
闭包(closure) 注意事项: 1) 增加内存消耗不能滥用 2) 闭包无法改变外部函数局部变量的内存地址
2. 什么是装饰器 ?
装饰器(decorator): 将 闭包的参数类型改成函数传入 就是装饰器了
3. 装饰器的作用
装饰器(decorator)的作用: 可以在 不修改函数 原有功能代码的情况下添加额外的功能, 方便功能扩展!
4. 你的项目中哪些地方使用了装饰器 ?
# 1. 判断是否登录的功能
# 2. 功能转换器: 数据格式转换功能, 计算功能, timer装饰器等
# 3. 封装好的装饰器: @property, @classmethod, @click, @dispatch等
Python三大器之--生成器
作为在能够解决海量数据操作的内存问题的生成器一定是必考题之一哦, generator一般问题如下:
- 1.什么是生成器 ?
- 2.生成器的作用
- 3.生成器的原理
什么是生成器?
- 将列表推导式的中括号[] 改为 () 就是最简单的生成器generator
- 凡是函数中 带 yield关键字的函数, 返回值就是生成器generator
生成器的作用
- 处理海量数据的同时节省内存消耗, 生成器每次只返回一个结果, 然后再继续返回.... 依次类推, 不至于一次性返回海量数据造成内存消耗过大的问题
- 在一些功能里面使用yield可以简化代码, 方便阅读
生成器的原理
生成器generator 之所以能够调用一个生成一个, 得益于内部的___next__
,__iter__
函数, 当然使用python的内置函数next() 也可以获取生成器内部的数据, 但是一般我们很少会主动使用__netx__
函数和next()针对generator进行操作, 使用for循环遍历使用的方式居多, 至于其他原理爱好者通过解释器啦, 栈了, 堆了层面解释generator的原理这里不做过多描述!
Python三大器之--迭代器
在开发中经常可以遇到很多容器对象, 一次性遍历使用的时候需要消耗大量的资源, 如果将他们转换成迭代器那么就可以节省资源咯, 以下3点是需要明确的:
- 1.什么是迭代器?
- 2.迭代器内部实现
- 3.迭代器和生成器之间的关系
什么是迭代器?
迭代器(iterator): 就是能够循环遍历, 又可以记住遍历位置的对象! 在遍历的时候不会一次性全部取出, 等到需要用的时候才生成被遍历出去!
iterator_demo = iter([1,2,3])
print(type(iterator_date))
-- <class 'list_iterator'>
迭代器内部实现
迭代器(iterator): 内部实现了__iter__
和__next__
函数,__iter__
函数会返回对象本身,__next__
函数负责元素数据迭代操作.内置函数 iter() 可以将迭代对象转换成迭代器, 内置函数next() 也可以迭代数据
迭代器和生成器之间的关系
想必大家从上认真看到了这里会发现无论是迭代器还是生成器都实现了__iter__
和__next__
函数, So 生成器本质还是个迭代器, 生成器的区别在于在迭代数据的时候是 被动生成的, 每次被调用一次才生成一次!这是其他的迭代器没有的特征! 延迟计算节省了内存!
小结
本文主要是应对常用的三大器进行了阐述, 至于更底层面的代码不建议深究!