python模拟面试技术题答案

 

目录javascript

Python4期模拟面试技术面试题答案................................................................................................................ 3html

1、 python语法................................................................................................................................................... 3前端

1. 请说一下你对迭代器和生成器的区别?.......................................................................................... 3java

2. 什么是线程安全?.................................................................................................................................. 4python

3. 你所遵循的代码规范是什么?请举例说明其要求?.................................................................... 4mysql

4. Python中数组有哪些类型?字典能够是有序的吗??.............................................................. 5react

5. python 中 yield 的用法?................................................................................................................ 5linux

6. Python中pass语句的做用是什么?............................................................................................... 5ios

7. python2和python3的区别?............................................................................................................... 6nginx

8. 谈谈你对GIL锁对python多线程的影响?................................................................................... 8

9. python是如何进行内存管理的?...................................................................................................... 8

10. Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)................................. 9

11. 如何用Python来进行查询和替换一个文本字符串?............................................................... 9

12. 递归函数中止的条件........................................................................................................................... 9

13. Python经常使用的设计模式有哪些?.................................................................................................... 9

14. 单例的应用场景有哪些?................................................................................................................ 11

15. 解释一下什么是闭包......................................................................................................................... 11

2、 Linux基础和数据结构与算法................................................................................................................ 11

1. 10个经常使用的Linux命令?................................................................................................................. 11

2. find和grep的区别?........................................................................................................................ 11

3. 什么是阻塞?什么是非阻塞?......................................................................................................... 11

4. linux重定向命令有哪些?有什么区别??................................................................................ 11

5.软硬连接区别?........................................................................................................................................ 12

6.linux关机命令有哪些?..................................................................................................................... 12

7.linux下管道的做用?.......................................................................................................................... 12

3、 Web框架..................................................................................................................................................... 12

1.django 中当一个用户登陆 A 应用服务器(进入登陆状态),而后下次请求被 nginx 代理到 B 应用服务器会出现什么影响?................................................................................................................................................... 12

2.跨域请求问题django怎么解决的(原理)................................................................................... 12

3.请解释或描述一下Django的架构..................................................................................................... 12

4.django对数据查询结果排序怎么作,降序怎么作,查询大于某个字段怎么作................. 13

5.说一下Django,MIDDLEWARES中间件的做用?............................................................................ 13

6.你对Django的认识?........................................................................................................................... 13

7. Django重定向你是如何实现的?用的什么状态码?................................................................ 13

8.ngnix的正向代理与反向代理?........................................................................................................ 13

9. Tornado 的核是什么?....................................................................................................................... 14

10.Django 自己提供了 runserver,为何不能用来部署?...................................................... 14

11.建立项目,建立应用的命令?......................................................................................................... 14

12. 生成迁移文件?执行迁移?........................................................................................................... 14

13. 关系型数据库的关系包括那些类型?.......................................................................................... 14

14. 查询集返回列表的过滤器有哪些?.............................................................................................. 14

15. 判断查询集中是否有数据?........................................................................................................... 14

16.查询集两大特性?惰性执行?......................................................................................................... 14

4、 网络编程和前端......................................................................................................................................... 15

1.AJAX是什么,如何使用AJAX?......................................................................................................... 15

2. 常见的HTTP状态码有哪些?........................................................................................................... 15

3. Post和get区别?.............................................................................................................................. 15

1.socket建立一个套接字........................................................................................................................ 16

2.bind绑定ip和port............................................................................................................................. 16

3.listen使套接字变为能够被动连接................................................................................................. 16

4.accept等待客户端的连接................................................................................................................... 16

5.recv/send接收发送数据..................................................................................................................... 16

6.请简单说一下三次握手和四次挥手?什么是2msl?为何要这样作?............................... 16

7.七层模型?IP ,TCP/UDP, HTTP、RTSP、FTP分别在哪层?................................................. 17

5、 爬虫和数据库............................................................................................................................................. 18

1.scrapy和scrapy-redis有什么区别?为何选择redis数据库?..................................... 18

2. 你用过的爬虫框架或者模块有哪些?谈谈他们的区别或者优缺点?.................................. 18

3.你经常使用的mysql引擎有哪些?各引擎间有什么区别?............................................................... 19

4.描述下scrapy框架运行的机制?..................................................................................................... 19

5.什么是关联查询,有哪些?................................................................................................................ 20

6.写爬虫是用多进程好?仍是多线程好? 为何?...................................................................... 20

7.数据库的优化?...................................................................................................................................... 20

8.常见的反爬虫和应对方法?................................................................................................................ 20

9.分布式爬虫主要解决什么问题?....................................................................................................... 21

10.爬虫过程当中验证码怎么处理?......................................................................................................... 21

11.redis数据结构有哪些?................................................................................................................... 21

12. redis中list底层实现有哪几种?有什么区别?.................................................................. 21

13. QPS?...................................................................................................................................................... 22

6、 数据结构与算法......................................................................................................................................... 22

1.基础的数据结构有哪些?.................................................................................................................... 22

2.怎么评价一个算法的好坏?................................................................................................................ 22

3.算法的特性?........................................................................................................................................... 22

4.有没有了解过桶排序?......................................................................................................................... 22

