Python面试题.doc
《Python面试题.doc》由会员分享,可在线阅读,更多相关《Python面试题.doc(17页珍藏版)》请在咨信网上搜索。
1、一、 python语法31. 请说一下你对迭代器和生成器的区别?32. 什么是线程安全?33. 你所遵循的代码规范是什么?请举例说明其要求?44. Python中怎么简单的实现列表去重?55. python 中 yield 的用法?56. 什么是面向对象编程?57. python2和python3的区别?58. 谈谈你对GIL锁对python多线程的影响?89. python是如何进行内存管理的?8二、 Linux基础和数据结构与算法91. 10个常用的Linux命令?92. find和grep的区别?93. 什么是阻塞?什么是非阻塞?94. 描述数组、链表、队列、堆栈的区别?95. 你知道几
2、种排序,讲一讲你最熟悉的一种?9三、 Web框架101.django 中当一个用户登录 A 应用服务器(进入登录状态),然后下次请求被 nginx 代理到 B 应用服务器会出现什么影响?102.跨域请求问题django怎么解决的(原理)103.请解释或描述一下Django的架构104.django对数据查询结果排序怎么做,降序怎么做,查询大于某个字段怎么做105.说一下Django,MIDDLEWARES中间件的作用?106.你对Django的认识?107. Django重定向你是如何实现的?用的什么状态码?118.ngnix的正向代理与反向代理?119. Tornado 的核是什么?1110
3、.Django 本身提供了 runserver,为什么不能用来部署?11四、 网络编程和前端121.AJAX是什么,如何使用AJAX?122. 常见的HTTP状态码有哪些?123. Post和get区别?124.cookie 和session 的区别?135.创建一个简单tcp服务器需要的流程136.请简单说一下三次握手和四次挥手?什么是2msl?为什么要这样做?13五、 爬虫和数据库141.scrapy和scrapy-redis有什么区别?为什么选择redis数据库?142. 你用过的爬虫框架或者模块有哪些?谈谈他们的区别或者优缺点?143.你常用的mysql引擎有哪些?各引擎间有什么区别?
4、154.描述下scrapy框架运行的机制?165.什么是关联查询,有哪些?166.写爬虫是用多进程好?还是多线程好? 为什么?167.数据库的优化?168.常见的反爬虫和应对方法?169.分布式爬虫主要解决什么问题?1710.爬虫过程中验证码怎么处理?17六、 其他17主观题 答案:略.18Python4期模拟面试技术面试题答案一、 python语法1. 请说一下你对迭代器和生成器的区别? 答:(1)迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己本身。对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的。在后台for语
5、句对容器对象调用iter()函数,iter()是python的内置函数。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是python的内置函数。在没有后续元素时,next()会抛出一个StopIteration异常(2)生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用yield语句。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)区别:生成器能做到迭代器能做的所有事,而且因为自动创建了_iter_()和next()方法,生成
6、器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常2. 什么是线程安全?线程安全是在多线程的环境下,能够保证多个线程同时执行时程序依旧运行正确, 而且要保证对于共享的数据可以由多个线程存取,但是同一时刻只能有一个线程进行存取。多线程环境下解决资源竞争问题的办法是加锁来保证存取操作的唯一性。3. 你所遵循的代码规范是什么?请举例说明其要求?PEP81变量常量:大写加下划线 USER_CONSTANT私有变量: 小写和一个前导下划线 _private_valuePython
7、 中不存在私有变量一说,若是遇到需要保护的变量,使用小写和一个前导下划线。但这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。但实际上,外部类还是可以访问到这个变量。内置变量: 小写,两个前导下划线和两个后置下划线 _class_两个前导下划线会导致变量在解释期间被更名。这是为了避免内置变量和其他变量产生冲突。用户定义的变量要严格避免这种风格。以免导致混乱。2函数和方法总体而言应该使用,小写和下划线。但有些比较老的库使用的是混合大小写,即首单词小写,之后每个单词第一个字母大写,其余小写。但现在,小写和下划线已成为规范。私有方法:小写和一个前导下划线这里和私有变量一样
8、,并不是真正的私有访问权限。同时也应该注意一般函数不要使用两个前导下划线(当遇到两个前导下划线时,Python 的名称改编特性将发挥作用)。特殊方法:小写和两个前导下划线,两个后置下划线这种风格只应用于特殊函数,比如操作符重载等。函数参数: 小写和下划线,缺省值等号两边无空格3 类类总是使用驼峰格式命名,即所有单词首字母大写其余字母小写。类名应该简明,精确,并足以从中理解类所完成的工作。常见的一个方法是使用表示其类型或者特性的后缀,例如:SQLEngine,MimeTypes对于基类而言,可以使用一个 Base 或者 Abstract 前缀BaseCookie,AbstractGroup4 模
9、块和包除特殊模块 _init_ 之外,模块名称都使用不带下划线的小写字母。若是它们实现一个协议,那么通常使用lib为后缀,例如:import smtplibimportosimportsys5关于参数5.1 不要用断言来实现静态类型检测。断言可以用于检查参数,但不应仅仅是进行静态类型检测。 Python 是动态类型语言,静态类型检测违背了其设计思想。断言应该用于避免函数不被毫无意义的调用。5.2 不要滥用 *args 和 *kwargs。*args 和 *kwargs 参数可能会破坏函数的健壮性。它们使签名变得模糊,而且代码常常开始在不应该的地方构建小的参数解析器。6 其他6.1 使用 has
10、 或 is 前缀命名布尔元素is_connect=Truehas_member=False6.2 用复数形式命名序列members=user_1,user_26.3 用显式名称命名字典person_address=user_1:10roadWD,user_2:20streethuafu6.4 避免通用名称诸如 list, dict, sequence 或者 element 这样的名称应该避免。6.5 避免现有名称诸如 os, sys 这种系统已经存在的名称应该避免。7 一些数字一行列数 : PEP 8 规定为79 列。根据自己的情况,比如不要超过满屏时编辑器的显示列数。一个函数 : 不要超过3
11、0 行代码, 即可显示在一个屏幕类,可以不使用垂直游标即可看到整个函数。一个类 : 不要超过200 行代码,不要有超过10 个方法。一个模块 不要超过500 行。8 验证脚本可以安装一个 pep8 脚本用于验证你的代码风格是否符合 PEP8。4. Python中怎么简单的实现列表去重?Set5. python 中 yield 的用法?答: yield简单说来就是一个生成器,这样函数它记住上次返 回时在函数体中的位置。对生成器第 二次(或n 次)调用跳转至该函 次)调用跳转至该函 数。6. 什么是面向对象编程?面向对象编程是一种解决软件复用的设计和编程方法。 这种方法把软件系统中相近相似的操作逻
12、辑和操作 应用数据、状态,以类的型式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。7. python2和python3的区别?1.性能Py3.0运行 pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可以取得很好的优化结果。Py3.1性能比Py2.5慢15%,还有很大的提升空间。2.编码Py3.X源码文件默认使用utf-8编码3. 语法1)去除了,全部改用!=2)去除,全部改用repr()3)关键词加入as 和with,还有True,False,None4)整型除法返回浮点数,要得到整型结果,
13、请使用/5)加入nonlocal语句。使用noclocal x可以直接指派外围(非全局)变量6)去除print语句,加入print()函数实现相同的功能。同样的还有 exec语句,已经改为exec()函数7)改变了顺序操作符的行为,例如x bytes) or .decode() (bytes - str)方法相互转化。3)dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有dict.has_key(),用 in替代它吧6.面向对象1)引入抽象基类(Abstraact Base Classes,ABCs)。2)容器
14、类和迭代器类被ABCs化。3)迭代器的next()方法改名为_next_(),并增加内置函数next(),用以调用迭代器的_next_()方法4)增加了abstractmethod和 abstractproperty两个 decorator,编写抽象方法(属性)更加方便。7.异常1)所以异常都从 BaseException继承,并删除了StardardError2)去除了异常类的序列行为和.message属性3)用 raise Exception(args)代替 raise Exception, args语法4)捕获异常的语法改变,引入了as关键字来标识异常实例5)异常链,因为_context
15、_在3.0a1版本中没有实现8.模块变动1)移除了cPickle模块,可以使用pickle模块代替。最终我们将会有一个透明高效的模块。2)移除了imageop模块3)移除了 audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2,rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模块4)移除了bsddb模块(单独发布,可以从http:/www.jcea.es/programacion/pybsddb.h
16、tm获取)5)移除了new模块6)os.tmpnam()和os.tmpfile()函数被移动到tmpfile模块下7)tokenize模块现在使用bytes工作。主要的入口点不再是generate_tokens,而是 tokenize.tokenize()9.其它1)xrange() 改名为range(),要想使用range()获得一个list,必须显式调用: list(range(10)0, 1, 2, 3, 4, 5, 6, 7, 8, 92)bytes对象不能hash,也不支持 b.lower()、b.strip()和b.split()方法,但对于后两者可以使用 b.strip(bntr
17、 f)和b.split(b )来达到相同目的3)zip()、map()和filter()都返回迭代器。而apply()、 callable()、coerce()、 execfile()、reduce()和reload()函数都被去除了现在可以使用hasattr()来替换 callable(). hasattr()的语法如:hasattr(string, _name_)4)string.letters和相关的.lowercase和.uppercase被去除,请改用string.ascii_letters 等5)如果x y的不能比较,抛出TypeError异常。2.x版本是返回伪随机布尔值的6)_
18、getslice_系列成员被废弃。ai:j根据上下文转换为a._getitem_(slice(I, j)或 _setitem_和_delitem_调用7)file类被废弃8. 谈谈你对GIL锁对python多线程的影响?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定。每个CPU在同一时间只能执行一个线程(在单核CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。
19、)在Python多线程下,每个线程的执行方式:1、获取GIL2、执行代码直到sleep或者是python虚拟机将其挂起。3、释放GIL 可见,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行。在Python2.x里,GIL的释放逻辑是当前线程遇见IO操作或者ticks计数达到100(ticks可以看作是Python自身的一个计数器,专门做用于GIL,每次释放后归零,这个计数可以通过 sys.setcheckinterval 来调整),进行释放。而每次释放GIL锁,线程进行锁竞争、切换线
20、程,会消耗资源。并且由于GIL锁存在,python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行)。 IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率),所以多线程对IO密集型代码比较友好。9. python是如何进行内存管理的?一、垃圾回收:python不像C+,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值。对Python语言来讲,对象的类型和内存都是在运行时确定的。这也是为什么我们称Pyt
21、hon语言为动态类型的原因(这里我们把动态类型可以简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值)。二、引用计数:Python采用了类似Windows内核对象一样的方式来对内存进行管理。每一个对象,都维护这一个对指向该对对象的引用的计数。当变量被绑定在一个对象上的时候,该变量的引用计数就是1,(还有另外一些情况也会导致变量引用计数的增加),系统会自动维护这些标签,并定时扫描,当某标签的引用计数变为0的时候,该对就会被回收。三、内存池机制Python的内存机制以金字塔行,-1,-2层主要有操作系统进行操作,第0层是C中的malloc,free等内存分配和释放函数进行操
22、作;第1层和第2层是内存池,有Python的接口函数PyMem_Malloc函数实现,当对象小于256K时有该层直接分配内存;第3层是最上层,也就是我们对Python对象的直接操作;在 C 中如果频繁的调用 malloc 与 free 时,是会产生性能问题的.再加上频繁的分配与释放小块的内存会产生内存碎片. Python 在这里主要干的工作有:如果请求分配的内存在1256字节之间就使用自己的内存管理系统,否则直接使用 malloc.这里还是会调用 malloc 分配内存,但每次会分配一块大小为256k的大块内存.经由内存池登记的内存到最后还是会回收到内存池,并不会调用 C 的 free 释放掉
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python 试题
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。