嘿~大家好,我是小编软件测试君:

本次呢,小编给大家发送一篇面试题,一共有60多道题~ 咱们一起来看看吧,请耐心阅读,可能会有点长长长长长长长长…

一、一行代码输出九九乘法表

print ('\n'.join([' '.join(['%s*%s=%s '%(j,i,j*i) for j in range(1,i+1)]) for i in range(1,10)]))

分析:

利用Python中的模板字符串,列表生成式,还有Python中的join方法(Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。格式:“,”.join(seq))

# arr = "\n".join([",".join(['%s*%s=%s '%(j,i,j*i) for j in range(1,i+1)]) for i in range(1,10)])obj = (i for i in range(1,10))print ('i for i in range(1,10)输出结果:',obj)# 输出:<generator object <genexpr> at 0x0157FDF0># i for i in range(1,10) 这个语句生成一个迭代器对象  如果想将这个对象的值打印出来  可以将其转化为列表list = [i for i in range(1,10)]print('list输出:',list)# 输出    list输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]print(['%s*%s=%s'%(j,i,j*i) for j in range(1,i+1)] for i in range(1,10))# 输出:<generator object <genexpr> at 0x003CFE70>print(','.join(['%s*%s=%s'%(j,i,j*i) for j in range(1,i+1)]) for i in range(1,10))# 输出:<generator object <genexpr> at 0x003CFE70># 此时,仅仅是将列的输出转化为字符串形式,没有将行的输出转化为字符串,所以还需要进行下一步转换print('\n'.join([' '.join(['%s*%s=%s'%(j,i,j*i) for j in range(1,i+1)]) for i in range(1,10)] ))# 将\n 赋值给 join的链接符 实现输出一行时候进行换行操作

二、对函数流程控制的理解

def partition(L,p,r):x = L[r]i = p - 1for j in range(p,r):if L[j] <= x:i += 1L[i],L[j] = L[j],L[i]L[i+1],L[r] = L[r],L[i+1]A = [3,1,7,2,6,8,4,5]partition(A,0,len(A)-1)print(A)# 分析:'''L=[3,1,7,2,6,8,4,5]  index=7  len=8          p=0         r=len(A)-1=7进入函数:x=L[r]=5  i=p-1=-1   进入循环:range(p=0,r=7) j=0-7进入判断:L[j=0] <= x=L[r]=5i = i+1  => -1+1=0L[i=0],L[j=0] = 3,3L[j=1]  <= x=L[r]=5i += 1  => i=1L[i=1],L[j=1] = 1,1L[j=2]  <= x=L[r]=5passL[j=3]  <= x=L[r]=5i += 1  => i=2L[i=2],L[j=3] = 2,7       -------->L=[3,1,2,7,6,8,4,5]L[j=4]=6  <= x=L[r]=5passL[j=5]=8  <= x=L[r]=5passL[j=6]=4  <= x=L[r]=5i += 1   => i=3L[i=3],L[j=6] = L[j],L[i]  ------>L=[3,1,2,4,6,8,7,5]L[i+1],L[r] = L[r],L[i+1]   => L[3+1=4],L[7] = L[7],L[4]     ------->  ==> L=[3,1,2,4,5,8,7,6]  ==> L=[3,1,2,4,5,8,7,6]          '''

三、类的继承

class A(object):name = "A"class B(object):name = "B"class C(A,B):passprint(C.name)   # =>  先继承的A  输出AC.name = "C"print(A.name)   # => Aprint(B.name)   # =>Bprint(C.name)   # =>C

四、大数据的文件读取

(1)读取大几 G 的大文件,可以利用生成器 generator

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

with open('filename') as file:for line in file:do_things(line)

五、迭代器和生成器

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

(2)生成器( Generator)是创建迭代器的简单而强大工具。它们写起来就像是正规的函数,只在需要返回据时候使用 yield 语 句。每次 next()被调用,生成器会返回它脱离的位置,记忆语句最 后一次执行和所有数据。区别:生成器能做到迭代的所有事 ,而且因为自动创建了 iter()和 next()方法 ,生成器显得特别简洁 ,而且生成器也是 高效的 ,使用生成器表 达式取代列解析可以同时节省 内存。除了 创建和保程序状态的自动方法,当发生器终结时 ,还会自动抛出 StopIteration 异常