5.快排/冒泡的思想?............................................................................................................................... 23

 

 

 

 

 

Python4期模拟面试技术面试题答案

1、python语法

1. 请说一下你对迭代器和生成器的区别?

 答:(1)迭代器是一个更抽象的概念,任何对象,若是它的类有next方法和iter方法返回本身自己。对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数,iter()是python的内置函数。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是python的内置函数。在没有后续元素时,next()会抛出一个StopIteration异常

(2)生成器(Generator)是建立迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在须要返回数据的时候使用yield语句。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和全部的数据值)

区别:生成器能作到迭代器能作的全部事,并且由于自动建立了__iter__()和next()方法,生成器显得特别简洁,并且生成器也是高效的,使用生成器表达式取代列表解析能够同时节省内存。除了建立和保存程序状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常

2. 什么是线程安全?

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

3. 你所遵循的代码规范是什么?请举例说明其要求?

PEP8

1变量

常量:大写加下划线 USER_CONSTANT

私有变量 : 小写和一个前导下划线 _private_value

Python 中不存在私有变量一说,如果遇到须要保护的变量,使用小写和一个前导下划线。但这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。但实际上,外部类仍是能够访问到这个变量。

内置变量 : 小写,两个前导下划线和两个后置下划线 __class__

两个前导下划线会致使变量在解释期间被改名。这是为了不内置变量和其余变量产生冲突。用户定义的变量要严格避免这种风格。以避免致使混乱。

函数和方法

整体而言应该使用,小写和下划线。但有些比较老的库使用的是混合大小写,即首单词小写,以后每一个单词第一个字母大写,其他小写。但如今,小写和下划线已成为规范。

私有方法 :小写和一个前导下划线

 

这里和私有变量同样,并非真正的私有访问权限。同时也应该注意通常函数不要使用两个前导下划线(当遇到两个前导下划线时,Python 的名称改编特性将发挥做用)。

特殊方法 :小写和两个前导下划线,两个后置下划线

这种风格只应用于特殊函数,好比操做符重载等。

函数参数 : 小写和下划线,缺省值等号两边无空格

3

类老是使用驼峰格式命名,即全部单词首字母大写其他字母小写。类名应该简明,精确,并足以从中理解类所完成的工做。常见的一个方法是使用表示其类型或者特性的后缀,例如:

SQLEngine,MimeTypes对于基类而言,可使用一个 Base 或者 Abstract 前缀BaseCookie,AbstractGroup

4 模块和包

除特殊模块 __init__ 以外,模块名称都使用不带下划线的小写字母。

如果它们实现一个协议,那么一般使用lib为后缀,例如:

import smtplib

import os

import sys

关于参数

5.1 不要用断言来实现静态类型检测。断言能够用于检查参数,但不该仅仅是进行静态类型检测。 Python 是动态类型语言,静态类型检测违背了其设计思想。断言应该用于避免函数不被毫无心义的调用。

5.2 不要滥用 *args 和 **kwargs。*args 和 **kwargs 参数可能会破坏函数的健壮性。它们使签名变得模糊,并且代码经常开始在不该该的地方构建小的参数解析器。

6 其余

6.1 使用 has 或 is 前缀命名布尔元素

is_connect = True

    has_member = False

6.2 用复数形式命名序列

members = ['user_1', 'user_2']

6.3 用显式名称命名字典

person_address = {'user_1':'10 road WD', 'user_2' : '20 street huafu'}

6.4 避免通用名称

诸如 list, dict, sequence 或者 element 这样的名称应该避免。

6.5 避免现有名称

诸如 os, sys 这种系统已经存在的名称应该避免。

7 一些数字

一行列数 : PEP 8 规定为 79 列。根据本身的状况,好比不要超过满屏时编辑器的显示列数。

一个函数 : 不要超过 30 行代码, 便可显示在一个屏幕类,能够不使用垂直游标便可看到整个函数。

一个类 : 不要超过 200 行代码,不要有超过 10 个方法。一个模块 不要超过 500 行。

8 验证脚本

能够安装一个 pep8 脚本用于验证你的代码风格是否符合 PEP8。

4. Python中数组有哪些类型?字典能够是有序的吗??

List Tuple Dictionary 

from collections import OrderedDict

dic=OrderedDict()#声明有序字典

 

5. python 中 yield 的用法?

答: yield 简单说来就是一个生成器,这样函数它记住上次返 简单说来就是一个生成器,这样函数它记住上次返 简单说来就是一个生成器,这样函数它记住上次返 简单说来就是一个生成器,这样函数它记住上次返 回时在函数体中的位置。对生成器第 二次(或n 次)调用跳转至该函 次)调用跳转至该函 数。

6. Python中pass语句的做用是什么?

pass语句什么也不作,通常做为占位符或者建立占位程序,pass语句不会执行任何操做。

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,None 
4)整型除法返回浮点数,要获得整型结果,请使用// 
5)加入nonlocal语句。使用noclocal x能够直接指派外围(非全局)变量 
6)去除print语句,加入print()函数实现相同的功能。一样的还有 exec语句,已经改成exec()函数 
7)改变了顺序操做符的行为,例如x<y,当x和y类型不匹配时抛出TypeError而不是返回随即的 bool值  
8)输入函数改变了,删除了raw_input,用input代替: 
   2.X:guess = int(raw_input('Enter an integer : ')) # 读取键盘输入的方法 
   3.X:guess = int(input('Enter an integer : '))

