[如何优雅回答面试官的问题] 装饰器和迭代器 | Python 主题月

2,087 阅读3分钟

本文正在参加「Python主题月」,详情查看 活动链接

微信公众号搜索【程序媛小庄】,Rest cannot be enjoyed by lazy people.~

前情提要:小庄去面试,面了两个基础问题之后觉得回答的不错,因为面试官临时有事(好像是去改bug~~),改为今天继续面试,来瞅瞅python基础又问了些啥问题吧?

面试官大佬:小伙子,上次不好意思呀,咱们今天继续聊好吧。

小庄:没事没事(我挺闲~),您继续问...

面试官大佬:我看你简历上写了闭包函数,你说说什么是闭包函数?

小庄:官方一点的说法是,闭函数指的是在一个函数内部的函数,即嵌套在函数内部的函数,而包函数指的是内部函数对外层函数(非全局作用域)名字的引用,闭包函数基于函数对象,可以将函数返回到任意位置调用,但是作用域的关系在定义函数的时候就被确定了,与函数的调用位置无关。如果内嵌函数包含对外部函数作用域中名字的引用,这个内嵌函数就是一个闭包函数。闭包函数有两方面的作用,一个是为函数传参,另外装饰器也是基于闭包函数的。

面试官大佬:既然你提到了装饰器,那你就谈谈对装饰器的理解?

小庄:装饰器是软件设计的一种模式,可以在不修改被装饰对象源代码以及调用方式的前提下为被装饰对象添加新的功能,通俗的说就是为某一个功能增加额外的功能。装饰器的原理是基于闭包函数的,将被装饰的对象当做参数传给装饰器,再将返回值再赋值给与被装饰对象相同的变量名,就是一个偷梁换柱的操作。

面试官大佬:嗯,基本没什么问题。那你能说一下可迭代对象和迭代器对象吗?

小庄:但凡内置方法中有__iter__方法的对象就是可迭代对象,内置方法中有__iter__,__next__方法的对象就是迭代器对象,可迭代对象通过调用__iter__方法就可以得到迭代器对象。

面试官大佬:那你知道for循环的工作原理吗?

小庄:能够被for循环循环的对象一定是可迭代对象,for循环的工作原理就是利用了可迭代对象和可迭代器对象,当使用for循环的时候,首先会调用可迭代对象的内置方法__iter__得到迭代器对象,然后再调用迭代器对象中的__next__方法获取迭代器中的下一个值,重复循环上一步直到捕捉异常终止循环。

面试官大佬:生成器你了解过吗?

小庄:生成器是实现迭代器机制的一种方式,生成器分为两种模式,分别是函数生成器和表达式生成器,函数生成器就是将普通函数的return语句换成yield语句,yield可以用于返回值,但不同于return,函数一旦遇到return就结束了,而yield可以保存函数的运行状态挂起函数,用来多次返回值。而表达式生成器就是比如s = (i for i in range(10)) 得到的就是一个生成器。

面试官大佬:小伙子不错,今天有点晚了,还有点python基础部分下次再和你聊聊,我先去吃饭了~~

小庄:...好的,您慢走~

image.png