python面试题目

(前端+django+爬虫+数据分析+机器学习+NLP+Linux)
Web全栈开发+数据分析(含爬虫)
技术要求
  • django+docker+ 数据分析
  • 爬虫+数据分析
  • django + flask + bootstrap + echarts.js
  • vue.js + tornado + 数据分析+异步(前后端分离)
  • vue.js、restful风格、node.js、docker、前后端分离
  • Web全栈开发: django/flask/tornado + vue.js/node.js (前后端分离、restful风格)+ 前端框架 + 数据科学 + 爬虫
  • 学历+项目经验 + 数据结构与算法
经验要求:
  • web开发经历
  • 爬虫与反爬虫经历
  • 深度学习之TensorFlow项目经历
  1. 描述工作工作经验和项目,充分准备,可以先讲解项目背景
  2. 项目里用到的框架、技术、数据库
  3. 针对项目面试官问项目中问题的解决方案

面试题目:

面试题目
第一题:给函数传递一个正整数的列表alist和一个正整数T,假装它等于[1,3,6,4,2,7],给出alist里所有相加等于T的元素的list,每个数只用一次。比如T=7,列表里3+4=7,7=7,1+6=7。你的函数就要返回[[3,4],[7],[1,6]]。

之前见过类似的题目,很快就给出了解题思路,我用的回溯法,但是这个代码对我而言有点复杂了,只能写出来整体的框架,递归调用的返回值想不明白。面试结束的时候,面试官说我三道题给出的算法都很优。

第二题:第二题是第一题的加强版。第一题中限定了每个数只出现一次,第二题不用限制。就是可以1+1+1+1+…=7,也可以2+2+3=7。其实和第一题超级像,只要改一个返回值就好,我告诉了面试官该怎么改第一题的代码,然后他让我写出来这个题的代码。憋了很久,自己感觉还是不怎么对。回溯回溯。

第三题:用两个堆栈实现队列的push和pop功能。

二面
第一题:有那么n个列表,每个列表有不确定个>=0的数,没有排序(列表大概长这个样子[3,0,9,11,2……]),现在要每个列表里面选出一个元素,分别为a1,a2….an .使得满足 a1<=a2<=a3<=….<.an 的基础上a1+a2+。。。。。+an的值最大。

先解释你的算法思想并且说出你算法的时间复杂度,然后写出时间负责度。(补充,这n个列表的位置是固定的,第一个列表选出来的元素就是a1,第二个就是n2,不用考虑先选哪一个列表)

有了上一轮惨痛的体验,我就想安安稳稳的活着,用了一个最稳妥的方法,就是从an里选最大的,从an-1里选小于an而且最大的。在过程中可以判断一下是否可以提前结束就可以了。

第二题:有一条马路,马路上有很多树,树的高度不一。现在要统一剪树,剪到高度为h。意思就是,比h高的树都剪到h,比h低的树高度不变。所有的树剪掉的总长度为C。现在要使C>某个值的情况下(假设为MM),使h最大。问怎么确定h。

我用的二分法。初始min=0,max=最高的树,mid=(min+max)/2。在确定一个误差a,当误差小于某个数的时候就认为这个h是我们要的高度。
然后他问我 如果误差是十的-6次方,时间复杂度是多少?

第三面
好像闯到了最后一关,到了主管面试环节,主管超级严肃,进来问了下什么时候可以入职,什么时候工作,一些很随意的问题,问了简历上两个项目,就又开始写代码。就一道题。(半个小时)

循环有序列表:[7,7,8,9,1,2,5,6,7,7],就是这个循环左移可以变成一个有序的列表。查找这个列表中是否有某个数,说出你的思路。

我第一个方法是遍历。如果大于list[0]就从前向后遍历。如果小于list[0]就从后向前遍历,被鄙视了。