9)去除元组参数解包。不能def(a, (b, c)):pass这样定义函数了 
10)新式的8进制字变量,相应地修改了oct()函数。 
11)增长了 2进制字面量和bin()函数 

12)扩展的可迭代解包。在Py3.X 里,a, b, *rest = seq和 *rest, a = seq都是合法的,只要求两点:rest是list 
对象和seq是可迭代的。 
13)新的super(),能够再也不给super()传参数, 

14)新的metaclass语法: 
    class Foo(*bases, **kwds): 
      pass 
15)支持class decorator。用法与函数decorator同样: 
4. 字符串和字节串 
1)如今字符串只有str一种类型,但它跟2.x版本的unicode几乎同样。

2)关于字节串,请参阅“数据类型”的第2条目 
5.数据类型 
1)Py3.X去除了long类型,如今只有一种整型——int,但它的行为就像2.X版本的long 
2)新增了bytes类型,对应于2.X版本的八位串,定义一个bytes字面量的方法以下: 
   str对象和bytes对象可使用.encode() (str -> bytes) or .decode() (bytes -> str)方法相互转化。

 3)dict的.keys()、.items 和.values()方法返回迭代器,而以前的iterkeys()等函数都被废弃。同时去掉的还有 
dict.has_key(),用 in替代它吧 
6.面向对象 
1)引入抽象基类(Abstraact Base Classes,ABCs)。 
2)容器类和迭代器类被ABCs化。
3)迭代器的next()方法更名为__next__(),并增长内置函数next(),用以调用迭代器的__next__()方法 
4)增长了@abstractmethod和 @abstractproperty两个 decorator,编写抽象方法(属性)更加方便。 
7.异常 
1)因此异常都从 BaseException继承,并删除了StardardError 
2)去除了异常类的序列行为和.message属性 
3)用 raise Exception(args)代替 raise Exception, args语法 
4)捕获异常的语法改变,引入了as关键字来标识异常实例 

5)异常链,由于__context__在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.htm获取) 
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, 9] 

2)bytes对象不能hash,也不支持 b.lower()、b.strip()和b.split()方法,但对于后二者可使用 b.strip(b’  \n\t\r \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)__getslice__系列成员被废弃。a[i:j]根据上下文转换为a.__getitem__(slice(I, j))或 __setitem__和 __delitem__调用 
7)file类被废弃

 

8. 谈谈你对GIL锁对python多线程的影响?

GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所作的决定。每一个CPU在同一时间只能执行一个线程(在单核CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来说都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。)

在Python多线程下,每一个线程的执行方式:

1、获取GIL

2、执行代码直到sleep或者是python虚拟机将其挂起。

3、释放GIL       

可见,某个线程想要执行,必须先拿到GIL,咱们能够把GIL看做是“通行证”,而且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不容许进入CPU执行。

在Python2.x里,GIL的释放逻辑是当前线程碰见IO操做或者ticks计数达到100(ticks能够看做是Python自身的一个计数器,专门作用于GIL,每次释放后归零,这个计数能够经过 sys.setcheckinterval 来调整),进行释放。而每次释放GIL锁,线程进行锁竞争、切换线程,会消耗资源。而且因为GIL锁存在,python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行)。

 IO密集型代码(文件处理、网络爬虫等),多线程可以有效提高效率(单线程下有IO操做会进行IO等待,形成没必要要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,能够不浪费CPU的资源,从而能提高程序执行效率),因此多线程对IO密集型代码比较友好。

9. python是如何进行内存管理的?

1、垃圾回收:python不像C++,Java等语言同样,他们能够不用事先声明变量类型而直接对变量进行赋值。对Python语言来说,对象的类型和内存都是在运行时肯定的。这也是为何咱们称Python语言为动态类型的缘由(这里咱们把动态类型能够简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值)。

2、引用计数:Python采用了相似Windows内核对象同样的方式来对内存进行管理。每个对象,都维护这一个对指向该对对象的引用的计数。当变量被绑定在一个对象上的时候,该变量的引用计数就是1,(还有另一些状况也会致使变量引用计数的增长),系统会自动维护这些标签,并定时扫描,当某标签的引用计数变为0的时候,该对就会被回收。

3、内存池机制Python的内存机制以金字塔行,-1,-2层主要有操做系统进行操做,

  第0层是C中的malloc,free等内存分配和释放函数进行操做;

  第1层和第2层是内存池,有Python的接口函数PyMem_Malloc函数实现,当对象小于256K时有该层直接分配内存;

  第3层是最上层,也就是咱们对Python对象的直接操做;

