ITPub博客

首页 > 应用开发 > IT综合 > Python面试宝典之基础篇-06

Python面试宝典之基础篇-06

原创 IT综合 作者:千锋Python唐小强 时间:2020-06-15 15:42:22 0 删除 编辑

题目26:什么是鸭子类型(duck typing)?

鸭子类型是动态类型语言判断一个对象是不是某种类型时使用的方法,也叫做鸭子判定法。简单的说,鸭子类型是指判断一只鸟是不是鸭子,我们只关心它游泳像不像鸭子、叫起来像不像鸭子、走路像不像鸭子就足够了。换言之,如果对象的行为跟我们的预期是一致的(能够接受某些消息),我们就认定它是某种类型的对象。

在Python语言中,有很多bytes-like对象(如:bytes、bytearray、array.array、memoryview)、file-like对象(如:StringIO、BytesIO、GzipFile、socket)、path-like对象(如:str、bytes),其中file-like对象都能支持read和write操作,可以像文件一样读写,这就是所谓的对象有鸭子的行为就可以判定为鸭子的判定方法。再比如Python中列表的extend方法,它需要的参数并不一定要是列表,只要是可迭代对象就没有问题。

说明:动态语言的鸭子类型使得设计模式的应用被大大简化。

题目27:说一下Python中变量的作用域。

Python中有四种作用域,分别是局部作用域( Local)、嵌套作用域( Embedded)、全局作用域( Global)、内置作用域( Built-in),搜索一个标识符时,会按照 LEGB的顺序进行搜索,如果所有的作用域中都没有找到这个标识符,就会引发NameError异常。

题目28:说一下你对闭包的理解。

闭包是支持一等函数的编程语言(Python、JavaScript等)中实现词法绑定的一种技术。当捕捉闭包的时候,它的自由变量(在函数外部定义但在函数内部使用的变量)会在捕捉时被确定,这样即便脱离了捕捉时的上下文,它也能照常运行。简单的说,可以将闭包理解为 能够读取其他函数内部变量的函数。正在情况下,函数的局部变量在函数调用结束之后就结束了生命周期,但是 闭包使得局部变量的生命周期得到了延展。使用闭包的时候需要注意,闭包会使得函数中创建的对象不会被垃圾回收,可能会导致很大的内存开销,所以 闭包一定不能滥用

题目29:说一下Python中的多线程和多进程的应用场景和优缺点。

线程是操作系统分配CPU的基本单位,进程是操作系统分配内存的基本单位。通常我们运行的程序会包含一个或多个进程,而每个进程中又包含一个或多个线程。多线程的优点在于多个线程可以共享进程的内存空间,所以进程间的通信非常容易实现;但是如果使用官方的CPython解释器,多线程受制于GIL(全局解释器锁),并不能利用CPU的多核特性,这是一个很大的问题。使用多进程可以充分利用CPU的多核特性,但是进程间通信相对比较麻烦,需要使用IPC机制(管道、套接字等)。

多线程适合那些会花费大量时间在I/O操作上,但没有太多并行计算需求且不需占用太多内存的I/O密集型应用。多进程适合执行计算密集型任务(如:视频编码解码、数据处理、科学计算等)、可以分解为多个并行子任务并能合并子任务执行结果的任务以及在内存使用方面没有任何限制且不强依赖于I/O操作的任务。

扩展:Python中实现并发编程通常有多线程、多进程和异步编程三种选择。异步编程实现了协作式并发,通过多个相互协作的子程序的用户态切换,实现对CPU的高效利用,这种方式也是非常适合I/O密集型应用的。

Python面试宝典之基础篇-06

题目30:说一下Python 2和Python 3的区别。

点评:这种问题千万不要背所谓的参考答案,说一些自己最熟悉的就足够了。

  1. Python 2中的print和exec都是关键字,在Python 3中变成了函数。
  2. Python 3中没有long类型,整数都是int类型。
  3. Python 2中的不等号<>在Python 3中被废弃,统一使用!=。
  4. Python 2中的xrange函数在Python 3中被range函数取代。
  5. Python 3对Python 2中不安全的input函数做出了改进,废弃了raw_input函数。
  6. Python 2中的file函数被Python 3中的open函数取代。
  7. Python 2中的/运算对于int类型是整除,在Python 3中要用//来做整除除法。
  8. Python 3中改进了Python 2捕获异常的代码,很明显Python 3的写法更合理。
  9. Python 3生成式中循环变量的作用域得到了更好的控制,不会影响到生成式之外的同名变量。
  10. Python 3中的round函数可以返回int或float类型,Python 2中的round函数返回float类型。
  11. Python 3的str类型是Unicode字符串,Python 2的str类型是字节串,相当于Python 3中的bytes。
  12. Python 3中的比较运算符必须比较同类对象。
  13. Python 3中定义类的都是新式类,Python 2中定义的类有新式类(显式继承自object的类)和旧式类(经典类)之分,新式类和旧式类在MRO问题上有非常显著的区别,新式类可以使用__class__属性获取自身类型,新式类可以使用__slots__魔法。
  14. Python 3对代码缩进的要求更加严格,如果混用空格和制表键会引发TabError。
  15. Python 3中字典的keys、values、items方法都不再返回list对象,而是返回view object,内置的map、filter等函数也不再返回list对象,而是返回迭代器对象。
  16. Python 3标准库中某些模块的名字跟Python 2是有区别的;而在三方库方面,有些三方库只支持Python 2,有些只能支持Python 3。


温馨提示:Python面试宝典会持续更新,从基础到项目实战的内容都会慢慢覆盖到。虽然每天只更新5个题目,但是每道题扩散出的信息量还是比较大的,希望对找工作的小伙伴所有帮助。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69923331/viewspace-2698449/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-05-14

  • 博文量
    995
  • 访问量
    584650