第二个方法是二分法。如果要查找的数a小于list[mid],那么这个数一定在list[:mid]。如果要查到的数大于list[mid],分两种情况,如果大于list[0]则在左边,如果小于,则在右边。回答完感觉面试官露出了满意的笑容。这道题想了好久,一度觉得要自己要凉凉。

练习题:LeetCode https://leetcode.com/problems/

1、Python中的模块和包是什么?
每一个Python代码文件都是一个模块,并可以引用其他的模块,比如对象和属性。

2、Xrange和range的区别是什么?
Xrange用于返回一个xrange对象,而range用于返回一个数组。不管那个范围多大,Xrange都使用同样的内存。都在循环时使用,xrange内存性能更好,xrange用法与range完全相同,range一个生成list对象,xrange是生成器
要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。
在 Python 3 中,range() 是像 xrange() 那样实现,xrange()被抛弃。

3、如何将一个数字转换成一个字符串?
你可以使用自带函数str()将一个数字转换为字符串。如果你想要八进制或者十六进制数,可以用oct()或hex()。

4、Python中的负索引是什么?
Python中的序列索引可以是正也可以是负。如果是正索引,0是序列中的第一个索引,1是第二个索引。如果是负索引,(-1)是最后一个索引而(-2)是倒数第二个索引。

5、如何在Python中拷贝一个对象?
如果要在Python中拷贝一个对象,大多时候你可以用copy.copy()或者copy.deepcopy()。但并不是所有的对象都可以被拷贝。

6、Python中的docstring是什么?
Python中文档字符串被称为docstring,它在Python中的作用是为函数、模块和类注释生成文档。

7、在Python中什么是构造器?
生成器是实现迭代器的一种机制。它功能的实现依赖于yield表达式,除此之外它跟普通的函数没有两样。

8、在Python中什么是slicing?
Slicing是一种在有序的对象类型中(数组,元组,字符串)节选某一段的语法。

9、Python中的unittest是什么?
在Python中,unittest是Python中的单元测试框架。它拥有支持

10、Python中的pass是什么?
Pass是一个在Python中不会被执行的语句,它常常被用于占位符。

11、Python中的匿名函数 lambda是什么?好处?为什么lambda没有语句?
这是一个常被用于代码中的单个表达式的匿名函数。不用定义函数名称,不用担心函数名冲突,适合函数体比较简单的语句,匿名函数lambda没有语句的原因,是它被用于在代码被执行的时候构建新的函数对象并且返回。
map,filter,reduce函数都使用

12、什么是Python的命名空间?
在Python中,所有的名字都存在于一个空间中,它们在该空间中存在和被操作。

13、字典推导式和列表推导式是什么?
它们是可以轻松创建字典和列表的语法结构。

14、参数按值传递和引用传递是怎样实现的?
Python中的一切都是类,所有的变量都是一个对象的引用。引用的值是由函数确定的,因此无法被改变。但是如果一个对象是可以被修改的,你可以改动对象。

15、Python 中列表和元组的区别是什么?元组是不是真的不可变?
列表可变,元组不可变。另外,元组可以被哈希,比如作为字典的关键字。元组不可变,如果元组里面有列表或者变量的时候,那么元祖就可以发生变化.但其实元组还是没变,因为元组指向的是列表,始终没变,里面有变量,也是这样,指向的是变量.但是已经满足我的需求,让元祖在不同情况下,输出不同的结果.

16、什么是Python装饰器?
Python装饰器是Python中的特有变动,可以使修改函数变得更容易。

17、有哪些工具可以帮助debug或做静态分析?
PyChecker是一个静态分析工具,它不仅能报告源代码中的错误,并且会报告错误类型和复杂度。Pylint是检验模块是否达到代码标准的另一个工具。

18、Python是怎样管理内存的?垃圾回收机制是什么?
python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略

19.Python是如何被解释的?
Python是一种解释性语言,它的源代码可以直接运行。Python解释器会将源代码转换成中间语言,之后再翻译成机器码再执行。