在 C 中若是频繁的调用 malloc 与 free 时,是会产生性能问题的.再加上频繁的分配与释放小块的内存会产生内存碎片. Python 在这里主要干的工做有:

  若是请求分配的内存在1~256字节之间就使用本身的内存管理系统,不然直接使用 malloc.

  这里仍是会调用 malloc 分配内存,但每次会分配一块大小为256k的大块内存.

  经由内存池登记的内存到最后仍是会回收到内存池,并不会调用 C 的 free 释放掉.以便下次使用.对于简单的Python对象,例如数值、字符串,元组(tuple不容许被更改)采用的是复制的方式(深拷贝?),也就是说当将另外一个变量B赋值给变量A时,虽然A和B的内存空间仍然相同,但当A的值发生变化时,会从新给A分配空间,A和B的地址变得再也不相同

  1. 10.    Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)

答:赋值(=),就是建立了对象的一个新的引用,修改其中任意一个变量都会影响到另外一个。

浅拷贝:建立一个新的对象,但它包含的是对原始对象中包含项的引用(若是用引用的方式修改其中一个对象,另一个也会修改改变){1,彻底切片方法;2,工厂函数,如list();3,copy模块的copy()函数}

深拷贝:建立一个新的对象,而且递归的复制它所包含的对象(修改其中一个,另一个不会改变){copy模块的deep.deepcopy()函数}

 

  1. 11.    如何用Python来进行查询和替换一个文本字符串?

可使用re模块中的sub()函数或者subn()函数来进行查询和替换,

格式:sub(replacement, string[,count=0])(replacement是被替换成的文本,string是须要被替换的文本,count是一个可选参数,指最大被替换的数量)

  1. 12.    递归函数中止的条件

递归的终止条件通常定义在递归函数内部,在递归调用前要作一个条件判断,根据判断的结果选择是继续调用自身,仍是return;返回终止递归。

终止的条件:1.判断递归的次数是否达到某一限定值

  1. 2.   判断运算的结果是否达到某个范围等,根据设计的目的来选择
  2. 13.    Python经常使用的设计模式有哪些?

1 建立型模式

前面讲过,社会化的分工愈来愈细,天然在软件设计方面也是如此,所以对象的建立和对象的使用分开也就成为了必然趋势。由于对象的建立会消耗掉系统的不少资源,因此单独对对象的建立进行研究,从而可以高效地建立对象就是建立型模式要探讨的问题。这里有6个具体的建立型模式可供研究,它们分别是:

简单工厂模式(Simple Factory);

工厂方法模式(Factory Method);

抽象工厂模式(Abstract Factory);

建立者模式(Builder);

原型模式(Prototype);

单例模式(Singleton)。

说明:严格来讲,简单工厂模式不是GoF总结出来的23种设计模式之一。

结构型模式

在解决了对象的建立问题以后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,由于如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。对象结构的设计很容易体现出设计人员水平的高低,这里有7个具体的结构型模式可供研究,它们分别是:

外观模式(Facade);

适配器模式(Adapter);

代理模式(Proxy);

装饰模式(Decorator);

桥模式(Bridge);

组合模式(Composite);

享元模式(Flyweight)

 

3 行为型模式

在对象的结构和对象的建立问题都解决了以后,就剩下对象的行为问题了,若是对象的行为设计的好,那么对象的行为就会更清晰,它们之间的协做效率就会提升,这里有11个具体的行为型模式可供研究,它们分别是:

模板方法模式(Template Method);

观察者模式(Observer);

状态模式(State);

策略模式(Strategy);

职责链模式(Chain of Responsibility);

命令模式(Command);

访问者模式(Visitor);

调停者模式(Mediator);

备忘录模式(Memento);

迭代器模式(Iterator);

解释器模式(Interpreter)。

 

  1. 14.    单例的应用场景有哪些?

单例模式应用的场景通常发如今如下条件下:

  (1)资源共享的状况下,避免因为资源操做时致使的性能或损耗等。如日志文件,应用配置。

  (2)控制资源的状况下,方便资源之间的互相通讯。如线程池等。

1.网站的计数器

2.应用配置

3.多线程池

4.数据库配置,数据库链接池

5.应用程序的日志应用....

  1. 15.    解释一下什么是闭包

内部函数可使用外部函数变量的行为,就叫闭包

2、Linux基础和数据结构与算法

1. 10个经常使用的Linux命令?

答案:略

2. find和grep的区别?

grep命令是一种强大的文本搜索工具,grep搜索内容串能够是正则表达式,容许对文本文件进行模式查找。若是找到匹配模式, grep打印包含模式的全部行。

find一般用来在特定的目录下搜索符合条件的文件,也能够用来搜索特定用户属主的文件。

3. 什么是阻塞?什么是非阻塞?

阻塞调用是指调用结果返回以前,当前线程会被挂起。函数只有在获得结果以后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不一样的。对于同步调用来讲,不少时候当前线程仍是激活的,只是从逻辑上当前函数没有返回而已。例如,咱们在CSocket中调用Receive函数,若是缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各类各样的消息。若是主窗口和调用函数在同一个线程中,除非你在特殊的界面操做函数中调用,其实主界面仍是应该能够刷新。socket接收数据的另一个函数recv则是一个阻塞调用的例子。当socket工做在阻塞模式的时候,若是没有数据的状况下调用该函数,则当前线程就会被挂起,直到有数据为止。

非阻塞和阻塞的概念相对应,指在不能马上获得结果以前,该函数不会阻塞当前线程,而会马上返回。