六、线程、进程、协程

进程是具有一定独立功能的程序关于某个数据集合上的一次运 行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程 都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进 程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、 寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全

线程是进程的一个实体,是 CPU 调度和分派的基本单位,它 是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统 资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存 器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的 全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开 销较少,但相比进程不够稳定容易丢失数据。

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下 文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上 下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访 问全局变量,所以上下文的切换非常快。

七、装饰器

装饰器是一个很著名的设计模式,经常被用于有切面需求的场景, 较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类 问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是 为已经存在的对象添加额外的功能。

装饰器(decorator)里引入通用功能处理:

  • 引入日志

  • 函数执行时间统计

  • 执行函数前预备处理

  • 权限校验等场景

  • 缓存

from time import ctime, sleepdef timefun(func):def wrappedfunc():print("%s called at %s"%(func.__name__,ctime()))return func()return wrappedfunc@timefundef foo():print("I am foo")foo()sleep(2)foo()

八、对同步异步阻塞非阻塞理解

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该 调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例 如 sin, isdigit 等)。但是一般而言,我们在说同步、异步的时候, 特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的 例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处 理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把 消息处理函数所返回的 LRESULT 值返回给调用者。

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

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

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数 不会阻塞当前线程,而会立刻返回。对象的阻塞模式和阻塞函数调用。对象是否处于阻塞模式和函数是 不是阻塞调用有很强的相关性,但是并不是一一对应的。阻塞对象上 可以有非阻塞的调用方式,我们可以通过一定的 API 去轮询状态,在 适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调 用特殊的函数也可以进入阻塞调用。函数 select 就是这样的一个例子。

九、GIL对多线程的影响?

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

可见,某个线程想要执行,必须先拿到 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 密集型代码比较友好。

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

  • 获取GIL

  • 执行代码知道sleep或者是python虚拟机讲其挂起

  • 释放GIL

十、Python中的反射?

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

11、Python2和Python3 的区别?

  • 性能 Py3.0 运行 pystone benchmark 的速度比 Py2.5 慢 30%。Guido 认为 Py3.0 有极大的优化 空间,在字符串和整形操作上可 以取得很好的优化结果。Py3.1 性能比 Py2.5 慢 15%,还有很大的提升空间。

  • 编码 Py3.X 源码文件默认使用 utf-8 编码,这就使得以下代码是合法的:>>> 中国 = ‘china’ >>>print(中国) china

语法:

(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 代替:

(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 语法。

(15)支持 class decorator。用法与函数 decorator 一样。

(16)现在字符串只有 str 一种类型,但它跟 2.x 版本的 unicode 几乎一样。

(17)Py3.X 去除了 long 类型,现在只有一种整型——int,但它的行为就像 2.X 版本的 long 。

(18)新增了 bytes 类型,对应于 2.X 版本的八位串,定义一个 bytes 字面量的方法如下:str 对象和 bytes 对象可以使用.encode() (str-> bytes)or .decode()(bytes-> str)方法相互 转化。

(19)dict 的.keys()、.items 和.values()方法返回迭代器,而之前的 iterkeys()等函数都被 废弃。同时去掉的还有 dict.has_key(),用 in 替代它吧 。

(20)引入抽象基类(Abstraact Base Classes,ABCs)。

(21)容器类和迭代器类被 ABCs 化,所以 cellections 模块里的类型比 Py2.5 多了很多。

(22)迭代器的 next()方法改名为__next__(),并增加内置函数 next(),用以调用迭代器的 next()方法

(23)增加了@abstractmethod 和 @abstractproperty 两个 decorator,编写抽象方法(属性) 更加方便。

(24)所以异常都从 BaseException 继承,并删除了 StardardError 。

(25)去除了异常类的序列行为和.message 属性 。

(26)用 raise Exception(args)代替 raise Exception, args 语法。

(27)捕获异常的语法改变,引入了 as 关键字来标识异常实例。

(28)异常链,因为__context__在 3.0a1 版本中没有实现。

(29)移除了 cPickle 模块,可以使用 pickle。模块代替。最终我们将会有一个透明高效的模块。

(30)移除了 imageop 模块。

(31))移除了 audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timing 和 xmllib 模块。

(32)移除了 bsddb 模块(单独发布,可以从 http://www.jcea.es/programacion/pybsddb.htm 获 取)。

(33)移除了 new 模块

(34)os.tmpnam()和 os.tmpfile()函数被移动到 tmpfile 模块下 。

(35)tokenize 模块现在使用 bytes 工作。主要的入口点不再是 generate_tokens,而是 tokenize.tokenize()。

12、什么是线程安全

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

13、十个常用的linux命令

Ls、help、cd 、more、clear、mkdir、pwd、rm、grep、find、mv、su、date…

14、find和grep?

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

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

15、什么是面向对象编程

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

16、面向对象有那些技术?

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

  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体 之外。类变量通常不作为实例变量使用。数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。

  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这 个过程叫方法的覆盖(override),也称为方法的重写。

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

  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一 个 Dog 类型的对象派生自 Animal 类,这是模拟"是一个(is-a)"关系(例图,Dog 是一个 Animal)。

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

  • 方法:类中定义的函数。

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

17、静态方法和类方法?

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

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

18、类属性、实例属性?

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

  • 实例属性:定义在__init__()方法里的变量就是实例属性,这些属性只有被创建时才会被创建。

当类属性与实例属性同名时,一个实例访问这个属性时实例属性会覆盖类属性

19、需要执行一个定时任务,你会怎么做?

Linux 的 Crontab 执行命令: sudocrontab-e

例:0 */1 * * * /usr/local/etc/rc.d/lighttpd restart 每一小时重启 apache

20、线上服务可能因为种种原因导致挂掉怎么办?

Linux 下的后台进程管理利器 supervisor

每次文件修改后在linux执行:service supervisord restart

21、python的多进程与多线程的运行机制是什么?

有什么区别?分别在什么情况下用?

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

  • 程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有 的全部资源.

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

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

22、如何提高 Python 的运行效率

请说出不少于 2 种提高运行效率的方法。

  • 使用生成器:

  • 关键代码使用外部功能包:Cython、Pylnlne、PyPy、Pyrex

针对循环的优化——尽量避免在循环中访问变量的属性;

23、介绍“消费者”和“生产者”模型

  • 生产者&消费者模型是多线程同步的经典案例。此模型中生产者向缓冲区 push数据,消费者从缓冲区中pull数据。

  • 这个Demo 中缓冲区用python 实现的Queue 来做,这个模块是线程安全的使开发者不用再为队列增加额外的互斥锁.

信号处理的实现是这样的:

  • 主线程接到一个 SIGTERM 的信号后先通知Consumer停止向缓冲区 push数据并退出

  • Produer将缓冲区中的数据消费完全后在退出

  • 主线程退出

24、24.生产者消费者模型的优点:

  • 解耦:

假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那么生产 者对于消费者就会产生依赖(也就是耦合)。将来如果消费者的代码发生变化, 可能会 影响到生产者。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也就相应降 低了。

  • 支持并发:

由于生产者与消费者是两个独立的并发体,他们之间是用缓冲区作为桥梁连接,生产者只 需要往缓冲区里丢数据,就可以继续生产下一个数据,而消费者只需要从缓冲区了拿数据 即可,这样就不会因为彼此的处理速度而发生阻塞。

  • 支持忙闲不均:

如果制造数据的速度时快时慢,缓冲区的好处就体现出来了。当数据制造快的时候,消费 者来不及处理,未处理的数据可以暂时存在缓冲区中。等生产者的制造速度慢下来,消 费者再慢慢处理掉。

25、MySQL如何做分页

mysql数据库做分页用limit关键字,它后面跟两个参数startIndex和pageSize

26、mysql引擎有哪些,各自的特点是什么?

  • innodb和myisam两个引擎,两者区别是

  • innodb支持事物,myisam不支持

  • innodb支持外键,myisam不支持

  • innodb不支持全文索引,myisam支持全文索引

  • innodb提供提交、回滚、崩溃恢复能力的事物的安全能力,实现并发控制

  • myisam提供较高的插入和查询记录的效率,主要用于插入和查询

27、数据库怎么建立索引

create index account_index on `table name `(`字段名`(length))

28、单表多个字段,怎么创建组合索引

create index account_index on `table name `(`字段名`,'字段名')

29、如何应对数据的高并发,大量的数据计算

  • 创建索引

  • 数据库读写分离,两个数据库,一个作为写,一个作为读

  • 外键去掉

  • django中orm表性能相关的。select_related:一对多使用,查询主动做连表。prefetch_related:多对多或者一对多的时候使用,不做连表,做多次查询

30、数据库内连表、左连表、右连表

  • 内连接是根据某个条件连接两个表共有的数据

  • 左连接是根据某个条件以及左边的表连接数据,右边的表没有数据的话则为null

  • 右连接是根据某个条件以及右边的表连接数据,左边的表没有数据的话则为null

31、视图和表的区别

  • 视图是已经编译好的sql语句,是基于sql语句的结果集的可视化的表,而表不是。

  • 视图是窗口,表示内容

  • 视图没有实际的物理记录,而表有。视图的建立和删除只影响视图本身,不影响对应的表。

32、关系型数据库的特点

  • 数据集中控制

  • 数据独立性高

  • 数据共享性好

  • 数据冗余度小

  • 数据结构化

  • 统一的数据保护能力

33、MySQL数据库都有哪些索引

  • 普通索引: 普通索引仅有一个功能:加速查找 唯一索引:唯一索引两个功能:加速查找和唯一约束(可含null)

  • 外键索引:外键索引两个功能:加速查找和唯一约束(不可为null)

  • 联合索引:联合索引是将n个列组合成一个索引,应用场景:同时使用n列来进行查询

34、存储过程

存储过程不允许执行return语句,但是可以通过out参数返回多个值,存储过程一般是作为一个独立的部分来执行,存储过程是一个预编译的SQL语句。

35、Sql优化:

  • select句中避免使用 ‘*’

  • 减少访问数据库的次数

  • 删除重复记录

  • 用where子句替代having子句

  • 减少对表的查询

  • explain

36、char和vachar区别:

char是固定长度,存储需要空间12个字节,处理速度比vachar快,费内存空间。

vachar是不固定长度,需要存储空间13个字节,节约存储空间

37、Mechached与redis

  • mechached:只支持字符串,不能持久化,数据仅存在内存中,宕机或重启数据将全部失效不能进行分布式扩展,文件无法异步法。

  • 优点:mechached进程运行之后,会预申请一块较大的内存空间,自己进行管理。

  • redis:支持服务器端的数据类型,redis与memcached相比来说,拥有更多的数据结构和并发支持更丰富的数据操作,可持久化。

  • 五大类型数据:string、hash、list、set和有序集合,redis是单进程单线程的。

  • 缺点:数据库的容量受到物理内存的限制。

38、SQL注入

sql注入是比较常见的攻击方式之一,针对编程员编程的疏忽,通过sql语句,实现账号无法登陆,甚至篡改数据库。

防止:凡涉及到执行sql中有变量时,切记不要用拼接字符串的方法。

39、什么是触发器

是对查询出来的结果集作为一个单元来有效的处理,游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行,可以对结果集当前行做修改,一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

40、数据库支持多有标准的SQL数据类型

重要分为三类:

  • 数值类型(tinyint,int,bigint,浮点数,bit)

  • 字符串类型(char和vachar,enum,text,set)

  • 日期类型(date,datetime,timestamp)

41、MySQL慢查询

慢查询对于跟踪有问题的查询很有用,可以分析出当前程序里哪些sql语句比较耗费资源

慢查询定义:

指mysql记录所有执行超过long_query_time参数设定的时间值的sql语句,慢查询日志就是记录这些sql的日志。

mysql在windows系统中的配置文件一般是my.ini找到mysqld

log-slow-queries = F:\MySQL\log\mysqlslowquery.log 为慢查询日志存放的位置,一般要有可写权限

long_query_time = 2 2表示查询超过两秒才记录

42、memcached命中率

  • 命中:可以直接通过缓存获取到需要的数据

  • 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其他的操作,原因可能是由于缓存中根本不存在,或者缓存已经过期

  • 缓存的命中率越高则表示使用缓存的收益越高,应额用的性能越好,抗病发能力越强

运行state命令可以查看memcached服务的状态信息,其中cmd—get表示总的get次数,get—hits表示命中次数,命中率=get—hits / cmd—get

43、Oracle和MySQL该如何选择,为什么?

他们都有各自的优点和缺点。考虑到时间因素,我倾向于MySQL

选择MySQL而不选Oracle的原因:

  • MySQL开源

  • MySQL轻便快捷

  • MySQL对命令行和图形界面的支持都很好

  • MySQL支持通过Query Browser进行管理

44、什么情况下适合建立索引?

  • 为经常出现在关键字order by、group by、distinct后面的字段,建立索引

  • 在union等集合操作的结果集字段上,建立索引,其建立索引的目的同上

  • 为经常用作查询选择的字段,建立索引

  • 在经常用作表连接的属性上,建立索引

45、sql语句应该考虑哪些安全性?

  • 防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量

  • 最小权限原则,特别是不要用root账户,为不同的类型的动作或者组建使用不同的账户

  • 当sql运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄漏服务器和数据库相关信息

46、数据库事物有哪几种?

隔离性、持续性、一致性、原子性

47、MySQ数据表在什么情况下容易损坏?

  • 服务器突然断电导致数据文件损坏

  • 强制关机,没有先关闭mysq服务器等

48、drop,delete与truncate的区别

  • drop直接删除表

  • truncate删除表中数据,再插入时自增长id又从1开始 delete删除表中数据,可以加where子句

49、数据库范式

  • 第一范式:就是无重复的列

  • 第二范式:就是非主属性非部分依赖于主关键字

  • 第三范式:就是属性不依赖于其他非主属性(消除冗余)

50、MySQL锁类型

  • 根据锁的类型分:可以分为共享锁、排他锁、意向共享锁和意向排他锁

  • 根据锁的粒度分:可以分为行锁、表锁

  • 对于mysql而言,事务机制更多是靠底层的存储引擎来实现的,因此,mysql层面只有表锁,说明:对于更新操作(读不上锁),只有走索引才可能上行锁

  • MVCC(多版本并发控制)并发控制机制下,任何操作都不会阻塞读取操作,读取操作也不会阻塞任何操作,只因为读不上锁

  • 共享锁:由读表操作加上的锁,加锁后其他用户只能获取该表或行的共享锁,不能获取排他锁,也就是说只能读不能写 排他锁:由写表操作加上的锁,加锁后其他用户不能获取该表或该行的任何锁,典型mysql事物中的更新操作

  • 意向共享锁(IS):事物打算给数据行加行共享锁,事物在给一个数据行加共享锁前必须先取得该表的IS锁

  • 意向排他锁(IX):事物打算给数据行加行排他锁,事物在给一个数据行家排他锁前必须先取得该表的IX锁

51、如何解决MYSQL数据库中文乱码问题?

  • 在数据库安装的时候指定字符集

  • 如果在按完了以后可以更改配置文件

  • 建立数据库时候:指定字符集类型

  • 建表的时候也指定字符集

52、数据库应用系统设计

  • 规划

  • 需求分析

  • 概念模型设计

  • 逻辑设计

  • 物理设计

  • 程序编制及调试

  • 运行及维护

53、数据库常见面试问题总结

https://yq.aliyun.com/wenji/

54、中间件

中间件一般做认证或批量请求处理,django中的中间件,其实是一个类,在请求和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法,如请求过来 执行process_request, view,process_response方法。

55、Django、Tornado、Flask各自的优势

  • Django:Django无socket,django的目的是简便,快速开发,并遵循MVC设计,多个组件可以很方便的以“插件”形式服务于整个框架

    django有许多功能强大的第三方插件。django具有很强的可扩展性

  • Tornado:它是非阻塞式服务器,而且速度相当快,得力于其 非阻塞的方式和对epoll的运用,Future对象,缺点:没有session,需要自定制

  • Flask:是一个微型的web框架,配合SQLALchemy来使用,jinja2模板, werkzeug接口

56、django的template的注释是什么样子的

  • 单行:{#注释#}

  • 多行注释:{%comment%}

57、Django怎么弄并发的

nginx+uwsig为django提供高并发,nginx的并发能力超过,单台并发能力过完,在纯静态的web服务中更是突出其优越的地方,由于底层使用epoll异步IO模型进行处理。

58、tornodo的ioloop知道是什么吗?

事件循环:

  • select_related和prefetch_related,Q和F

  • select_related:一对多使用,查询主动做连表

prefetch_related:多对多或者一对多的时候使用,不做连表,做多次查询

  • Q:用于构造复杂查询条件

  • F:更新时用于获取原来的值,专门取对象中某一列进行操作

59、什么是ORM?

ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间做一个映射 ORM优缺点:

  • 优点:摆脱复杂的SQL操作,适应快速开发,让数据结果变得简单,数据库迁移成本更低

  • 缺点:性能较差,不适用于大型应用,复杂的SQL操作还需要通过SQL语句实现

60、CORS跨域资源共享

首先会发送"预检"opption",请求,如果"预检"成功,则发送真实数据。

61、Django的Form主要具有以下功能?

生成HTMl标签,验证用户数据 is_vaild,HTML Form提交保留上次提交数据,初始化页面显示内容。

62、CBV和FBV

CBV在指定的类上面加上装饰器或在此方法上面添加装饰器

@method_decorator,并继承view

63、cookie及session

  • cookie:是保留在客户端上面的一组键值对,cookie不是很安全,别人可以分析存放在本地的cookie

  • session:是保存在服务器上面的一组键值对,依赖与cookie,安全指数比cookie高

64、django的请求生命周期

请求来了先到uwsgi,把请求做一部分分装给django框架,然后经过所有的中间件,路由,视图,视图处理再返回给中间件,中间件在返回给uwsgi,在返回给用户。

65、uwsgi和wsgi

  • wsgi: 是web服务器网关接口,是pyhton应用程序或框架和web服务器之间的一种接口,其广泛使用的是django框架。
  • wsgi: 是一个web服务器,它实现了wsgi协议,Nginx中HttpUwsgiModule的作用是与Uwsgi服务器进行交换

66、解释下django-debug-toolbar的使用

使用django开发站点时,可以使用django-debug-toolbar来进行调试,在settings.py中添加 'debug—toolbar.midleware.Debug ToolbarMiddleware’到项目的MIDDLEWARE_CLASSES内。

最后: 可以关注公众号:伤心的辣条 ! 进去有许多资料共享!资料都是面试时面试官必问的知识点,也包括了很多测试行业常见知识,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

万字精华——Python常见的60+面试题合集双手奉上!相关推荐

  1. 前端常见手写面试题合集

    实现一个函数判断数据类型 function getType(obj) {if (obj === null) return String(obj);return typeof obj === 'obje ...

  2. 2023年网络安全工程师面试题合集【首发】

    以下为信息安全各个方向涉及的面试题,星数越多代表问题出现的几率越大,祝各位都能找到满意的工作~ [一一帮助安全学习[点我]一一]①网络安全学习路线②20 份渗透测试电子书③安全攻防 357 页笔记④5 ...

  3. 2021金三最新自动化测试面试题合集(含答案)!

    金三已经过去了,相信很多小伙伴在为银四做准备,这里给大家整理了一些金三中有被问到的自动化测试面试题合集,希望会小伙伴们有所帮助! 需要面试题合集的小伙伴,可点击这里领取哦! web自动化测试: 1.S ...

  4. 大学“电路分析基础”试题合集第四章

    大学"电路分析基础"试题合集第一章 大学"电路分析基础"试题合集第二章 大学"电路分析基础"试题合集第三章 "电路分析基础&quo ...

  5. 测试工程师面试题合集系列[4]

    测试工程师面试题合集又来更新啦~ 一面 请分别介绍最近主要负责的两个项目. 接口测试,你会关注哪些点,怎么开展接口测试工作? 请写一下接口自动化的参数化实现,写完做个简单讲解 get 和post 请求 ...

  6. 10000小时法则,从外包—字节靠着这份软件测试面试题合集,狂拿15家Offer!(秃头,吐血整理)

    前言 没有绝对的天才,只有持续不断的付出.对于我们每一个平凡人来说,改变命运只能依靠努力+幸运,但如果你不够幸运,那就只能拉高努力的占比. 2020年7月,我有幸成为了字节跳动的一名测试工程师,正如标 ...

  7. python两个集合的交集 合集 差集

    python两个集合的交集 合集 差集 https://blog.csdn.net/qq_17753903/article/details/84899612 python & | and or ...

  8. python使用手册-python 教程与手册(60IN1合集)

    python 教程与手册(60IN1合集)1个豆 下载地址: CGI介绍及使用Python来开发CGI应用示例.pdf dive into python Django绝对简明教程.pdf Gray H ...

  9. 9012年大厂面试题合集:Java技术栈为什么竞争越来越激烈?

    就今年大环境来看,跳槽成功的难度比往年高很多,一个明显的感受:今年的Java技术栈面试,无论一面还是二面,都特别考验Java程序员的技术功底. 最近有人搜集了93套腾讯.阿里.美团.百度.网易等公司9 ...

最新文章

  1. MariaDB Spider:实现MySQL横纵向扩展的小能手
  2. Python中对象的引用与复制
  3. G. GCD Festival(莫比乌斯、欧拉函数)
  4. java弹弹球实验报告_Java弹球游戏实验报告—chen
  5. python pandas excel 排序_Pandas 按组汇总和列排序 - python
  6. 如何使用pattern recognition letter 的word写作模板
  7. ENVI入门系列教程---二、图像分析---12. 图像分类流程化工具
  8. 安装北京极通EWebs作为企业虚拟化平台突然出现应用程序无法访问的现象
  9. series选取值_midas界面单元参数取值说明
  10. 大道至简:智能语义检测的武林
  11. 流量控制理论与Sentinel
  12. 凹凸世界手游服务器维修,凹凸世界手游进不去怎么办 解决方法介绍
  13. 假新闻遇上AI,祸兮福兮?
  14. 170915 逆向-问鼎杯题库(小磊生病了)
  15. MuleSoft----初识mulesoft
  16. 大学生普通话测试软件,普通话测试app
  17. 第十三届蓝桥杯大赛软件赛省赛(C/C++ 大学A组)
  18. 计划处理链的很多种情况factory calendar
  19. python pdf 数据转excel 表格_python实现PDF中表格转化为Excel的方法
  20. JVM内存模型学习(入门)

热门文章

  1. nginx css 304 导致图片丢失_Nginx面试三连问:如何工作?负载均衡策略有哪些?如何限流?...
  2. where 1=1会影响索引吗_MySQL之InnoDB存储引擎:索引的使用
  3. python 读取数据库内存爆_解决python读取几千万行的大表内存问题
  4. 计算机科学已发展成为一门,计算机前沿技术论文
  5. 本地html如何导出pdf,html表格以pdf格式导出到本地
  6. C++ Vectors
  7. 关于USES_CONVERSION宏
  8. 镜头的分类及选购指南
  9. Halcon:基本例程
  10. js string转json要注意的地方