20、什么是pickling和unpickling?
Pickle模块读入任何Python对象,将它们转换成字符串,然后使用dump函数将其转储到一个文件中——这个过程叫做pickling。

21、什么是PEP8?
PEP8是一个编程规范,内容是如何让你的程序更具可读性的建议

  1. 使用4个空格而不是tab键进行缩进。
  2. 每行长度不能超过79
  3. 使用空行来间隔函数和类,以及函数内部的大块代码
  4. 必要时候,在每一行下写注释
  5. 使用文档注释,写出函数注释
  6. 在操作符和逗号之后使用空格,但是不要在括号内部使用
  7. 命名类和函数的时候使用一致的方式,比如使用CamelCase来命名类,使用lower_case_with_underscores来命名函数和方法
  8. 在类中总是使用self来作为默认
  9. 尽量不要使用魔法方法
  10. 默认使用UTF-8,甚至ASCII作为编码方式
  11. 换行可以使用反斜杠,最好使用圆括号。
  12. 不要在一句import中多个库,
    .空格的使用
    各种右括号前不要加空格。
    逗号、冒号、分号前不要加空格。
    函数的左括号前不要加空格。如Func(1)
    序列的左括号前不要加空格。如list[2]
    操作符左右各加一个空格,不要为了对齐增加空格
    函数默认参数使用的赋值符左右省略空格
    不要将多句语句写在同一行,尽管使用‘;’允许
    if/for/while语句中,即使执行语句只有一句,也必须另起一行
    函数命名使用全部小写的方式,常量命名使用大写,类属性(方法和变量)使用小写
    类的命名首字母大写

22、到底什么是python?
Python的运行速度相较与C,慢。
解释型语言
这门语言是由C开发而来
高效的高级数据结构,少量的代码构建出很多功能
动态类型,比如python3的list列表

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

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

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

python迭代器
迭代器是通过next()来实现的,每调用一次他就会返回下一个元素,当没有下一个元素的时候返回一个StopIteration异常,
所以实际上定义了这个方法的都算是迭代器。

python生成器
生成器是构造迭代器的最简单有力的工具,与普通函数不同的只有在返回一个值的时候使用yield(若一个函数中加入了yield语句,那么这个函数就被增强了,变成了一个生成器:generator。
对于一个函数,其程序执行到了yield语句,那么它选择了投降,返回一个结果,这个函数被中断,然后随着生成器的next的执行,该函数从中断的地方执行。)来替代return,然后yield会自动构建好next()和iter()

24、什么是闭包?
如果内部函数引用了外部函数里定义的对象,甚至是外层之外,但不包含全局变量,那么此时内部函数又称为闭包函数。闭包函数强大在于可以将自己的代码与作用域与外部函数的作用结合在一起。

25、如何提高Python运行效率?

  1. 关键代码使用外部功能包
  2. 在排序时使用键和内置的sort()方法
  3. 针对循环的优化,尽量避免在循环中访问变量的属性,不要再循环体内部调用函数。
  4. 使用较新的Python版本
  5. 交叉编译你的应用
  6. 数据结构一定要选对
  7. 多用python中封装好的模块库,比如numpy,matplotlib,pandas
  8. 找出速度瓶颈

26、请写一个例子,用到继承。
需要实例化类。继承就是继承父类或者基类属性和方法。

27、深拷贝和浅拷贝?
copy()是浅拷贝,只拷贝可变对象的父级元素,deepcopy()是深拷贝。递归拷贝可变对象的所有元素。
浅拷贝只是增加了一个指针指向一个存在的地址,而深拷贝是增加一个指针并且开辟了新的内存,这个增加的指针指向这个新的内存,采用浅拷贝的情况,释放内存,会释放同一内存,深拷贝就不会出现释放同一内存的错误

28、 Python的函数参数传递方法?
位置传递,关键字传递,默认值传递,不定参数传递(包裹传递)和解包裹传递。
包裹传递,所有的参数被参数name收集,根据位置合并成一个元组(tuple),这就是包裹位置传递。为了提醒Python参数,name是包裹位置传递所用的元组名,在定义func时,在name前加*号。