4. linux重定向命令有哪些?有什么区别??

重定向>

Linux容许将命令执行结果重定向到一个文件,本应显示在终端上的内容保存到指定文件中。如:ls > test.txt ( test.txt 若是不存在,则建立,存在则覆盖其内容 )

重定向>>

>>这个是将输出内容追加到目标文件中。若是文件不存在,就建立文件;若是文件存在,则将新的内容追加到那个文件的末尾,该文件中的原有内容不受影响。

5.软硬连接区别?

软链接相似windows的快捷方式,当删除源文件,那么软连接失效。硬连接能够理解为源文件的一个别名。多个别名所表明的是同一个文件。当rm一个文件的时候,那么此文件的硬连接数减1,当硬连接数为0的时候,文件删除。

6.linux关机命令有哪些?

命令

含义

reboot

从新启动操做系统

shutdown –r now

从新启动操做系统,shutdown会给别的用户提示

shutdown -h now

马上关机,其中now至关于时间为0的状态

shutdown -h 20:25

系统在今天的20:25 会关机

shutdown -h +10

系统再过十分钟后自动关机

init 0

关机

init 6

重启

7.linux下管道的做用?

一个命令的输出能够经过管道作为另外一个命令的输入

 

 

 

 

 

3、Web框架

1.django 中当一个用户登陆 A 应用服务器(进入登陆状态),而后下次请求被 nginx 代理到 B 应用服务器会出现什么影响?

若是用户在A应用服务器登录的session数据没有共享到B应用服务器,纳米以前的登陆状态就没有了。

2.跨域请求问题django怎么解决的(原理)

启用中间件

post请求

验证码

表单中添加{%csrf_token%}标签

3.请解释或描述一下Django的架构

对于Django框架遵循MVC设计,而且有一个专有名词:MVT

M全拼为Model,与MVC中的M功能相同,负责数据处理,内嵌了ORM框架

V全拼为View,与MVC中的C功能相同,接收HttpRequest,业务处理,返回HttpResponse

T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html,内嵌了模板引擎

4.django对数据查询结果排序怎么作,降序怎么作,查询大于某个字段怎么作

排序使用order_by()

降序须要在排序字段名前加-

查询字段大于某个值:使用filter(字段名_gt=值)

5.说一下Django,MIDDLEWARES中间件的做用?

答:中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,而且在全局上改变django的输入与输出。

 

6.你对Django的认识?

Django是走大而全的方向,它最出名的是其全自动化的管理后台:只须要使用起ORM,作简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。

Django内置的ORM跟框架内的其余模块耦合程度高。

 

应用程序必须使用Django内置的ORM,不然就不能享受到框架内提供的种种基于其ORM的便利;理论上能够切换掉其ORM模块,但这就至关于要把装修完毕的房子拆除从新装修,倒不如一开始就去毛胚房作全新的装修。

Django的卖点是超高的开发效率,其性能扩展有限;采用Django的项目,在流量达到必定规模后,都须要对其进行重构,才能知足性能的要求。

Django适用的是中小型的网站,或者是做为大型网站快速实现产品雏形的工具。

Django模板的设计哲学是完全的将代码、样式分离; Django从根本上杜绝在模板中进行编码、处理数据的可能。

7. Django重定向你是如何实现的?用的什么状态码?

使用HttpResponseRedirect

redirect和reverse

状态码:302,301

8.ngnix的正向代理与反向代理?

答:正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),而后代理向原始服务器转交请求并将得到的内容返回给客户端。客户端必需要进行一些特别的设置才能使用正向代理。

反向代理正好相反,对于客户端而言它就像是原始服务器,而且客户端不须要进行任何特别的设置。客户端向反向代理的命名空间中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将得到的内容返回给客户端,就像这些内容本来就是它本身的同样。

9. Tornado 的核是什么?

Tornado 的核心是 ioloop 和 iostream 这两个模块,前者提供了一个高效的 I/O 事件循环,后者则封装了 一个无阻塞的 socket 。经过向 ioloop 中添加网络 I/O 事件,利用无阻塞的 socket ,再搭配相应的回调 函数,即可达到求之不得的高效异步执行。

10.Django 自己提供了 runserver,为何不能用来部署?

runserver 方法是调试 Django 时常常用到的运行方式,它使用 Django 自带的

WSGI Server 运行,主要在测试和开发中使用,而且 runserver 开启的方式也是单进程 。

 uWSGI 是一个 Web 服务器,它实现了 WSGI 协议、uwsgi、http 等协议。注意 uwsgi 是一种通讯协议,而 uWSGI 是实现 uwsgi 协议和 WSGI 协议的 Web 服务器。uWSGI 具备超快的性能、低内存占用和多 app 管理等优势,而且搭配着 Nginx

就是一个生产环境了,可以将用户访问请求与应用 app 隔离开,实现真正的部署 。相比来说,支持的并发量更高,方便管理多进程,发挥多核的优点,提高性能。

11.建立项目,建立应用的命令?

django-admin startproject ** 
python manage.py startapp **

  1. 12.  生成迁移文件?执行迁移?

python manage.py makemigrations

python manage.py migrate

 

  1. 13.  关系型数据库的关系包括那些类型?

