您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > Python面试题总结
1.Python线程池原理?我理解为线程池是一个存放很多线程的单位,同时还有一个对应的任务队列。整个执行过程其实就是使用线程池中已有有限的线程把任务队列中的任务做完。这样做的好处就是你不需要为每个任务都创建一个线程,因为当你创建第100个线程来执行第100个任务的时候,可能前面已经有50个线程结束工作了。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。因此重复利用线程来执行任务,减少系统资源的开销。2.Python合并字典,相同key的value如何相加?利用collections.Counter可轻松办到x={'apple':1,'banana':2}y={'banana':10,'pear':11}fromcollectionsimportCounterX,Y=Counter(x),Counter(y)z=dict(X+Y)z{'apple':1,'banana':12,'pear':11}另一种写法fromcollectionsimportCounterdict(Counter(x)+Counter(y))(合并两个字典的方法方法1:dictMerged1=dict(dict1.items()+dict2.items())方法2:dictMerged2=dict(dict1,**dict2)方法2等同于:dictMerged=dict1.copy()dictMerged.update(dict2)或者dictMerged=dict(dict1)dictMerged.update(dict2)3.解释GUI和GPL?GUI图形用户界面(GraphicalUserInterface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。GPL(GNU通用公共许可证)GPL同其它的自由软件许可证一样,许可社会公众享有:运行、复制软件的自由,发行传播软件的自由,获得软件源码的自由,改进软件并将自己作出的改进版本向社会发行传播的自由。4.简述爬虫的基本步骤和流程?网络爬虫的基本工作流程如下:1.首先选取一部分精心挑选的URL;2.将这些URL放入待抓取URL队列;3.从待抓取URL队列中取出待抓取在URL,(解析DNS,并且得到主机的ip,)并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。4.分析已抓取URL队列中的URL和其中的有价值的数据,将新的URL,放入待抓取URL队列,将数据存储起来,从而进入下一个循环。5.你们公司的业务中,并发能达到多少?6.如何循环抓取一个网站的1000张图片?流程大概是这样找到所有页数----遍历所有的页数----遍历当前页的所有相册(给每个相册建立一个目录)----遍历当前相册的所有图片(遍历此相册的所有页(遍历当前页的所有照片并找到图片的url))----获得图片url就存起来,然后通过图片url下载图片。----引用计数当图片下载量达到1000张时,停止爬取。7.如果对方网站可以反爬取,封ip怎么办?1、放慢抓取速度,减小对于目标网站造成的压力。但是这样会减少单位时间类的抓取量。2、第二种方法是通过设置代理IP等手段,突破反爬虫机制继续高频率抓取。但是这样需要多个稳定的代理IP。代理IP可以搜索到免费的,但是可能不太稳定,也有收费的,但是不一定划算,也可能不是长久之计。普通的基于ADSL拨号的解决办法通常,在抓取过程中遇到禁止访问,可以重新进行ADSL拨号,获取新的IP,从而可以继续抓取。但是这样在多网站多线程抓取的时候,如果某一个网站的抓取被禁止了,同时也影响到了其他网站的抓取,整体来说也会降低抓取速度。一种可能的解决办法同样也是基于ADSL拨号,不同的是,需要两台能够进行ADSL拨号的服务器,抓取过程中使用这两台服务器作为代理。假设有A、B两台可以进行ADSL拨号的服务器。爬虫程序在C服务器上运行,使用A作为代理访问外网,如果在抓取过程中遇到禁止访问的情况,立即将代理切换为B,然后将A进行重新拨号。如果再遇到禁止访问就切换为A做代理,B再拨号,如此反复。如下图:使用A为代理,B拨号:8.简述移动端app数据的抓取流程1、例如:爬取手机淘宝,核心还是一个WEB页面:、有很多资讯类的APP,核心都是一个WEB页面。直接用爬虫的方法抓就可以了。3、非WEB页面的APP,用APP自动化的一些东西试试4、不然就只有抓包了。9.是否了解Python的函数参数传递的机制?python的参数传递机制具有值传递(int、float等值数据类型)和引用传递(以字典、列表等非值对象数据类型为代表)两种基本机制以及方便的关键字传递特性(直接使用函数的形参名指定实参的传递目标,如函数定义为deff(a,b,c),那么在调用时可以采用f(b=1,c=2,a=3)的指定形参目标的传递方式,而不必拘泥于c语言之类的形参和实参按位置对应)除此之外,python中还允许包裹方式的参数传递,这未不确定参数个数和参数类型的函数调用提供了基础:deff(*a,**b)包裹参数传递的实现是在定义函数时在形参前面加上*或**,*所对应的形参(如上面的a)会被解释为一个元组(tuple,而**所对应的形参(如上面的b)会被解释为一个字典。10.是否了解*args和**kwargs的用法?当函数的参数不确定时,可以使用*args和**kwargs,*args没有key值(列表),**kwargs有key值(字典)。11.是否了解Python中的单例模式。有哪几种实现?单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。在Python中,单例模式有以下几种实现方式。方法一、实现__new__方法,然后将类的一个实例绑定到类变量_instance上;如果cls._instance为None,则说明该类还没有被实例化过,new一个该类的实例,并返回;如果cls._instance不为None,直接返回_instance,代码如下:?12345678910111213141516171819classSingleton(object):def__new__(cls,*args,**kwargs):ifnothasattr(cls,'_instance'):orig=super(Singleton,cls)cls._instance=orig.__new__(cls,*args,**kwargs)returncls._instanceclassMyClass(Singleton):a=1one=MyClass()two=MyClass()#one和two完全相同,可以用id(),==,is检测printid(one)#29097904printid(two)#29097904printone==two#Trueprintoneistwo#True方法二、本质上是方法一的升级版,使用__metaclass__(元类)的高级python用法,具体代码如下:?1234567classSingleton2(type):def__init__(cls,name,bases,dict):super(Singleton2,cls).__init__(name,bases,dict)cls._instance=Nonedef__call__(cls,*args,**kwargs):8910111213141516171819202122ifcls._instanceisNone:cls._instance=super(Singleton2,cls).__call__(*args,**kwargs)returncls._instanceclassMyClass2(object):__metaclass__=Singleton2a=1one=MyClass2()two=MyClass2()printid(one)#31495472printid(two)#31495472printone==two#Trueprintoneistwo#True方法三、使用Python的装饰器(decorator)实现单例模式,这是一种更Pythonic的方法;单利类本身的代码不是单例的,通装饰器使其单例化,代码如下:?123456defsingleton(cls,*args,**kwargs):instances={}def_singleton():ifclsnotininstances:instances[cls]=cls(*args,**kwargs)returninstances[cls]78910111213141516171819return_singleton@singletonclassMyClass3(object):a=1one=MyClass3()two=MyClass3()printid(one)#29660784printid(two)#29660784printone==two#Trueprintoneistwo#True12.是否了解Python垃圾回收机制?Python中的垃圾回收是以引用计数为主,标记-清除和分代收集为辅。引用计数最大缺陷就是循环引用的问题,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。所以Python采用了辅助方法。13.是否了解read,readline和readlines三者的区别是什么?read读取整个文件readline读取下一行readlines读取整个文件到一个迭代器以供我们遍历(读取到一个list中,以供使用,比较方便)14.是否了解Post和Get的区别是什么?(Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。)1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。(1).所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。*注意:这里安全的含义仅仅是指是非修改信息。(2).幂等的意味着对同一URL的多个请求应该返回同样的结果2.根据HTTP规范,POST表示可能修改变服务器上的资源的请求。以新闻网站为例,读者对新闻发表自己的评论应该通过POST实现,因为在评论提交后站点的资源已经不同了,或者说资源被修改了。上面大概说了一下HTTP规范中GET和POST的一些原理性的问题。但在实际的做的时候,很多人却没有按照HTTP规范去做,导致这个问题的原因有很多,比如说:1.很多人贪方便,更新资源时用了GET,因为用POST必须要到FORM(表单),这样会麻烦一点。2.对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不需要用到PUT和DELETE。3.另外一个是,早期的WebMVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计,所以导致一个比较严重的问题是传统的WebMVC框架基本上都只支持GET和POST两种HTTP方法,而不支持PUT和DELETE方法。区别:(1.GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.act
本文标题:Python面试题总结
链接地址:https://www.777doc.com/doc-4211533 .html