29、Python中的元类(metaclass)有哪些?
类也是对象,函数type实际上是一个元类。type就是Python在背后用来创建所有类的元类,str是用来创建字符串对象的类,而int是用来创建整数对象的类。type就是创建类对象的类。你可以通过检查__class__属性来看到这一点。Python中所有的东西,注意,我是指所有的东西——都是对象。这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来。元类就是创建类这种对象的东西。元类的主要目的就是为了当创建类时能够自动地改变类。

我们用class关键字定义的类本身也是一个对象,负责产生该对象的类称之为元类(元类可以称为类的类),内置的元类为type一个类没有声明自己的元类,默认他的元类时type,除了使用内置元类type,我们也可以通过继承type来自定义元类,然后使用mataclass关键字参数为一个类指定元类

30、@staticmethod和@classmethod的区别?
classmethod 必须有一个指向类对象的引用作为第一个参数,而 staticmethod 可以没有任何参数。

31、类变量和实例变量区别?
Python类的变量(类变量和实例对象变量)

  • 类变量(1)在类的设计里,class里def外,通过变量名能被赋值(2)在程序里,通过类对象(类名字)的点运算类名字也可被赋值。
  • Python实例对象变量 (1)类的设计时,def里通过self点运算变量名能被赋值,不一定非在init里,其他已被调用的方法函数里也行(2)程序里,通过实例对象的点运算变量名可被赋值