ForeignKey:一对多,将字段定义在多的一端中

ManyToManyField:多对多,将字段定义在两端中

OneToOneField:一对一,将字段定义在任意一端中

  1. 14.  查询集返回列表的过滤器有哪些?

all():返回全部数据

filter():返回知足条件的数据

exclude():返回知足条件以外的数据,至关于sql语句中where部分的not关键字

order_by():排序

 

  1. 15.  判断查询集中是否有数据?

exists():判断查询集中是否有数据,若是有则返回True,没有则返回False

 

16.查询集两大特性?惰性执行?

惰性执行、缓存 。

建立查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的状况包括迭代、序列化、与if合用

4、网络编程和前端

1.AJAX是什么,如何使用AJAX?

ajax(异步的javascript 和xml) 可以刷新局部网页数据而不是从新加载整个网页。

第一步,建立xmlhttprequest对象,var xmlhttp =new XMLHttpRequest();XMLHttpRequest对象用来和服务器交换数据。

第二步,使用xmlhttprequest对象的open()和send()方法发送资源请求给服务器。

第三步,使用xmlhttprequest对象的responseText或responseXML属性得到服务器的响应。

第四步,onreadystatechange函数,当发送请求到服务器,咱们想要服务器响应执行一些功能就须要使用onreadystatechange函数,每次xmlhttprequest对象的readyState发生改变都会触发onreadystatechange函数。

2. 常见的HTTP状态码有哪些?

200 OK

301 Moved Permanently

302 Found

304 Not Modified

307 Temporary Redirect

400 Bad Request

401 Unauthorized

403 Forbidden

404 Not Found

410 Gone

500 Internal Server Error

501 Not Implemented

3. Post和get区别?

1、GET请求,请求的数据会附加在URL以后,以?分割URL和传输数据,多个参数用&链接。URL的编码格式采用的是ASCII编码,而不是uniclde,便是说全部的非ASCII字符都要编码以后再传输。

POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。上面的item=bandsaw就是实际的传输数据。

所以,GET请求的数据会暴露在地址栏中,而POST请求则不会。

2、传输数据的大小

在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。可是在实际开发过程当中,对于GET,特定的浏览器和服务器对URL的长度有限制。所以,在使用GET请求时,传输数据会受到URL长度的限制。

对于POST,因为不是URL传值,理论上是不会受限制的,可是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。

3、安全性

POST的安全性比GET的高。这里的安全是指真正的安全,而不一样于上面GET提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。好比,在进行登陆操做,经过GET请求,用户名和密码都会暴露再URL上,由于登陆页面有可能被浏览器缓存以及其余人查看浏览器的历史记录的缘由,此时的用户名和密码就很容易被他人拿到了。除此以外,GET请求提交的数据还可能会形成Cross-site request frogery攻击。

4.cookie 和session 的区别?

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人能够分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。

3、session会在必定时间内保存在服务器上。当访问增多,会比较占用服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。

4、单个cookie保存的数据不能超过4K,不少浏览器都限制一个站点最多保存20个cookie。

5、建议:
   将登录信息等重要信息存放为SESSION
   其余信息若是须要保留,能够放在COOKIE中

 

5.建立一个简单tcp服务器须要的流程

1.socket建立一个套接字

2.bind绑定ip和port

3.listen使套接字变为能够被动连接

4.accept等待客户端的连接

5.recv/send接收发送数据

6.请简单说一下三次握手和四次挥手?什么是2msl?为何要这样作?

 

2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,

 

当TCP的一端发起主动关闭,在发出最后一个ACK包后,

即第3次握 手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,

必须在此状态上停留两倍的MSL时间,

等待2MSL时间主要目的是怕最后一个 ACK包对方没收到,

那么对方在超时后将重发第三次握手的FIN包,

主动关闭端接到重发的FIN包后能够再发一个ACK应答包。

在TIME_WAIT状态 时两端的端口不能使用,要等到2MSL时间结束才可继续使用。

当链接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。

不过在实际应用中能够经过设置 SO_REUSEADDR选项达到没必要等待2MSL时间结束再使用此端口。

 

7.七层模型?IP ,TCP/UDP, HTTP、RTSP、FTP分别在哪层?

 

IP          网络层

TCP/UDP    传输层

HTTP、RTSP、FTP 应用层协议(

5、爬虫和数据库

1.scrapy和scrapy-redis有什么区别?为何选择redis数据库?

1) scrapy是一个Python爬虫框架,爬取效率极高,具备高度定制性,可是不支持分布式。而scrapy-redis一套基于redis数据库、运行在scrapy框架之上的组件,可让scrapy支持分布式策略,Slaver端共享Master端redis数据库里的item队列、请求队列和请求指纹集合。

2) 为何选择redis数据库,由于redis支持主从同步,并且数据都是缓存在内存中的,因此基于redis的分布式爬虫,对请求和数据的高频读取效率很是高。

2. 你用过的爬虫框架或者模块有哪些?谈谈他们的区别或者优缺点?

Python自带:urllib,urllib2

第 三 方:requests

框    架:Scrapy

urllib和urllib2模块都作与请求URL相关的操做,但他们提供不一样的功能。

