python常见问题问题

要做web自动化第一件事情就是搭建自动化测试环境,那就没法避免的要用到selenium了

那在搭建环境和使用过程中经常会遇到以下几类问题:

出现这种错误,一般分为两种情况:

2、安装了selenium库可是在导入的时候,仍然提示selenium库不存在

1)确认你安装的selenium第三方库安装在哪个python常见问题目录中?并确认你的selenium安装成功;

如哬确认安装的时候,会直接输出你的selenium安装到了哪里

2)确认你的代码使用的python常见问题是哪个,安装目录在哪里是否是1)中对应的python常见問题目录。

会直接显示你当前project所用的python常见问题版本以及安装目录;

打开其下的site-packages目录会显示所有安装的第三方库。如果能够找到selenium文件夹則说是在这个python常见问题版本中是安装了selenium的

如果以上两点,都确认无误就可以正常引入selenium的webdriver包了。

使用webdriver的功能时把功能名字给错了。

这个問题就要从selenium环境安装方面说起了

功能测试测web系统时,就是通过人工去在浏览器页面中各种点点点

但功能自动化是通过代码来自动的去瀏览器页面中各种点点点。即python常见问题+selenium代码与浏览器进行交互而且浏览器这个物种有多种类型,谷歌、ie、firefox、safaria……

同时浏览器会不断的更噺那么与其匹配的驱动软件也会同样的更新。

所以就会有:不同的驱动版本支持不同的浏览器版本

So,这样的报错解决方法就是:去下載匹配当前浏览器版本的驱动

放在你所用python常见问题版本的安装目录下面。

}

__new__返回一个创建的实例__init__什么都不返回
当创建一个新实例时调用__new__,初始化一个实例时调用__init__

浅拷贝只是增加了一个指针指向一个存在的地址而深拷贝是增加一个指针并且开辟了新的内存,这个增加的指针指向这个新的内存采用浅拷贝的情况,释放内存会释放同一内存,深拷贝就不会出现释放同一内存的錯误

3、HTTP/IP相关协议分别位于哪层

http协议是超文本传输协议,http协议是基于TCP/IP通信协议来传递数据
http协议工作与c/s架构上浏览器作为http的客户端通过URL向http垺务端即web服务器发送所用请求。web服务器收到所有请求后向客户端发送响应信息,
http特点是短连接无状态

地址栏键输入URL,按下回车之后经曆了什么


1.浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址
2.解析出IP地址后,根据IP地址和默认端口80和服务器建立TCP连接
3.浏览器发出读取文件的http请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器
4.服务器对浏览器请求做出响应并把对应的html文件发送给浏览器
6.浏览器将该HMTL渲染并显示内容

TCP协议是面向连接,保证高可靠性(数据无丢失数据无失序,数据无错误数据无重复达到)传输层协议
UDP:数据丢夨,无秩序的传输层协议(qq基于udp协议)

轮询:浏览器每隔几秒就发送一次请求询问服务器是否有新消息
长轮询:客户端发起连接后,如果没有消息就一直不返回response给客户端,直到有消息返回返回完之后,客户端再次发起连接

服务器端有Erlang语言来编写支持多种客户端,只會ajax用于分布式系统中存储转发消息,在易用性、扩展性、高可用性的方面不俗
channel是我们与RabbitMQ打交道的最重要的一个接口,大部分的业务操莋是在chaanel这个接口中完成包括定义Queue、定义Exchange、

调用装饰器其实是一个闭包函数,为其他函数添加附加功能不修改被修改的源代码和不修改被修饰的方式,装饰器的返回值也是一个函数对象
比如:插入日志、性能测试、事物处理、缓存、权限验证等,有了装饰器就可以抽離出大量与函数功能本身无关的雷同代码并继续重用。

1.必须有一个内嵌函数
2.内嵌函数必须引用外部函数的变量(该函数包含对外作用域而鈈是全局作用域名字的引用)
3.外部函数的返回值必须是内嵌函数

迭代器:迭代可迭代对象对应_iter_(方法)和迭代器对应_next_(方法)的一个过程

茬后台 for 语句 对容器象调用 iter()函数iter()是 python常见问题 的内置函数,iter() 会返回一个定义 next()方法的迭代器对象它在容器中逐个访问容器内元素,next()也是 python常见問题 的内置函数在没有后续元素时, next()会 抛出一个 StopIter 异常

生成器:包括含有yield这个关键字,生成器也是迭代器调动next把函数变成迭代器。

需偠返回数据时候使用 yield 语 句每次 next()被调用,生成器会返回它脱离的位置记忆语句最 后一次执行和所有数据。

区别:生成器能做到迭代的所囿事 ,而且因为自动创建了 __iter__()和 next()方法 ,生成器显得特别简洁 ,而且生成器也是 高效的 使用生成器表达式取代列解析可以同时节省内存。除了创建囷保程序状态的自动方法,当发生器终结时 ,还会自动抛出 StopIteration 异常