32、Python中单下划线和双下划线?
它表示该方法或者属性是该类型(的私有方法或属性。但其实在Python中不存在真正意义上的私有方法或者属性,前面加单下划线_只是表示你不应该去访问这个方法或者属性。

双下划线为了避免子类覆盖父类的方法。

开头结尾双下划线是魔法方法,是python自身调用的。

33、字符串格式化:%和.format?
它通过{}和:来代替传统%方式

常用的format用法
通过位置、通过关键字、通过对象属性、通过下标
填充与对齐
填充常跟对齐一起使用
^、<、>分别是居中、左对齐、右对齐,后面带宽度
:号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充。

34、怎么理解Python中重载?
子类根据自己的需要,重写父类中的方法。

35、新式类和旧式类
新式类都从object继承,经典类不需要。
新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用深度优先搜索
新式类相同父类只执行一次构造函数,经典类重复执行多次。

36、new__和__init__的区别
创建一个新实例用__new
,初始化一个实例用__init__,这是区别。
__new__返回构造对象,__init__不会,__new__必须以cls作为第一个参数,而__init__以self为第一个参数。

37、单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。实现单例模式的几种方式 1、使用模块进行引用,保证实例对象只有一次。2、使用装饰器 3、基于__new__方法实现(推荐使用,方便),当我们实现单例时,为了保证线程安全需要在内部加入锁。 4、基于metaclass方式实现。

38、Python中的作用域
变量作用域
Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。
global 和 nonlocal关键字
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。

39、GIL线程全局锁与多线程并发
https://www.cnblogs.com/moning/p/7508019.htmlhttps://www.cnblogs.com/amesy/p/8067583.html

40、Python函数式编程
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
例如:高阶函数(map、reduce、sorte)、匿名函数、装饰器、偏函数等。

41、解释python中的三元表达式三元运算写法和应用场景?
【on true】 if 【expression】else 【on false】,lambda 表达式

42、read,readline和readlines
read()直接读取字节到字符串中,包括了换行符
readline()方法每次读取一行;返回的是一个字符串对象,保持当前行的内存  
readlines()读取所有行然后把它们作为一个字符串列表返回。readlines方法一次性读取整个文件;自动将文件内容分析成一个行的列表。
xreadlines 返回一个生成器

43、静态链接和动态链接的区别是什么
(一)静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,lib中的指令都全部被直接包含在最终生成的exe文件中了。但是若使用dll动态链接库,该dll不必被包含在最终的exe文件中,执行文件执行时可以动态地引用和卸载这个与exe独立的dll文件(二)静态链接库不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 使用差别静态链接库动态链接库使用的区别在于它允许可执行模块(dll或exe文件)仅包含在运行时定位dll函数的可执行代码的所需信息。静态链接库的使用中,连接器从静态链接库获取所有被引用的函数,并将库同代码一起放到可执行文件中。

44、is 和 == 的区别?
is 表示的是对象标示符(object identity),而 == 表示的是相等(equality)。is 的作用是用来检查对象的标示符是否一致,也就是比较两个对象在内存中的地址是否一样,而 == 是用来检查两个对象是否相等。a is b 的时候,其实相当于检查 id(a) == id(b)。而检查 a == b 的时候,实际是调用了对象 a 的 eq() 方法,a == b 相当于 a.eq(b)。

45、一行代码实现九九乘法表
print(’\n’.join([’\t’.join(["%2s*%2s=%2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))

46、一行代码删除列表中重复的数字
sorted(set(list),key=list.index)

47、a=(5)与b=(5,)的区别
元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用

48、.find()和.index()的区别
s.index(x):返回字符串中出现x的最左端的索引值,如果不在则抛出valueError异常
s.find(x) :返回字符串中出现x的最左端字符的索引值,如果不在则返回-1

49、将一个ASCII字符转换为对应整数
ord()

50、*arg和**kwarg的作用
从上面的例子可以看到,当我传入了更多实参的时候
*arg会把多出来的位置参数转化为tuple
**kwarg会把关键字参数转化为dict

51、如何判断是函数还是方法?
看他的调用者是谁,如果是类,就需要传入一个参数self的值,这时他就是一个函数,
如果调用者是对象,就不需要给self传入参数值,这时他就是一个方法

52、python内存泄漏

Web 框架

1、python的web框架有哪些?

2、什么是 Django?,Django 遵循什么样的设计模式?它和MVC是怎么对应的?Django 中的缓存是怎么用的?现在让你写个登陆页面,你要怎么写?
MVC框架,模板中我们知道变量使用了双括号。Django 使用模板标签,模型(Model)、模板(Template)和视图(Views)

3、说一下 session 和 cookie 区别。为什么 cookie 是不安全的?
cookie以文本格式存储在浏览器上,存储量有限;而会话session存储在服务端,可以无限量存储多个变量并且比cookie更安全

4、Redis原理
https://www.jianshu.com/p/36a646cef11a

5、RESTful架构(SOAP,RPC)
https://www.runoob.com/w3cnote/restful-architecture.html

爬虫

1、说一下你写爬虫的时候用到过的包
urllib以及urllib2urllib库发送请求、BeautifulSoup 库 ,一款优秀的HTML/XML解析库,Requests 库,一款比较好用的HTTP库,Fiddler. 工具,这是一个HTTP抓包软件,能够截获所有的HTTP通讯。
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。

2、请用正则表达式写一下邮箱的地址。
^ [a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$

3、说一下 Python 爬虫的框架,你用过哪个?做过什么样的爬虫吗?
PySpider 、Crawley 4.Portia 、Newspaper 、Beautiful Soup 、Grab 8.Cola

4、什么是反爬虫?说一下你知道的反爬虫,各自是什么特点,该如何解决?
浏览器伪装
IP代理池和用户代理池构建
动态页面加载解决方法
数据头User-Agent反爬虫机制(Headers,Headers(上一讲中已经提及) 是一种区分浏览器行为和机器行为中最简单的方法)
访问频率限制

5、Ajax
Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
通过在后台与服务器进行少量数据交换,AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。XMLHttpRequest 用于在后台与服务器交换数据。XMLHttpRequest 是 AJAX 的基础。

6、urllib和urllib2的区别
urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应:

数据库

1、什么是索引?什么字段适合建立索引?索引的优缺点你知道吗?
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。
主键是一种唯一性索引,唯一索引列的所有值都只能出现一次,即必须唯一。索引可以是单列索引,也可以是多列索引。

2、什么是事务?
事务是恢复和并发控制的基本单位。事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

3、知道范式吗?说一说数据库的第三范式?
https://blog.csdn.net/qq_33862644/article/details/79692652

4、写 SQL 语句吗?如何给表中插入数据?如何更新数据?高级sql有哪些?
https://www.jianshu.com/p/e492a4262987

http://www.w3school.com.cn/sql/sql_unique.asp

5、MyISAM和InnoDB
https://www.cnblogs.com/y-rong/p/8110596.html
MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。

InnoDB不支持FULLTEXT类型的索引。

InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含 where条件时,两种表的操作是一样的。

对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

计算机网络

1、说一说什么是 TCP/IP 协议?
简单不写了。

2、知道什么是三次握手和四次挥手吗?简单描述一下。
https://www.cnblogs.com/lms0755/p/9053119.html

三次握手(three times handshake;three-way handshake)所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。

为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。python面试题目_第1张图片
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

3、Post 和 Get 有什么区别?
浏览器和服务器之间有如下几种通信方式:
GET:向服务器请求资源,请求以明文的方式传输,一般就在URL上能看到请求的参数
POST:从网页上提交表单,以报文的形式传输,请求资源

4、TCP 和 UDP 有什么区别?
TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。
在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
在传输层中有TCP协议与UDP协议。
在应用层有FTP、HTTP、TELNET、SMTP、DNS等协议。
因此,HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议。
1)基于连接与无连接;
2)对系统资源的要求(TCP较多,UDP少);
3)UDP程序结构较简单;
4)流模式与数据报模式 ;
5)TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

5、知道 Socket 网络编程吗?知道怎么用吗?
https://www.cnblogs.com/maociping/p/5112019.html

操作系统

1、什么是死锁?如何预防死锁?乐观锁和悲观锁?
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。死锁中的竞争资源之一指的是竞争不可剥夺资源。
〈1〉打破互斥条件。
〈2〉打破不可抢占条件。
〈3〉打破占有且申请条件

2、编译原理?
编译器将原始程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。源代码一般为高阶语言 (High-level language), 如 python等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。

3、说一下什么是虚拟内存技术。
虚拟内存技术允许执行进程不必完全的在内存当中,这种方案的显著的优点就是程序可以比物理内存大,虚拟内存其实就是把内存抽象成了一个巨大的、统一的存储数组,进而会将用户所看到的逻辑内存与物理内存分开

4、用过 Linux 吗?在上面搭过环境吗?说一下常用的指令。
https://www.cnblogs.com/yjd_hycf_space/p/7730690.html

5、apache和nginx的区别
https://www.cnblogs.com/huangye-dream/p/3550328.html

数据结构与算法

1、说一说你所知道的排序算法,它们的时间复杂度和空间复杂度分别是多少?

2、手写一下冒泡排序和快速排序。

3、在纸上用两个栈模拟队列,再实现用两个队列模拟栈的操作。
python面试题目_第2张图片
python面试题目_第3张图片
4、知道什么是动态规划吗?

5、手写一下将二叉树转化成双向链表。

6、手写一下将两个有序链表合并成一个有序链表。

7、手写一下二叉树的层次遍历。

8、手写如何判断一棵二叉树是否为另一棵二叉树的子树。

9、广度遍历和深度遍历二叉树编程问题

10、回溯法与迷宫问题
当问题是要求满足某种性质的所有解或最优解时,往往使用回溯法。

当所给问题是从n个元素的集合S中找出满足某种性质的子集时,解空间为子集树。例如:0-1背包问题

当所给问题是从n个元素的集合S中找出满足某种性质的排列时,解空间为排列树。例如:旅行售货员问题

深度优先策略是基于栈的,宽度优先策略是基于队列的。

你可能感兴趣的:(python,python面试)