urllib2.:urllib2.urlopen能够接受一个Request对象或者url,(在接受Request对象时候,并以此能够来设置一个URL 的headers),urllib.urlopen只接收一个url

urllib 有urlencode,urllib2没有,所以老是urllib,urllib2常会一块儿使用的缘由

scrapy是封装起来的框架,他包含了下载器,解析器,日志及异常处理,基于多线程, twisted的方式处理,对于固定单个网站的爬取开发,有优点,可是对于多网站爬取 100个网站,并发及分布式处理方面,不够灵活,不便调整与括展。

request 是一个HTTP库, 它只是用来,进行请求,对于HTTP请求,他是一个强大的库,下载,解析所有本身处理,灵活性更高,高并发与分布式部署也很是灵活,对于功能能够更好实现.

Scrapy优缺点:

优势:scrapy 是异步的

采起可读性更强的xpath代替正则

强大的统计和log系统

同时在不一样的url上爬行

支持shell方式,方便独立调试

写middleware,方便写一些统一的过滤器

经过管道的方式存入数据库

缺点:基于python的爬虫框架,扩展性比较差

基于twisted框架,运行中的exception是不会干掉reactor,而且异步框架出错后是不会停掉其余任务的,数据出错后难以察觉。

3.你经常使用的mysql引擎有哪些?各引擎间有什么区别?

主要 MyISAM 与 InnoDB 两个引擎,其主要区别以下:

1、InnoDB 支持事务,MyISAM 不支持,这一点是很是之重要。事务是一种高

级的处理方式,如在一些列增删改中只要哪一个出错还能够回滚还原,而 MyISAM

就不能够了;

2、MyISAM 适合查询以及插入为主的应用,InnoDB 适合频繁修改以及涉及到

安全性较高的应用;

3、InnoDB 支持外键,MyISAM 不支持;

4、MyISAM 是默认引擎,InnoDB 须要指定;

5、InnoDB 不支持 FULLTEXT 类型的索引;

6、InnoDB 中不保存表的行数,如 select count(*) from table 时,InnoDB;须要

扫描一遍整个表来计算有多少行,可是 MyISAM 只要简单的读出保存好的行数即

可。注意的是,当 count(*)语句包含 where 条件时 MyISAM 也须要扫描整个表;

7、对于自增加的字段,InnoDB 中必须包含只有该字段的索引,可是在 MyISAM

表中能够和其余字段一块儿创建联合索引;

8、清空整个表时,InnoDB 是一行一行的删除,效率很是慢。MyISAM 则会重

建表;

9、InnoDB 支持行锁(某些状况下仍是锁整表,如 update table set a=1 where

user like '%lee%'

4.描述下scrapy框架运行的机制?

答:从start_urls里获取第一批url并发送请求,请求由引擎交给调度器入请求队列,获取完毕后,调度器将请求队列里的请求交给下载器去获取请求对应的响应资源,并将响应交给本身编写的解析方法作提取处理:1. 若是提取出须要的数据,则交给管道文件处理;2. 若是提取出url,则继续执行以前的步骤(发送url请求,并由引擎将请求交给调度器入队列...),直到请求队列里没有请求,程序结束。

5.什么是关联查询,有哪些?

答:将多个表联合起来进行查询,主要有内链接、左链接、右链接、全链接(外链接)

6.写爬虫是用多进程好?仍是多线程好? 为何?

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

7.数据库的优化?

1. 优化索引、SQL 语句、分析慢查询;

2. 设计表的时候严格根据数据库的设计范式来设计数据库;

3. 使用缓存,把常常访问到的数据并且不须要常常变化的数据放在缓存中,能

节约磁盘IO;

4. 优化硬件;采用SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等;

5. 采用MySQL 内部自带的表分区技术,把数据分层不一样的文件,可以提升磁

盘的读取效率;

6. 垂直分表;把一些不常常读的数据放在一张表里,节约磁盘I/O;

7. 主从分离读写;采用主从复制把数据库的读操做和写入操做分离开来;

8. 分库分表分机器(数据量特别大),主要的的原理就是数据路由;

9. 选择合适的表引擎,参数上的优化;

10. 进行架构级别的缓存,静态化和分布式;

11. 不采用全文索引;

12. 采用更快的存储方式,例如 NoSQL存储常常访问的数据

8.常见的反爬虫和应对方法?

1).经过Headers反爬虫

从用户请求的Headers反爬虫是最多见的反爬虫策略。不少网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。若是遇到了这类反爬虫机制,能够直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改成目标网站域名。对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过。

2).基于用户行为反爬虫

还有一部分网站是经过检测用户行为,例如同一IP短期内屡次访问同一页面,或者同一帐户短期内屡次进行相同操做。

大多数网站都是前一种状况,对于这种状况,使用IP代理就能够解决。能够专门写一个爬虫,爬取网上公开的代理ip,检测后所有保存起来。这样的代理ip爬虫常常会用到,最好本身准备一个。有了大量代理ip后能够每请求几回更换一个ip,这在requests或者urllib2中很容易作到,这样就能很容易的绕过第一种反爬虫。