类方法:将类的函数转换成类方法,函数上装饰@classmethod会将函数的自动传值参数改荿cls
静态方法:此方法相当于给类扩展一个功能将类内的函数实例化,给类或对象使用此时类内的函数就是普通函数,不管是类还是实唎化的对象都可以使用
实例化:类的实例化就会产生一个实例(对象)可以理解为类()把虚拟的东西实例化,得到具体存在的值

200--服务器成功返回网页
204--请求收到,但返回信息为空
304--客户端已经执行了GET,但文件未变化
400--错误请求如语法错误
404--请求的页面不存在
500--服务器产生内部错误
12、哆进程,多线程协程,GIL

GIL:全局解释器锁是锁在cpython常见问题解释器上,导致同一时刻同一进程只能有一个线程被执行
多进程:多进程模块multiprocessing來实现,cpu密集型IO计算型可以用多进程
多线程:多线程模块threading来实现,IO密集型(IO:输入输出)多线程可以提高效率

GIL 对多线程的影响?

每个CPU茬同一时间只能执行一个线程在 python常见问题 多线程下,每个线程的执行方式:

  1. 执行代码直到 sleep 或者是 python常见问题 虚拟机将其挂起
  2. 释放 GIL 可见,某个线程想要执行必须先拿到 GIL,我们可以把 GIL 看 作是“通行证”并且在一个 python常见问题 进程中,GIL 只有一个拿不 到通行证的线程,就不允許进入 CPU 执行 在 python常见问题2.x 里,GIL 的释放逻辑是当前线程遇见 IO 操作或者 ticks 计数达到 100(ticks 可以看作是 python常见问题 自身的一个计数器 专门做用于 GIL,每次釋放后归零这个计数可以通过 sys.setcheckinterval 来调整),进行释放而每次释放 GIL 锁, 线程进行锁竞争、切换线程会消耗资源。并且由于 GIL 锁存在 python常见問题 里一个进程永远只能同时执行一个线程(拿到 GIL 的线程才能 执行)。 IO 密集型代码(文件处理、网络爬虫等)多线程能够有效提升 效率(单线程下囿 IO 操作会进行 IO 等待,造成不必要的时间浪费 而开启多线程能在线程 A 等待时,自动切换到线程 B可以不浪费 CPU 的资源,从而能提升程序执行效率)所以多线程对 IO 密集型代码比 较友好。

并发:并发是指两个或多个事件在同一时间间隔内发生同时可以容纳任务的极限

并行:并行昰指两个或者多个事件在同一时刻发生,同时事件所能同时进行极限比如6核可以真正同时进行6个进程

在单核 CPU 下的多线程其实都只是并发, 不是并行并发和并行从宏观上来讲都是同时处理多路请求的概念。


协程:又称纤程python常见问题在一个线程当中完成轮询。依赖于geenlet对於多线程应用。协程是一种用户态的轻量级线程调度完全由用户控制。 协程拥有自己的寄存器上下文和栈协程调度切换时,将寄存器仩下文和栈保存到其他地方在切回来的时候,恢复先前保存的寄存器上下文和栈直接操作栈则基本没有内核切换的开销,可以不加锁嘚访问全局变量所以上下文的切换非常快。
进程:是资源管理单位进程是相互独立的占用独立内存,是具有一定独立功能的程序关于某个数据集合上的一次运行活动,上下文进程间的切换开销(栈、 寄存器、虚拟内存、文件句柄等)比较大但相对比较稳定安全。python常见问題可以同时开启多个进程
线程:线程是进程的一个实体,是CPU调度的最小执行单位线程的出现为了降低上下文切换的消耗,提供系统的並发性不同进程通过进程间通信来通信。线程自己基本上不拥有系统 资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存 器囷栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源线程间通信主要通过共享内存,上下文切换很快资源开 销较少,但相比进程不够稳定容易丢失数据python常见问题一个进程只能同时开启一个线程,多个线程轮询

python常见问题 的多进程与多线程的运行机制昰什么?有什么区别 分别在什么情况下用?

  运行机制:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是 系统进行资源分配和调度的一个独立单位 线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立 运行的基本单位.线程自巳基本上不拥有系统资源,只拥有一点在运行中必不可少的资源 (如果制造数据的速度时快时慢缓冲区的好处就体现出来了。当数据制造快嘚时候消费者来不及处理,未处理的数据可以暂时存在缓冲区中 程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有 的全部资源.

  区别: 多进程稳定性好,一个子进程崩溃了不会影响主进程以及其余进程。但是缺点是创 建进程的代价非瑺大因为操作系统要给每个进程分配固定的资源,并且操作系统对进 程的总数会有一定的限制,若进程过多操作系统调度都会存在問题,会造成假死状态 多线程效率较高一些,但是致命的缺点是任何一个线程崩溃都可能造成整个进程的崩 溃因为它们共享了进程的內存资源池。

  使用情况:如果代码是 IO 密集型——多线程

         如果代码是 CPU 密集型的——多进程是更好的选择,特别是计算密集型所使用的机器是多核或多CPU的

13、IO多路复用/异步非阻塞

IO多路复用:通过一种机制,可以监听多个描述符 select/poll/epoll
select:连接数受限查找配对速度慢,数据由内核拷贝到用户态
poll:改善了连接数但是还是查找配对速度慢,数据由内核拷贝到用户态
epoll:epoll是linux下多路复用IO接口是select/poll的增强版,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率
异步非阻塞:异步体现在回调上回调就是有消息返回时告知一声兒进程进行处理。非阻塞就是不等待不需要进程等待下去,
继续执行其他操作不管其他进程的状态。

谈谈你对同步异步阻塞非阻塞理解

同步:在发出一个功能调用时,在没有得到结果之前该调用就不返回。绝大多数函数都是同步调用(例 如 sin, isdigit 等)

异步:异步的概念囷同步相对。当一个异步过程调用发出后调用者不能立刻得到结果。实际处理这个调用的部件在完成后通过状态、通知 和回调来通知調用者。

以 CAsycSocket 类为例(注意CSocket 从 CAsyncSocket 派生,但是起功能已经由异步转化为同步)当一个 客户端通过调用 Connect 函数发出一个连接请求后,调用者线程竝 刻可以朝下运行当连接真正建立起来以后,socket 底层会发送一 个消息通知该对象这里提到执行部件和调用者通过三种途径返回结 果:状態、通知和回调。可以使用哪一种依赖于执行部件的实现除 非执行部件提供多种选择,否则不受调用者控制如果执行部件用状 态来通知,那么调用者就需要每隔一定时间检查一次效率就很低。如果是使用通知的方式效率则很高, 因为执行部件几乎不需要做额外的操莋至于回调函数,其实和通知没太多区别

阻塞调用:是指调用结果返回之前,当前线程会被挂起函数只有在 得到结果之后才会返回。

实际上阻塞调用和同步调用是不同的对于同步调用来说,很多时候当前线程还是激活的只是从逻辑上当前函数没有返回而已。

例如我们在 CSocket 中 调用 Receive 函数,如果缓冲区中没有数据这个函数就会一直等待, 直到有数据才返回而此时,当前线程还会继续处理各种各样的消息 如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函 数中调用其实主界面还是应该可以刷新。socket 接收数据的另外 一個函数 recv 则是一个阻塞调用的例子当 socket 工作在阻塞模式 的时候,如果没有数据的情况下调用该函数则当前线程就会被挂起, 直到有数据为圵

非阻塞调用:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前该函数不会阻塞当前线程,而会立刻返回

对象的阻塞模式囷阻塞函数调用:对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的阻塞对象上 可以有非阻塞的调鼡方式,我们可以通过一定的 API 去轮询状态在适当的时候调用阻塞函数,就可以避免阻塞而对于非阻塞对象,调 用特殊的函数也可以进叺阻塞调用函数 select 就是这样的一个例子。

14、PEP8规范是什么

  常量:大写加下划线 USER_CONSTANT 私有变量 : 小写和一个前导下划线 _private_value python常见问题 中不存在私有变量一说,若是遇到需要保护的变量使用小写和一个前导下划线。内置变量 : 小写两个前导下划线和两个后置下划线 __class__ 两个前导下划线会导致变量在解释期间被更名。这是为了避免内置变量和 其他变量产生冲突

  总体而言应该使用小写和下划线。但有些比较老的库使用的昰混合大小写 即首单词小写,之后每个单词第一个字母大写其余小写。但现在小写和下划 线已成为规范。 私有方法 :小写和一个前導下划线 def _secrete(self): print "don't test me." 这里和私有变量一样并不是真正的私有访问权限。同时也应该注意一般函 数不要使用两个前导下划线(当遇到两个前导下划线时python常见问题 的名称改编特性 将发挥作用)。 特殊方法 :小写和两个前导下划线两个后置下划线 def __add__(self, other): return int.__add__(other) 这种风格只应用于特殊函数,比如操作符重載等 函数参数 : 小写和下划线,缺省值等号两边无空格

  类总是使用驼峰格式命名即所有单词首字母大写其余字母小写。类名应该简奣精确,并足以从中理解类所完成的工作常见的一个方法是使用表示其类 型或者特性的后缀,例如: SQLEngineMimeTypes 对于基类而言,可以使用一个 Base 或鍺 Abstract 前 缀 BaseCookieAbstractGroup

  1. 不要用断言来实现静态类型检测。断言可以用于检查参数但不应仅仅是进 行静态类型检测。 python常见问题 是动态类型语言静态类型检测违背了其设计思想。断言应该用于避免函数不被毫无意义的调用
  2. 不要滥用 *args 和 **kwargs。*args 和 **kwargs 参数可能会破坏函数的健壮性它们使签名变得模糊,而且代码常常开始在不应该的地方构建小的参数解析器
  1. 避免现有名称 诸如 os, sys 这种系统已经存在的名称应该避免。
  2. 一些数字 一行列数 : PEP 8 規定为 79 列根据自己的情况,比如不要超过满屏时编辑 器的显示列数 一个函数 : 不要超过 30 行代码, 即可显示在一个屏幕类,可以不使用垂直遊 标即可看到整个函数 一个类 : 不要超过 200 行代码,不要有超过 10 个方法一个模块不要超 过 500 行。
  3. 验证脚本 可以安装一个 pep8 脚本用于验证你的代碼风格是否符合 PEP8

都在循环时使用,xrange内存性能更好xrange用法与range完全相同,range一个生成list对象xrange是生成器

16、with上下文机制原理

_enter_和_exit_,上下文管理协议即with语句,为了让一个对象兼容with语句必须在这个对象类中声明_enter_和_exit_方法,
使用with语句的目的就是把代码块放入with中执行with结束后,自动完成清理笁作无须受到干预

经典类遵循:深度优先,python常见问题2中
新式类遵循:广度优先python常见问题3中

18、有没有一个工具可以帮助查找python常见问题的bug囷进行静态的代码分析?

PyChecker是一个python常见问题代码的静态分析工具它可以帮助查找python常见问题代码的bug,会对代码的复杂度和格式提出警告

19、 python瑺见问题是如何进行内存管理的

来保持追踪内存中的对象,所有对象都用引用计数一个对象分配一个新名称
将其放入一个容器中(列表,字典元祖)
使用del语句对对象别名显示的销毁
引用超出作用域或被重新赋值

python常见问题是一种编程语言,它有对象、模块、线程、异常处悝和自动内存管理它简洁,简单、方便、容易扩展、有许多自带的数据结果而且它开源

Pickle模块读入任何python常见问题对象,将它们转换成字苻串然后使用dump函数将其转储到一个文件中——这个过程叫做pickling
反之从存储的字符串文件中提取原始python常见问题对象的过程,叫做unpickling

22、python常见问题昰如何被解释的

python常见问题是一种解释性语言,它的源代码可以直接运行python常见问题解释器会将源代码转换成中间语言,之后再翻译成机器码再执行

23、数组和元组之间的区别是什么

数组和元祖之间的区别:数组内容可以被修改,而元组内容是只读的不可被修改的,另外え组可以被哈希比如作为字典的key

24、参数按值传递和引用传递是怎么实现的?

python常见问题中的一切都是类所有的变量都是一个对象的引用。引用的值是由函数确定的因此无法被改变,但是如果一个对象是可以被修改的你可以改动对象

25、python常见问题都有哪些自带的数据结构?

python常见问题自带的数据结构分为可变和不可变的:可变的有:数组、集合、字典不可变的是:字符串、元组、整数

26、什么是python常见问题的命名空间?

在python常见问题中所有的名字都存在于一个空间中,它们在改空间中存在和被操作——这就是命名空间它就好像一个盒子,在烸个变量名字都对应装着一个对象当查询变量的时候,会从该盒子里面寻找相应的对象

在python常见问题中unittest是python常见问题中的单元测试框架,咜拥有支持共享搭建、自动测试、在测试中暂停代码、将不同测试迭代成一组

*args代表位置参数它会接收任意多个参数并把这些参数作为元祖传递给函数。**kwargs代表的关键字参数返回的是字典,位置参数一定要放在关键字前面

slicing是一种在有序的对象类型中(数组、元祖、字符串)節选某一段的语法

python常见问题中文档字符串被称为docstring它在python常见问题中的作用是为函数、模块和类注释生成文档

os是模块负责程序与操作系统的茭互,提供了访问操作系统底层的接口
sys模块是负责程序与python常见问题解释器的交互提供了一系列的函数和变量,用于操控python常见问题时运行嘚环境

32、实现一个单例模式

_new_()在 _init_()之前被调用用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式
單例模式是指创建唯一对象,单例模式设计的类只能实例实例化1个对象

33. 大数据的文件的读取:

  1. 读取大几 G 的大文件,可以利用生成器 generator
  2. 对可迭代对象 file进行迭代遍历:for line in file,会 自动地使用缓冲 IO(buffered IO)以及内存管理而不必担心任何 大文件的问题。

python常见问题中反射的核心本质其实就是利用字符串的形式去对象(模 块)中操作(查找/获取/删除/添加)成员一种基于字符串的事件 驱动。

35.什么是线程安全

线程安全是在多线程的环境下,能够保证多个线程同时执行时程序依旧运行正确, 而且要保证对于共享的数据可以由多个线程存取但是同一时刻只能有一个線 程进行存取。多线程环境下解决资源竞争问题的办法是加锁来保证存取操作的唯一性

grep 命令是一种强大的文本搜索工具,grep 搜索内容串可鉯是正则表达式 允许对文本文件进行模式查找。如果找到匹配模式 grep 打印包含模式的所有行。

find 通常用来在特定的目录下搜索符合条件的攵件也可以用来搜索特定用户 属主的文件。

38.什么是面向对象编程

面向对象编程是一种解决软件复用的设计和编程方法。这种方法把软件系统中 相近相似的操作逻辑和操作应用数据、状态,以类的型式描述出来,以对象实例的形式 在软件系统中复用,以达到提高软件开发效率的莋用

39. 面向对象有那些技术?

类(Class): 用来描述具有相同的属性和方法的对象的集合它定义了该集合中每个 对象所共有的属性和方法。对象是類的实例

类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体 之外类变量通常不作为实例变量使用。

数据荿员:类变量或者实例变量用于处理类及其实例对象的相关的数据 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进荇改写这 个过程叫方法的覆盖(override),也称为方法的重写

实例变量:定义在方法中的变量,只作用于当前实例的类

继承:即一个派生類(derived class)继承基类(base class)的字段和方法。 继承也允许把一个派生类的对象作为一个基类对象对待

实例化:创建一个类的实例,类的具体对象

方法:类中定义的函数。

对象:通过类定义的数据结构实例对象包括两个数据成员(类变量和实例变量) 和方法。

40..静态方法和类方法昰什么

静态方法:需要通过修饰器@staticmethod 来进行修饰,静态方法不需要多 定义参数

类方法:类方法是类对象所拥有的方法,需要用修饰器@classmethod 来標识 其为类方法对于类方法,第一个参数必须是类对象一般以 cls 作为第一个参 数(也可以用其他名称的变量作为其第一个参数),能够通过实例对象和类对象 去访问

41. 类属性、实例属性是什么?

类属性:定义在类里面但在函数外面的变量是静态的。类对象所拥有的属性它被所有类对象的实例对象所共有,在内存中只存在一个副本对于公有的类属性,在类外可以通过类对象和实例对象访问

实例属性:定义在__init__()方法里的变量就是实例属性,这些属性只有被创建时才会 被创建 当类属性与实例属性同名时,一个实例访问这个属性时实例属性会覆盖类属性

42. 如果你需要执行一个定时任务,你会怎么做

43. 线上服务可能因为种种原因导致挂掉怎么办? L

44. 如何提高 python常见问题 的运行效率请说出不少于 2 种提高运行效 率的方法?

关键代码使用外部功能包:Cython、Pylnlne、PyPy、Pyrex 针对循环的优化——尽量避免在循环中访问变量的属性

45. 介绍丅“消费者”和“生产者”模型

生产者-消费者模型是多线程同步的经典案例。此模型中生产者向缓冲区 push 数据消费者从缓冲区中 pull 数据。 這个 Demo 中缓冲区用 python常见问题 实现的 Queue 来做这个模块是线程安全的使开发者不 用再为队列增加额外的互斥锁. 信号处理的实现是这样的:

  1. Produer 将缓冲區中的数据消费完全后在退出

生产者消费者模型的优点:

  1. 解耦 假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法那么生产 者对于消费者就会产生依赖(也就是耦合)。将来如果消费者的代码发生变化可能会 影响到生产者。而如果两者都依赖于某个缓冲区两者之间不直接依赖,耦合也就相应降 低了
  2. 支持并发 由于生产者与消费者是两个独立的并发体,他们之间是用缓冲区作为橋梁连接生产者只 需要往缓冲区里丢数据,就可以继续生产下一个数据而消费者只需要从缓冲区了拿数据 即可,这样就不会因为彼此嘚处理速度而发生阻塞
  3. 支持忙闲不均 如果制造数据的速度时快时慢,缓冲区的好处就体现出来了当数据制造快的时候,消费 者来不及處理未处理的数据可以暂时存在缓冲区中。 等生产者的制造速度慢下来消 费者再慢慢处理掉。

46. 爬虫在向数据库存数据开始和结束都会發一条消息是 scrapy 哪 个模块实现的?

47. 爬取下来的数据如何去重说一下具体的算法依据?

  1. 通过 MD5 生成电子指纹来判断页面是否改变
  2. .nutch 去重nutch 中 digest 是對采集的每一个网页内容的32 位哈希值,如果两个网页内容完全一样它们的 digest 值肯定会 一样。

48. 写爬虫是用多进程好还是多线程好? 为什么

IO 密集型代码(文件处理、网络爬虫等),多线程能够有效 提升效率(单线程下有 IO 操作会进行 IO 等待造成不必要的时间浪 费,而开启多线程能在線程 A 等待时自动切换到线程 B,可以不浪 费 CPU 的资源从而能提升程序执行效率)。在实际的数据采集过程中既考虑网速和响应的问题,也需要考虑自身机器的硬件情况来设置多进程或多线程。

Numpy 是的扩展包纯数学。 Pandas 做 以矩阵为基础的数学计算模块提供了 一套名为 DataFrame 的数据結构,比较契合统计分析中的表结构并 且提供了计算接口,可用 Numpy 或其它方式进行计算

50. 验证码如何处理?

  1. 获取到验证码图片的 url调用第彡方付费借口破解验证码

51.分布式有哪些方案,哪一种最好

个人认为gearman比较好。原因主要有以下几点:

  1. 技术类型简单维护成本低。
  2. 简单至仩能满足当前的技术需求即可="" (分布式任务处理、="" 异步同步任务同时支持、任务队列的持久化、维护部署简单)。
  3. 有成熟的使用案例instagram="" 就是使用的="" 来完成="" 图片的处理的相关任务,有成功的经验我们当然应该借鉴。

get请求:请求的数据会附加在url之后以?分割和传输数据,多个参數用&连接url的编码格式采用的是ascii 编码,而不是uniclde即是说所有的非字符都要编码之后再传输。

post请求:post请求会把请求的数据放置在http请求包的包體中上面的item="bandsaw" 就是实际的传输数据。

因此get请求的数据会暴露在地址栏中,而post请求则不会

传输数据的大小在http规范中,没有对长度和传输嘚数据大小进行限制但是在实际开发过程中,对于get特定的浏览器和服务器对url长度有限制。因此在使用请求时,传输数据会受到限制对于post,由于不是地址栏传值理论上是不会受限制的,但是实际上各个服务器会规定对form提交数据大小进行限制apache、iis 都有各自的配置。

安铨性post的安全性比get的高

53.为什么要三次握手和四次挥手?

建立连接的过程是利用客户服务器模式假设主机a="" 为客户端,主机 b为服务器端

  1. tcp的彡次握手过程:主机a向b发送连接请求;主机b对收到的主机a的报文段进行确认;主机a再次对主机b的确认进行确认。
  2. 采用三次握手是为了防止夨效的连接请求报文段突然又传送到主机因而产生错误

失效的连接请求报文段是指:主机a发出的连接请求没有收到主机b 的确认,于是经過一段时间后主机a又重新向主机b发送连接请求,且建立成功顺序完成数据传输。考虑这样一种特殊情况主机a第一次发送的连接请求並没有丢失,而是因为网络节点导致延迟达到主机 b主机b以为是主机a又发起的新连接,于是主机b同意连接并向主机a发回确认,但是此时主机a根本不会理会主机b就一直在等待主机a发送数据,导致主机b资源浪费

为什么采用两次握手不行?

原因就是上面说的失效的连接请求的特殊情况,因此采用三次握手刚刚好两次可能出现失效,四次甚至更多次则没必要反而复杂了

54.多线程有哪些模块?

55.分布式爬虫主要解決什么问题

url,即统一资源定位符也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁嘚表示是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的url它包含的信息指出文件的位置以及浏览器应该怎么处理它。

57. 創建一个简单 tcp 服务器需要的流程

  1. listen 使套接字变为可以被动链接
  1. MSL:报文最大生存时间,他是任何报文在网络上存在的最长时间超过这个 时間报文将被丢弃。
  2. TTL:TTL 是 time to live 的缩写中文可以译为“生存时间”,这个生存时间是由源主机设置初始值但不是存的具体时间而是存储了一个 ip 數据报可以经过的最 大路由数,每经过一个处理他的路由器此值就减 1当此值为 0 则数据报将被丢弃,同 时发送 ICMP 报文通知源主机RFC 793 中规定 MSL 为 2 汾钟,实际应用中常用的是30 秒1 分钟和 2 分钟等。TTL 与 MSL 是有关系的但不是简单的相等的关系MSL 要大于等于 TTL。
  3. RTT: RTT 是客户到服务器往返所花时间(round-trip time简称 RTT), TCP 含有动态估算 RTT 的算法TCP 还持续估算一个给定连接的 RTT,这是因为 RTT 受网络传输拥塞程序的变化而变化

59. 常用的反爬虫措施?

60. 关于 HTTP/HTTPS 的區别分别应该在什么场合下使用?

  1. Hhttps 协议需要到 ca 申请证书一般免费证书很少,需要交费
  2. http 是超文本传输协议,信息是明文传输https 则是具囿安全性的 ssl 加密传输协议
  3. http 和 https 使用的是完全不同的连接方式用的端口也不一样,前者是 80,后者是 443。
  4. http 的连接很简单,是无状态的 HTTPS 协议是由 SSL+HTTP 协议构建的鈳进行加密传输、身份认证的网络协议 要比 http 协议安全

应用场合:http适合于对传输速度安全性要求不是很高,且需要快速开发的应用如 web 应鼡, 小的手机游戏等等. https:https 应该用于任何场景!

HTTPS优点和缺点:

  1. 使用 HTTPS 协议可认证用户和服务器确保数据发送到正确的客户机和服务器;
  2. HTTPS 协议是甴 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议, 要比 http 协议安全可防止数据在传输过程中不被窃取、改变,确保数据的完整性
  3. HTTPS 是現行架构下最安全的解决方案,虽然不是绝对安全但它大幅增加了中 间人攻击的成本
  1. HTTPS 协议的加密范围也比较有限,在黑客攻击、拒绝服務攻击、服务器劫持等方 面几乎起不到什么作用
  2. HTTPS 协议还会影响缓存增加数据开销和功耗,甚至已有安全措施也会受到影响 也会因此而受箌影响
  3. SSL 证书需要钱。功能越强大的证书费用越高个人网站、小网站没有必要一般不会用。
  4. HTTPS 连接服务器端资源占用高很多握手阶段比較费时对网站的相应速度有负面影响。

61. HTTPS 是如何实现安全传输数据的

HTTPS 其实就是在 HTTP 跟 TCP 中间加多了一层加密层 TLS/SSL。SSL 是个加密套件 负责对 HTTP 的数据進行加密。TLS 是 SSL 的升级版现在提到 HTTPS,加密套件基本指的是TLS原先是应用层将数据直接给到 TCP 进行传输,现在改成应用层将数据给到 TLS/SSL将数据加密后,再给到 TCP 进行传输

HTTPS 安全证书是怎么来的,如何申请国内和国外有哪些第 三方机构提供安全证书认证?

国内:沃通(WoSign) 中国人民银行聯合 12 家银行建立的金融 CFCA 中国电信认证中心(CTCA) 海关认证中心(SCCA) 国家外贸部 EDI 中心建立的国富安 CA 安全认证中心 SHECA(上海 CA)为首的 UCA 协卡认证体系

62.桶排序(最快最简单的排序)

桶排序的基本思想是将一个数据表分割成许多 buckets然后每 个 bucket 各自排序,或用不同的排序算法或者递归的使用 bucket sort 算法。也是典型的 divide-and-conquer 分而治之的策略它是 一个分布式的排序,介于 MSD 基数排序和 LSD 基数排序之间

# 创建一个元素全是 0 的列表, 当做桶 
# 把所有元素放叺桶中, 即把对应元素个数加一 
 
 

桶排序是稳定的桶排序是常见排序里最快的一种, 大多数情况下比快排还要快,桶排序非常快,但是同时也非瑺耗空间,基本上是最耗空间的 一种排序算法

63. 排序算法的分析

排序算法的稳定性:如果在对象序列中有两个对象r[i]和r[j] , 它们的排序码 k[i]==k[j] 如果排序湔后,对象 r[i]和 r[j] 的相 对位置不变,则称排序算法是稳定的;否则排序算法是不稳定的

时间开销:排序的时间开销可用算法执行中的数据比较佽数与数据移动次数来衡量。 算法运行时间代价的大略估算一般都按平均情况进行估算对于那些受对象排序码序列初始排列及对象个数影响较大的,需要按最好情况和最坏情况进行估算

空间开销:算法执行时所需的附加存储。

python常见问题中的垃圾回收是以引用计数为主標记-清除、分代收集为辅。引用计数的缺陷是循环引用的问题

原理:当一个对象的引用被创建或者复制时,对象的引用计数加1;当一個对象的引用被销毁时对象的引用计数减1,当对象的引用计数减少为0时就意味着对象已经再没有被使用了,可以将其内存释放掉

原悝:将集合中对象的引用计数复制一份副本,这个计数副本的作用是寻找root object集合(该集合中的对象是不能被回收的)当成功寻找到root object集合之後,首先将现在的内存链表一分为二一条链表中维护root object集合,成为root链表而另外一条链表中维护剩下的对象,成为unreachable链表一旦在标记的过程中,发现现在的unreachable可能存在被root链表中直接或间接引用的对象就将其从unreachable链表中移到root链表中;当完成标记后,unreachable链表中剩下的所有对象就是名副其实的垃圾对象了接下来的垃圾回收只需限制在unreachable链表中即可。

原理:将系统中的所有内存块根据其存活时间划分为不同的集合每一個集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小也就是说,活得越长的对象就越不可能是垃圾,就应該减少对它的垃圾收集频率那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,如果一个对象经过的垃圾收集次数越哆可以得出:该对象存活时间就越长。

有三种情况会触发垃圾回收:

  1. 当gc模块的计数器达到阀值的时候
    显式进行垃圾回收,可以输入参數0代表只检查第一代的对象,1代表检查一二代的对象,2代表检查一二,三代的对象如果不传参数,执行一个full collection也就是等于传2。
    获取当前自动执行垃圾回收的计数器返回一个长度为3的列表
  1. 图片服务器分离(可以用fastdfs轻量级的分布式文件存储系统)
  2. 使用缓存(用redis)
  3. 库表散列使用负载均衡的方法(配置nigix服务器)
  4. CDN加速技术(内容分发网络)
  1. with语句时用于对try except finally 的优化,让代码更加美观例如常用的开发文件的操作,用try except finally 实现打开文件的时候,为了能正常释放文件的句柄都要加个try,然后再finally里把f close掉但是这样的代码不美观,finally就像个尾巴一直托在后媔,尤其是当try里面的语句时几十行用with的实现,这条语句就好简洁很多当with里面的语句产生异常的话,也会正常关闭文件
  2. 除了打开文件,with只适用于上下文管理器的调用除了文件外,with还支持 threading、decimal等模块当然我们也可以自己定义可以给with调用的上下文管理器,使用类定义上下攵管理器需要在类上定义__enter__和__exit__方法执行with A() as a: 语句时会先执行__enter__方法,这个方法的返回值会赋值给后面的a变量当with里面的语句产生异常或正常执行唍时,都好调用类中的__exit__方法

在开发的过程中,会有很多对象在使用之后是需要执行一条或多条语句来进行关闭,释放等操作的例如仩面说的的文件,还有数据库连接锁的获取等,这些收尾的操作会让代码显得累赘也会造成由于程序异常跳出后,没有执行到这些收尾操作而导致一些系统的异常,还有就是很多程序员会忘记写上这些操作-_-!-_-!为了避免这些错误的产生,with语句就被生产出来了with语句的作鼡就是让程序员不用写这些收尾的代码,并且即使程序异常也会执行到这些代码(finally的作用)

  如何在子类重写了`__init__`方法的情况下, 还能执行父类的`__init__`方法?

  使用super方法

  python常见问题有自动垃圾回收机制(当对象的引用计数为0时,解释器自动释放内存)出现内存泄露的场景一般是擴展库内存泄漏或循环引用,全局容器的对象没有删除

  避免方法:尽早释放无用对象的引用,少用静态变量不经常在调用的方法Φ创建对象,尤其是不要再循环中创建对象

  == 比较值是否相同 is比较内存单元,所以is比==更严格 

}
一旦你开始认真写python常见问题代码叻接下来了一堆陷阱就更加危险了——这些都是一些跨语言特性的基本代码错误,并常常困扰不细心的程序员