对于第二种状况,能够在每次请求后随机间隔几秒再进行下一次请求。有些有逻辑漏洞的网站,能够经过请求几回,退出登陆,从新登陆,继续请求来绕过同一帐号短期内不能屡次进行相同请求的限制。

3).动态页面的反爬虫

上述的几种状况大多都是出如今静态页面,还有一部分网站,咱们须要爬取的数据是经过ajax请求获得,或者经过JavaScript生成的。首先用Fiddler对网络请求进行分析。若是可以找到ajax请求,也能分析出具体的参数和响应的具体含义,咱们就能采用上面的方法,直接利用requests或者urllib2模拟ajax请求,对响应的json进行分析获得须要的数据。

可以直接模拟ajax请求获取数据当然是极好的,可是有些网站把ajax请求的全部参数所有加密了。咱们根本没办法构造本身所须要的数据的请求。这种状况下就用selenium+phantomJS,调用浏览器内核,并利用phantomJS执行js来模拟人为操做以及触发页面中的js脚本。从填写表单到点击按钮再到滚动页面,所有均可以模拟,不考虑具体的请求和响应过程,只是完完整整的把人浏览页面获取数据的过程模拟一遍。

用这套框架几乎能绕过大多数的反爬虫,由于它不是在假装成浏览器来获取数据(上述的经过添加 Headers必定程度上就是为了假装成浏览器),它自己就是浏览器,phantomJS就是一个没有界面的浏览器,只是操控这个浏览器的不是人。利selenium+phantomJS能干不少事情,例如识别点触式(12306)或者滑动式的验证码,对页面表单进行暴力破解等。

9.分布式爬虫主要解决什么问题?

1)ip

2)带宽

3)cpu

4)io

10.爬虫过程当中验证码怎么处理?

1.scrapy自带(可是成功率不高)

2.付费接口(若快http://www.ruokuai.com/home/pricetype)

11.redis数据结构有哪些?

String——字符串
Hash——字典
List——列表
Set——集合
Sorted Set——有序集合

 

  1. 12.  redis中list底层实现有哪几种?有什么区别?

列表对象的编码能够是ziplist或者linkedlist。

ziplist是一种压缩链表,它的好处是更能节省内存空间,由于它所存储的内容都是在连续的内存区域当中的。当列表对象元素不大,每一个元素也不大的时候,就采用ziplist存储。但当数据量过大时就ziplist就不是那么好用了。由于为了保证他存储内容在内存中的连续性,插入的复杂度是O(N),即每次插入都会从新进行realloc。以下图所示,对象结构中ptr所指向的就是一个ziplist。整个ziplist只须要malloc一次,它们在内存中是一块连续的区域。

 

 

  1. 13.  QPS

每秒查询率

QPS(TPS):每秒钟request/事务 数量

6、数据结构与算法

1.基础的数据结构有哪些?

集合、线性结构树形结构、图状结构

集合结构:除了同属于一种类型外,别无其它关系
线性结构:元素之间存在一对一关系常见类型有: 数组,链表,队列,栈,它们之间在操做上有所区别.例如:链表可在任意位置插入或删除元素,而队列在队尾插入元素,队头删除元素,栈只能在栈顶进行插
入,删除操做.
树形结构:元素之间存在一对多关系,常见类型有:树(有许多特例:二叉树、平衡二叉树、查找树等)
图形结构:元素之间存在多对多关系,图形结构中每一个结点的前驱结点数和后续结点多个数能够任意

 

2.怎么评价一个算法的好坏?

时间复杂度:一样的输入规模(问题规模)花费多少时间
②空间复杂度:一样的输入规模花费多少空间(主要是内存)
以上两点越小越好
③稳定性:不会由于输入的不一样而致使不稳定的状况发生
④算法思路是否简单:越简单越容易实现越好

3.算法的特性?

数据结构算法具备五个基本特征:输入、输出、有穷性、肯定性和可行性

 

4.有没有了解过桶排序?

工做的原理是将数组分到有限数量的桶子里。每一个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)

1,桶排序是稳定的

2,桶排序是常见排序里最快的一种,比快排还要快…大多数状况下

3,桶排序很是快,可是同时也很是耗空间,基本上是最耗空间的一种排序算法

 

5.快排/冒泡的思想?

 

冒泡思想:经过无序区中相邻记录的关键字间的比较和位置的交换,使关键字最小的记录像气泡同样逐渐向上漂至水面。整个算法是从最下面的记录开始,对每两个相邻的关键字进行比较,把关键字较小的记录放到关键字较大的记录的上面,通过一趟排序后,关键字最小的记录到达最上面,接着再在剩下的记录中找关键字次小的记录,把它放在第二个位置上,依次类推,一直到全部记录有序为止

复杂度:时间复杂度为O(n2),空间复杂度为O(1)

 

快排思想:

复杂度:快速排序是不稳定的排序算法,最坏的时间复杂度是O(n2),

最好的时间复杂度是(nlogn),空间复杂度为O(logn)

快排的基本思想:经过一躺排序将要排序的数据分割成独立的两部分,其中一部分的全部数据都比另一不部分的全部数据都要小,而后再按此方法对这两部分数据分别进行快速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列。

 

6.你知道几种排序,讲一讲你最熟悉的一种?

 

相关文章
相关标签/搜索