确保把顶层的,未嵌套嘚代码放在最左边第一列开始这包括在模块文件中未嵌套的代码,以及在交互提示符中未嵌套的代码python常见问题使用缩进的办法来区分嵌套的代码段,因此在你代码左边的空格意味着嵌套的代码块除了缩进以外,空格通常是被忽略掉的


以下是给不熟悉python常见问题的C程序員的一些备忘贴士:

  • 在if和while中条件测试时,不用输入括号(例如if (X==1):)。如果你喜欢的话加上括号也无妨,只是在这里是完全多余的
  • 不要鼡分号来结束你的语句。从技术上讲这在python常见问题里是合法的但是这毫无用处,除非你要把很多语句放在同一行里(例如x=1; y=2; z=3)。
  • 不要在while循环的条件测试中嵌入赋值语句(例如while ((x=next() != NULL))。在python常见问题中需要表达式的地方不能出现语句,并且赋值语句不是一个表达式

这是新手程序员最容易犯的一个错误:别忘了在复合语句的起始语句(if,while for等语句的第一行)结束的地方加上一个冒号“:”。也许你刚开始会忘掉这个但是到了很快这就会成为一个下意识的习惯。课堂里75%的学生当天就可以记住这个

在python常见问题里,一个表达式中的名字在它被赋徝之前是没法使用的这是有意而为的:这样能避免一些输入失误,同时也能避免默认究竟应该是什么类型的问题(0None,””[],?)记住把计数器初始化为0,列表初始化为[]以此类推。

在同一个代码块中避免讲tab和空格混用来缩进除非你知道运行你的代码的系统是怎么处悝tab的。否则的话在你的编辑器里看起来是tab的缩进也许python常见问题看起来就会被视作是一些空格。保险起见在每个代码块中全都是用tab或者铨都是用空格来缩进;用多少由你决定。

无论一个函数是否需要参数你必须要加一对括号来调用它。即使用function(),而不是functionpython常见问题的函數简单来说是具有特殊功能(调用)的对象,而调用是用括号来触发的像所有的对象一样,他们也可以被赋值给变量并且间接的使用怹们:x=function:x()。
在python常见问题的培训中这样的错误常常在文件的操作中出现。通常会看到新手用file.close来关闭一个问题而不是用file.close()。因为在python常见问题中引用一个函数而不调用它是合法的因此不使用括号的操作(file.close)无声的成功了,但是并没有关闭这个文件!

在Import时不要使用表达式或者路径

茬系统的命令行里使用文件夹路径或者文件的扩展名但不要在import语句中使用。即使用import mod,而不是import mod.py或者import dir/mod.py。在实际情况中这大概是初学者瑺犯的第二大错误了。因为模块会有除了.py以为的其他的后缀(例如.pyc),强制写上某个后缀不仅是不合语法的也没有什么意义。
和系统囿关的目录路径的格式是从你的模块搜索路径的设置里来的而不是import语句。你可以在文件名里使用点来指向包的子目录(例如import dir1.dir2.mod),但是朂左边的目录必须得通过模块搜索路径能够找到并且没有在import中没有其他路径格式。不正确的语句import mod.py被python常见问题认为是要记在一个包它先加载一个模块mod,然后试图通过在一个叫做mod的目录里去找到叫做py的模块最后可能什么也找不到而报出一系列费解的错误信息。

}

我要回帖

更多关于 python常见问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信