当前位置:   article > 正文

Python 综合面试题(附参考答案)_python你:可以按照项目的基础架构、各个功能模块细分技术栈做一些描述 面试官:在

python你:可以按照项目的基础架构、各个功能模块细分技术栈做一些描述 面试官:在

Python 综合面试题
第一部分 Python 基础

  1. 如何理解 python 中的深度拷贝和浅拷贝
    浅拷贝旨在减少内存的占用,深拷贝可以在做数据的清洗、修改或者入库
    的时候,对原数据进行复制一份,以防数据修改之后,找不到原数据。深浅拷
    贝对于可变和不可变类型的数据不同。
    不可变类型包括数值类型、字符串、布尔、None、元组
    可变类型:列表、字典
    对于不可变对象类型,没有深浅拷贝的说法,无论是深拷贝还是浅拷贝结
    果一样的,如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已。
    对于可变类型来说,浅拷贝只复制容器,不复制容器中元素;深拷贝复制
    容器,元素如果是可变类型,也复制元素
  2. 请说说 get 请求与 post 请求的不同:
    1.GET 表示从指定的服务器中获取数据 ,POST 表示提交数据给指定的服
    务器处理
    2.GET 查询的字符串参数显示在地址栏的 URL 中,请求参数是可见
    的.POST 查询字符串不会显示在地址栏中,请求参数是不可见的
    3.GET 请求能够被缓存,POST 请求不能被缓存下来
    4.GET 请求会保存在浏览器的浏览记录中,POST 请求不会保存在浏览器浏
    览记录中
    5.GET 请求有长度限制,POST 请求没有长度限制
    6.GET 查询的字符串参数会显示在地址栏的 URL 中,不安全,请不要使用
    GET 请求提交敏感数据
    POST 请求数据不会显示在地址栏中,也不会缓存下来或保存在浏览记录
    中,所以 POST 请求比 GET 请求安全,但也不是最安全的方式。如需要传送
    敏感数据,请使用加密方式传输
  3. python2 和 python3 的区别
    第一、Python2 中创建类区分新式类和旧式类,默认创建旧式类,继承
    object 则创建新式类。Python3 中则移除了旧式类,默认创建新式类。
    第二、python2 中字节字符串类型为 str,文本字符串类型为 Unicode
    python3 中字节字符串类型为 bytes,文本字符串类型为 str
    第三、python2 中直接赋值即可声明元类,python3 中则通过 class 关键字
    声明元类
    第四、一些 python2 中的类库,在 python3 中进行了合并,如 StringIO 和
    cStringIO 合并为 IO 等
    第五、python2 中默认的字符串类型默认是 ASCII 编码,python3 中默认的
    字符串类型是 Unicode 编码,无论字节数占用大小,均占用字符串的一个下标。
    第六、python2 中,print 是个特殊语句,python3 中 print 是函数
    第七、python2 中单斜杠除法运算的结果是整型,python3 中是浮点类型,
    如 3 通过单斜杠除号除以 2,在 python2 中等于 1,在 python3 中等于 1.5
    第八、python2 中异常链会丢失原始异常信息,python3 中可以显式指定一
    个异常作为另一个异常的子句
    第九、python2 中的 dict 类中的 keys、values 和 items 属性均返回 list 对
    象,iterkeys、itervalues 和 iteritems 返回生成器对象。
    python3 中移除了 list、只返回一个生成器的对象。
    第十、python3 中需要使用 from 进行相对导入,python2 中仅要求不写路
    径即可
  4. Python 中 classmethod 与 staticmethod 的区别
    classmethod 是类方法,staticmethod 是静态方法,都属于类,为所有
    对象共有;但 classmethod 有参数 cls,这个参数是类对象,由系统自动传
    递;staticmethod 没有类对象参数。
    classmethod 在一些工厂类的情况下使用较多,也就是说 OOP 里继承的
    时候使用,staticmethod 一般情况下可以替换为外部的函数,后者继承的时
    候不可更改,和 C++/JAVA 中的静态方法很相似
  5. 如何在不改变原有 list 顺序的前提下,去除该 list 中的重复代码
    1, 使用循环实现
    2, 使用列表生成式
    3, 使用排序实现
  6. 请说说,python 中不同类型的数据变量在内存中是如何存储的
    python 中一切皆对象,对象的存储,采用了引用语义的方式;系统会保
    存对象的引用数量,当某个对象的引用数量为 0 时,对象会被回收。
    变量定义: a = 3 在这里 3 就是一个整型对象,3 这个对象的地址保存
    到变量 a 中,变量存储的只是一个对象的内存地址,而不是这个对象本身
    变量保存了对象的地址,也称变量引用了对象
  7. 请解释 with 关键字的用法
    上下文管理器:上下文管理器对象实现了__enter__() 和 exit() 方法。
    enter() 方法在语句体执行之前进入上下文时执行 ,exit() 在语句体
    执行完后从上下文退出时执行。
    with 语句支持运行时上下文这一概念。
    语法:with 表达式 [as 变量]:
    语句体
    作用:经常用于保存和恢复各种全局状态,锁定和解锁资源,关闭打开的
    文件等。
    例子:with open(‘1.txt’) as fp:
    for line in fp:
    prin(line)
    这里使用了 with 语句,不管在处理文件过程中是否发生异常,都能保证
    with 语句执行完毕后已经关闭了打开的文件句柄。如果不用 with 语句,
    则要使用 try-except-finally 处理,语法变的复杂。
  8. 请说说 python 中正则表达式如何提取数据
    利用正则表达式来提取想要的内容要使用分组。
    分组就是用一对圆括号“()”括起来的正则表达式,匹配出的内容就表示
    一个分组。从正则表达式的左边开始看,看到的第一个左括号“(”表示第一
    个分组,第二个表示第二个分组,依次类推,需要注意的是,有一个隐含的全
    局分组(就是 0),就是整个正则表达式。
    要想提取数据,首先你需要写出正确的正则表达式,在表达式中把要提取
    的内容使用分组括起来;然后执行 match 或 search 匹配;匹配后使用 group
    (num)和 groups 方法获取提取内容, 也可以使用 findall()
  9. 请说说 python 中 list,set,dict,tuple 的区别
    list 和 tuple 区别:
    1)list 用[]定义,tuple 用()定义
    2)list 是可变容器,可以修改其中的元素,tuple 属于不可变容器,不能
    修改元素。
    3)tuple 属于不可变容器,没有深复制和浅复制,list 有深复制和浅复制
    4)list 一般不做函数参数的默认值,tuple 可以做函数参数的默认值
    dict 和 set 区别:
    1)dict 可以通过 key 访问,set 不行
    2)dict 键不可以重复,值可以重复,set 不允许有重复元素
    3)dict 可以根据键修改值,set 不能修改元素
    10.请说说队列与栈两种数据结构如何实现
    栈:后进先出,可以使用列表实现,只需要把操作固定到列表一端,这个
    列表就可以当栈使用
    队列:先进先出,可以使用列表实现,在一端固定插入元素,在另外一端
    删除元素就可以实现队
    11.请说说 python 中args 与**kwargs 的用法与区别
    python 的函数参数可以有多种形式,其中如果要接收任意多个位置参
    数,可以将参数声明为
    args,其中 args 只是变量名字,可以是任何合法变量
    名,例如函数 def demo(*args);可以接收以下传参:
    demo(1)
    demo(1,2)
    demo(1,2,3,4)
    如果函数形参声明为**kwargs,则表示函数可以接收任意关键字参数,
    比如 def test(kwargs),则可以有如下调用方式:
    test(a=1)
    test(a=1,b=3)
    test(a=1,b=5,d=100)
    区别:
    1)args 中 args 是元组,可以通过 args 元组获取所有位置参数
    2)**kwargs 中的 kwargs 是字典,可以通过 kwargs 获取所有关键
    字参数.
    3)在函数的形参中,如果同时有
    args 和
    kwargs,*args 必须在
    **kwargs 前面.
    12.请说说 python 中 type 函数与 isinstance() 的区别
    1, 目的不同: type 主要用于返回对象的类型,isinstance 用于判断对象是否
    是指定类型
    2, 返回值不同: type 返回类型,isinstance 返回 True 或 False
    3, type 不能判断子类对象是否属于父类,而 isinstance 可以
    13.请叙述下 python 如何复制一个大文件
    1)打开源文件(读)和目标文件(写)
    2)从源文件中读取指定大小的字节,比如 1024,将其写入目标文件
    3)重复 2)直到源文件读完
    4)关闭源文件和目标文件
    def mycopy(src_file, dst_file):
    try:
    with open(src_file, “rb”) as fr, open(dst_file, ‘wb’) as fw:
    while True:
    data = fr.read(1024)
    if not data:
    break
    fw.write(data)
    except OSError:
    print(“打开读文件失败”)
    except:
    print(“可能 U 盘被拔出…”)
    14.请解释下什么是解释性语言,什么是编译性语言
    编译型语言:编译型语言写的程序执行之前,需要一个专门的编译过程,
    把程序编译成机器语言文件;比如,exe 文件,以后运行的话就不用重新编译
    了,直接运行;因为翻译只做了一次,运行时不需要编译,所以编译型语言
    的程序执行效率高!
    解释型语言:解释型语言的程序不需要编译,省了道工序,解释型语言在
    运行程序的时候才翻译,比如解释型 basic 语言,专门有一个解释器能够直接
    执行 basic 程序,每个语句都是执行的时候才翻译;这样解释型语言每执行一
    次就要翻译一次,效率比较低。但是解释型语言跨平台性比较好,因为他依赖
    解释器,只要平台装有解释器程序就行。
    15.请简单的叙述下数据存储原理
    (1)顺序存储方法
    该方法把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点间的
    逻辑关系由存储单元的邻接关系来体现。由此得到的存储表示称为顺序存储
    结构 (Sequential Storage Structure ),通常借助程序语言的数组描述。
    该方法主要应用于线性的数据结构。非线性的数据结构也可通过某种线性化
    的方法实现顺序存储。
    (2)链接存储方法
    该方法不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系由
    附加的指针字段表示。由此得到的存储表示称为链式存储结构(Linked
    Storage Structure), 通常借助于程序语言的指针类型描述。
    (3)索引存储方法
    该方法通常在储存结点信息的同时,还建立附加的索引表。索引表由若干索
    引项组成。索引项的一般形式是:(关键字、地址)。关键字是能唯一标识一个
    结点的那些数据项。
    (4)散列存储方法
    该方法的基本思想是:根据结点的关键字直接计算出该结点的存储地址。
    16.请说下您平时是怎么调错的
    1)print 调错:把所有可能出错的变量都打印出来,看看是哪段代码出错。
    用 print 最大的坏处是将来还得删掉它
    2)assert 断言调试:凡是用 print 来辅助查看的地方,都可以用断言
    (assert)来替代。如果断言失败,assert 语句本身就会抛出 AssertionError,
    不过,启动 Python 解释器时可以用-O 参数来关闭 assert。关闭后,你可以把所
    有的 assert 语句当成 pass 来看。
    3)可以启动 Python 的调试器 pdb 让程序以单步方式运行,可以随时查看运
    行状态。
    4)使用 IDE 调试:可以使用 pycharm、pydev 等集成开发环境设置断点,
    单步调试。
    17.请说说 python 中 while-else/for-else 语法的用法
    while-else:
    while 表达式:
    循环体
    else:
    【else 语句块】
    说明:当 while 语句执行完成之后,执行【else 语句块】,如果用 break
    跳出循环则不执行 else
    for-else:
    for x in 表达式:
    循环体
    else:
    【else 语句块】
    说明:当 for 语句执行完成之后,执行【else 语句块】,如果用 break
    跳出循环则不执行 else
    18.请说说 python 中的作用域是怎样划分的
    概念:变量的作用域指的是变量在那段代码中可以使用,可以使用变量的那段
    代码就是变量的作用域。在 python 中,只有函数/类/模块才引入作用域,
    if/elif/else , while/for,try/except 等并不会引入新的作用域
    作用域按从小到大顺序可以分为:
    局部作用域:在函数内部定义,从定义开始到本函数结束
    闭包作用域:外部函数定义的变量,范围从定义开始到外部函数结束,可
    以在闭包函数内直接使用,在整个程序运行过程中都存在
    全局作用域:在所有函数外定义,范围从定义开始到本文件结束
    内建作用域:python 系统内定义的函数、类等,可以在任何位置直接使用
    19.请说说你是如何理解 python 中的封装,继承,多态的
    封装:封装就是把对象的属性和行为结合成一个独立的整体,把内部的实
    现细节隐藏起来,不能被外界所看见,调用的人只能执行,而看不到实现的
    细节,保证了代码的安全性
    继承:从已有类中派生出新的实例对象,子类继承父类的属性和方法,并
    且自己可以拓展出自己独有的属性和方法。保证了代码的复用率。python 支
    持单继承和多继承。
    多态:首先 Python 不支持多态,也不用支持多态,python 是一种多态
    语言,崇尚鸭子类型。在鸭子类型中,关注的不是对象的类型本身,而是它是
    如何使用的。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它
    接受一个类型为鸭的对象,并调用它的走和叫方法。在使用鸭子类型的语言
    中,这样的一个函数可以接受一个任意类型的对象,并调用它的走和叫方法。
    如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这
    样的正确的走和叫方法的对象都可被函数接受的这种行为引出了以上表述,这
    种决定类型的方式因此得名。
    20.请从 socket 编程的角度谈谈网络请求的流程
    网络请求是基于 HTTP 协议的,但 http 协议只是一个应用层协议,它底
    层是通过 TCP 进行传输数据的。因此,浏览器访问 Web 服务器的过程必须先
    有“连接建立”的发生。浏览器向 Web 服务器发出 Http 请求以及 Web 服务
    器给浏览器回复的过程如下:
    1)浏览器创建 Socket,按给定 IP(域名)和端口(默认为 80)连接服
    务器。
    2)连接成功后,浏览器依据 HTTP 协议规范,向 Web 服务器发送请求
    数据,会使用类似 Socket.Send()、Socket.BeginSend()等方法。
    3)浏览器等待服务器处理并返回数据;
    4)Web 服务器端使用 Socket.Accept()、Socket.BeginAccept()等方法
    侦听到浏览器的连接后,便开始接收浏览器发送的数据。接收到请求数据后,
    依据 HTTP 协议规范解析数据,然后处理,最终将处理结果发回给浏览器,这
    里可能用到类似 Socket.Send()、Socket.BeginSend()等方法;
    5)Web 服务器发送完处理结果后,关闭 Socket; 6)浏览器接收 Web 服务器发回的数据(如 html),将其显示在浏览器
    UI 界面。关闭 socket; 7)一次“浏览器到 Web 服务器”的 http 请求结束;
    21.请说说 TCP 与 UDP 编程的区别
    1.TCP 是面向连接的,即每次收发数据之前必须通过 connect 建立连
    接,也是双向的,即任何一方都可以收发数据,协议本身提供了一些保障机
    制保证它是可靠的、有序的,即每个包按照发送的顺序到达接收方。
    UDP 它是无连接的,不可靠的,因为通讯双方发送数据后不知道对方是
    否已经收到数据,是否正常收到数据。
    任何一方建立一个 socket 以后就可以用 sendto 发送数据,也可以用
    recvfrom 接收数据。根本不关心对方是否存在,是否发送了数据。
    它的特点是通讯速度比较快。大家都知道 TCP 是要经过三次握手的,而
    UDP 没有。
    2.TCP 对系统资源的要求较多,UDP 相对较少
    3.TCP 程序结构复杂,UDP 程序结构较简单
    4.TCP 以流模式传输数据与,UDP 以数据报模式传输数据
    5.TCP 能够保证数据正确性,UDP 则可能丢包
    6.TCP 能过保证数据顺序,UDP 则不保证
    22.请说说 python 中高阶函数的思想
    请说说你对 python 中高阶函数的认识:
    高阶函数指的是能接收函数作为参数的函数;python 中有一些内置的高
    阶函数,在某些场合使用可以提高代码的效率
  10. map 函数:接收一个函数和一个序列,map 将传入的函数依次作用到
    序列的每个元素,并且把结果作为新的列表返回.所以 map 函数可以方便将一
    个序列中的每一个元素做统一处理.
    2.reduce 函数:接收一个函数和一个序列,把一个函数作用到一个序列
    上,这个函数必须接收两个参数,reduce 把结果和序列的下一个元素做累积
    计算.所以 reduce 函数可以方便将一个序列中的所有元素做累计处理.
    3.filter 函数:接收一个函数和一个序列,把传入的函数依次作用于每个
    元素,然后根据返回值是 True 还是 False 决定保留还是丢弃该元素. 所以
    filter 函数可以方便的过滤掉序列的无用元素.
    23.请说说迭代器与可迭代对象的区别及迭代器的好处
    请说说迭代器与可迭代对象的区别及迭代器的优点:
    1.可迭代对象: 可迭代对象并不是一种具体的数据类型,只要可以直接用于
    for⋯in⋯循环遍历的对象都是可迭代对象,比如:list,tuple,dict,set,str
    等等。
    2.迭代器:可以被 next()函数调用并不断返回下一个值的对象称为迭代器:
    Iterator。它们表示一个惰性计算的序列;
    迭代器优点:使用迭代器不要求事先准备好整个迭代过程中的所有元素。
    迭代器仅仅在迭代到某个元素时才计算该元素,
    而在这之前或之后元素可以不存在或者被销毁。比起使用列表等容器存
    储,更加省内存,因此迭代器适合遍历一些数量巨大甚至无限的序列。
    24.请说说装饰器的好处,什么情况下使用,以及如何实现一个通用装饰器
    1.装饰器的实现是由闭包支撑的;
    2.装饰器本质上是一个 python 函数,它可以在让其他函数在不需要做任何代
    码的变动的前提下增加额外的功能;
    3.装饰器的返回值也是一个函数的对象,该函数对象就是添加额外功能后的与
    原函数同名的函数.
    通用装饰器:

装饰器; 在不修改源代码的基础上,添加新的功能

def outer(functionName):
def inner(*args, **kwargs):
print("-----添加功能-----")
ret = functionName(*args, **kwargs)
print("-----添加功能-----")
return ret
return inner
25.请说说线程什么情况下需要加锁, 及其优缺点
加锁原因: 如果有多个线程同时操作一个对象,如果没有很好地保护该对
象,会造成程序结果的不可预期
比如:我们在每个线程的 run 方法中加入一个 time.sleep(1),并同时输出
线程名称,则我们会发现,输出会乱七八糟。
因为可能我们的一个 print 语句只打印出一半的字符,这个线程就被暂
停,执行另一个去了,所以我们看到的结果很乱,这种现象叫做“线程不安
全”
解决:
Threading 模块为我们提供了一个类 Threading.Lock 锁。我们创
建一个该类对象,在线程函数执行前,“抢占”该锁,执行完成后,“释放”
该锁, 则我们确保了每次只有一个线程占有该锁。这时候对一个公共的对象
进行操作,则不会发生线程不安全的现象了。
锁的优点: 使得数据能安全的进行操作
锁的缺点:
1.如果多个线程要调用多个对象,而 A 线程调用 A 锁占用了 A 对
象,B 线程调用了 B 锁占用了 B 对象,A 线程不能调用 B 对象,B 线程不
能调用 A 对象,于是一直等待。这就造成了线程“死锁”
2.如果多个线程要调用同一个对象,A 线程调用 A 锁占用了 A 对
象,B 线程也需要使用 A 对象,A 线程不释放 A 对象,B 线程就不能调用 A 对 象,B 线程会等待 A 线程释放后才能使用,所以效率低下
26.请谈谈 python 中的协程的运用
1.协程就是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问
题而耗费许多切换时间, 而协程就是用户自己控制切换的时机,不再需要陷入系统
的内核态。
2.协程的执行效率非常高。因为子程序切换不是线程切换,而是由程序自身控
制,因此,没有线程切换的开销.和多线程相比, 线程数量越多相同数量的协程体
现出的优势越明显
3.协程不需要多线程的锁机制。由于只有一个线程,也不存在同时写变量的冲
突,在协程中控制共享资源不需要加锁,只需要判断数据的状态, 所以执行效率
远高于线程,对于多核 CPU 可以使用多进程+协程来尽可能高效率地利用 CPU
27.请说说计算机中使用缓存的好处
从系统的层面说,CPU 的速度远远高于磁盘 IO 的速度;所以要想提高响
应速度,必须减少磁盘 IO 的操作,但是有很多信息又是存在数据库当中的,每
次查询数据库就是一次 IO 操作;要想提高系统的性能,尽量减少 IO 的操作,
特别是磁盘 IO 的操作;使用缓存可以有效的避免这种情况;所以在架构设计过
程中,涉及到查询数据库的时候,应该考虑一下是不是考虑使用缓存技术来提
高系统的性能,并且降低数据库的负载。
28.请说说冒泡,选择,插入,快速排序
需要掌握这几个排序算法
思考下面问题:

  1. Python 中如何使用多核.
  2. 请详细描述你对 python 中的多线程的理解,什么情况下使用多线程.
  3. 谈谈你对面向对象思想的理解, 为什么要使用面向对象.
  4. 谈谈你对分布式的理解
  5. 使用进程池和线程池的好处
  6. 谈谈并发和并行的区别, 以及什么情况下使用
  7. 请说说生成器的作用, 什么情况下使用?
  8. 请谈谈你对 Python 闭包的理解
  9. Python 中__new__()和__init()__的区别
    第二部分 Web 前端&Linux&SQL
  10. 什么是 Ajax,常用场景有哪些
    ajax 的全称是 Asynchronous Javascript And XML, 即为异步 JS 和
    XML, 涉及到的核心类有 XMLHttpRequest 和 FormData。主要用于网页中
    异步请求服务器的资源和局部刷新网页中的数据; 交互数据的格式常用 xml、
    json 两种。
  11. 简述 xml 和 html 的关系
    两者都是标记语言,HTML 一个是超文本标记语言,XML 一个是扩展标
    记语言。区别主要三个方面:(1)HTML 不具备扩展性,而 XML 是原标记语
    言,可以用于定义新的标记语言;(2)HTML 侧重于如何表现,而 XML 是侧
    重于如何描述信息;(3)对于标记的嵌套和配对,HTML 较松; XML 则是严格
    要求,它是遵循 DTD 的树形结构;
    总而言之 HTML 用于网页数据展示(表格、图片、视频等),XML 用于数
    据交互。
  12. 简述一下 CSS 盒子模型
    CSS 盒子模型又叫框模型,包括内容(content)、填充(padding)、边框
    (border)、边界(margin)等属性。
    border:元素的边框,用于将框的边缘与其他框分开;
    margin:外边距,表示框的边缘与相邻框之间的距离,也称为页边空
    白;
    padding:内边距,表示框内容和边框之间的空间;
    另外,width 和 height 指的是内容区域的宽度和高度。
    增加内边距、边框和外边距不会影响内容区域的尺寸,但是会增加元素框
    的总尺寸。
    而外边距则可以在多个元素框之间创建空白,避免这些框都挤在一起。总
    之用了 padding 属性或者 margin 属性设置了元素的边距以后,会增加元素
    在页面布局中所占的面积。
  13. 简述一下 src 与 href 的区别
    href 是 Hypertext Reference 的缩写,表示超文本引用。用来建立当前
    元素和文档之间的链接。常用于的标签有:、。src 是 source 的
    缩写,src 的内容是页面必不可少的一部分。src 指向的内容会嵌入到文档中
    当前标签所在的位置。常用的标签有:、
、、。 5. 简述 xml 和 json 的区别 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式, XML 相比较 json 来说,XML 文件较大,格式复杂,解析比较困难。而 json 可以转成 js 对象,解析简单,传速快; json 是目前用于前后端交换的常用数 据格式。 6. px,em,rem 的区别 px 是像素单位,一般指定固定大小使用, 如 16px。em 和 rem 是相对 单位,em 相对于父级字体大小的倍数,rem 是相对根级(root)字体大小的倍 数,如 1.5em, 1.2rem。 7. CSS 中的定位模式有哪些?有何特点 static:默认值,没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)。 relative:生成相对定位的元素,相对于其正常位置进行定位。元素的位 置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。 fixed:元素框的表现类似于将 position 设置为 absolute,不过其包含 块是视窗本身。 absolute:生成绝对定位的元素,相对于 static 定位以外的第一个父元 素进行定位。 元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。 8. 浅谈 DML、DDL、DCL 的区别 DML(data manipulation language)数据库操纵语言:就是我们最经 常用到的 SELECT、UPDATE、INSERT、DELETE 等语句,主要用来对数据库 的数据进行一些操作。 DDL(data definition language)数据库定义语言:其实就是我们在创 建表的时候用到的一些 sql,比如说:CREATE、ALTER、DROP 等语名。 DDL 主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初 始化工作上。 DCL(Data Control Language)数据库控制语言:是用来设置或更改数 据库用户或角色权限的语句,包括(grant,deny,revoke 等)语句。这个比较 少用到。 9. JavaScript 的核心组成有哪些 javascript 主要有以下三大核心:ECMAScript 、DOM(document object model)和 BOM(browser object document )。 (1)ECMA 是规定了 js 的语法标准。 (2)DOM 是文档对象模型,规定了文档的显示结构,可以轻松地删 除、添加和替换节点 (3)BOM 是浏览器对象模型,就是浏览器自带的一些功能样式,如搜 索框、设置等浏览器窗口交互的对象 10.eval 是做什么的 eval()函数把字符串参数解析成代码并运行,并将执行的结果作为 eval() 的执行结果进行返回。 11.JavaScript 中的定时器有哪些?它们的区别以及用法是什么 JS 中的定时器有两种:setInterval(function, ms)和 setTimeout(function, ms), setInterval()是每隔多少毫秒执行一次 function 函数,setTimeout()是延迟多少毫秒后执行 function 函数。它们都返回一个 id,通过 clearInterval(id)函数来取消 Interval 定时器, clearTimeout()函数取 消 Timeout 定时器; 12.jQuery 有哪些核心模块 核心模块有: jQuery()函数对象、Selector 选择器、DOM(文档)操作、 CSS(样式)操作、事件处理、Ajax、动画效果等。 13.关系型数据库与非关系型数据库的区别 关系型数据库主要由二维关系表组成的,包含视图、索引、函数、存储过 程以及权限等,使用标准的 SQL 语句及相应引擎语法,目前常用的数据库引擎 包括 MySQL、SQL Server、Oracle、DB2 等。 而非关系型数据库(简称:NoSQL)主要以 Key-Value 或文档结构组成, 以高速读取、缓存为特点,而且不支持 SQL 语句,目前常用的 NoSQL 有 Redis、MongoDB 和 Hbase。 14.数据库事务的四个特性及含义 数据库事务 transanction 的四个特性(ACID): 原子性(Atomicity): 整个事务中的所有操作,要么全部完成,要么全部不 完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚 (Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 一致性(Correspondence) : 在事务开始之前和事务结束以后,数据库的 完整性约束没有被破坏。 隔离性(Isolation): 隔离状态执行事务,使它们好像是系统在给定时间 内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功 能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种 属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。 持久性(Durability): 在事务完成以后,该事务所对数据库所作的更改便持 久的保存在数据库之中,并不会被回滚。 15.数据库索引的工作原理及种类 数据库索引本质上是一个用来协助数据库快速查询更新数据的排序的数据 结构,一般情况下均采用 B 树及其变种 B+树来实现。 数据库的索引从不同的维度上我们可以将其划分为聚簇索引、非聚簇索引 或者唯一索引、覆盖索引。 16.常见数据库的引擎以及应用场景 mysql 常见的存储引擎有 InnoDB、MyISAM 和 MEMORY。 InnoDB 是事务型数据库的首选引擎,支持事务安全表,支持行锁定和外 键。主要应用于需要提供提交、回滚、崩溃恢复能力的事务安全能力,并要求 实现并发控制的场景。 MyISAM 基于 ISAM 存储引擎,并对其进行扩展。它是在 Web、数据仓 储和其他应用环境下最常使用的存储引擎之一。MyISAM 拥有较高的插入、 查询速度,但不支持事务。如果数据表主要用来插入和查询记录,则 MyISAM 引擎能提供较高的处理效率。 MEMORY 存储引擎将表中的数据存储到内存中,未查询和引用其他表数 据提供快速访问。只是临时存放数据,数据量不大,并且不需要较高的数据 安全性,对于这种场景 MEMORY 引擎是一个不错的选择。 17.环境变量的作用?Linux 环境变量的种类 环境变量是设置给系统或者用户的应用程序的一些变量,其具体的作用和 具体的环境变量相关。比如 PATH 变量就是告诉系统当系统运行一个程序而 没有完整路径时将在那些目录下寻找程序。环境变量主要分为系统环境变量 和用户环境变量。 18.如何理解 Linux 中的软硬链接 linux 中的硬链接直接指向文件的 inode,而删除硬链接仅仅删除链接本身, 不会影响文件本身。与之相对的软连接则是在链接文件的数据中存储目标文件 的路径。使用 ln -s 创建软连接,不带-s 选项表示创建硬连接。 19.简要介绍一下 Linux 的启动流程 linux 系统启动流程可以简单总结为以下几步: 1)开机 BIOS 自检,加载硬盘。 2)读取 MBR,进行 MBR 引导。 3)加载 grub 引导菜单(Boot Loader)。 4)加载 Linux 内核(kernel)。 5)启动 init 进程,依据 inittab 文件设定运行级别。 6)init 进程,执行 rc.sysinit 文件。 7)启动内核模块,执行不同级别的脚本程序。 8)执行/etc/rc.d/rc.local。 9)启动 mingetty,进入系统登陆界面。 20.日志的作用?如何查看 Linux 启动日志 日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生 的事件。用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者 留下的痕迹。在 linux 中的启动日志一般存在/var/log/boot.log 或者 message.log 中,所以我们可以通过 tail /var/log/boot.log|message.log 来 查看最新的日志记录。注意:因为日志文件可能比较大,慎用 cat 查看。 21.Linux 系统运行状态有哪些,如何切换 Linux 系统有 7 个运行状态即运行级别:0-系统停机状态、1-单用户工作 状态、2-多用户状态、3-完全的多用户状态、4-系统未用(保留),5-X11 控制 台模式、6-系统正常关闭并重启。 修改运行状态可以通过修改 inittab 文件中的 initdefault 选项为制定的 id 达到修改目的。 需要注意的是: 1、系统默认运行级别不能设为 0 和 6,否则不能正常启动。 2、单用户工作状态,root 权限,用于系统维护,禁止远程登陆。 3、X11 控制台,登陆后进入图形 GUI 模式。 22.shell 是什么,有什么作用 Shell 字面理解就是个“壳”,是操作系统(内核)与用户之间的桥梁, 充当命令解释器的作用,将用户输入的命令翻译给系统执行。Linux 中的 shell 与 Windows 下的 DOS 一样,提供一些内建命令(shell 命令)供用户 使用,可以用这些命令编写 shell 脚本来完成复杂重复性的工作。 23.简述 Linux 中文件权限的设计 在 Linux 中,文件权限由三部分组成,每一部分由 rwx 三个字母组成。r 表示只读, w 表示只写, x 表示可执行,如果不具有某一权限,可以用 “-”表示。如读写权限的写法: rw-。权限的第一部分表示用户的权限, 第二部分表示组中其它用户权限,第三部分表示其他用户的权限。另外,每 一部分的权限也可以用数字累加表示,rwx 对应 421, 即具有 rw 权限,则表 示 6,在 Linux 中可以用 chmod 命令来修改文件权限, 如设置当前用户拥有 /opt/h.py 文件的读写和执行权限: sudo chmod 700 /opt/h.py 24.什么是闭包,有什么特性,简要介绍你理解的闭包 闭包是指有权访问另一个函数作用域中的变量的函数(即当函数被调用时 会创建一个执行函数和相应的作用域链。作用域链本质上是指向变量对象的指 针列表,只引用,不实际包含变量对象)。作用域链中,函数内部变量对象优 先级最高,然后,由最近的外部函数依次向后排。 闭包具有封闭性和持久性,封闭性:外界无法访问闭包内部的数据,如果 在闭包内声明变量,外界是无法访问的,除非闭包主动向外界提供访问接口; 持久性:一般的函数,调用完毕之后,系统自动注销函数,而对于闭包来说, 在外部函数被调用之后,闭包结构依然存在。 缺点:由于闭包携带包含其它函数的作用域,因此比其他函数占用的内存 更多。 优点:减少创建全局变量 ; 减少传递给函数的参数量; 闭包可以读取函数内部的局部变量,这些变量的值始终保存;在内存中函 数执行后,函数执行环境的作用域会被销毁,但是活动对象不会销毁,只有将 匿名函数销毁后才可以销毁活动对象。可以将保存函数的变量赋值为 null,将 可销毁匿名函数作用域。 常见创建闭包方法:在一个函数内部创建另一个函数。 思考下面问题: 1. git 的常用命令, git 提交项目的流程, git 如何解决冲突, 谈谈你是如 何使用 git 分支的 2. 前端获取后端数据有哪些方式 3. 请谈谈你对 Http 协议的理解 4. 数据库优化的思路 5. 写一条 SQL 语句查找 Person 表中 age 第二大的人 第三部分 Django&Flask 1. 请简要概述 MVC 和 MTV MVC 是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组 织代码;M 模型,数据存取;V 视图,数据展示; C 控制器,业务逻辑处理。 MTV 本质上 MTV 与 MVC 模式没有什么区别,也是各组件之间为了保持松 耦合关系,只是定义上有些不同;M 模型,数据存取; T 模板,数据展示; V 视图,业务逻辑处理。 2. Django 请求的生命周期 客户端发起请求 > nginx > uwsgi > 中间件 > url 路由 > view 视图 > ORM 获取数据 > 模板渲染 > 服务器返回响应 > 中间件 > uwsgi > nginx > 客户端显示 3. 简述 FBV,CBV FBV: 用户发送 url 请求,Django 会依次遍历路由映射表中的所有记录,一 旦路由映射表其中的一条匹配成功,就执行视图函数中对应的函数名; CBV: 用户发起 url 请求,Django 会通过路由映射表匹配成功后会自动去找 dispatch 方法,接着 Django 会通过 dispatch 反射的方式找到类中对应的方法并 执行类中的方法,执行完毕之后,会把客户端想要的数据返回给 dispatch 方法, 由 dispatch 方法把数据返回给客户端。 4. Django 中间件的作用和应用场景 作用: 中间件是介于 request 与 response 处理之间的一道处理过程,能在全 局上改变 django 的输入与输出。 应用场景: 用户认证系统、CSRF 保护、IP 限 制、URL 访问限制、缓存… 5. Django 重定向是如何实现的?301 和 302 有什么区别 重定向: HttpResponseRedirect、redirect、reverse; 301 是永久重定 向,搜索引擎在抓取新的内容的同时也将旧的网址替换为了重定向之后的网址; 而 302 是临时重定向,搜索引擎会抓取新的内容而保留旧的地址; 6. Django 中 csrf 实现机制 在客户端页面上添加 csrf_token,服务器端进行验证,服务器端验证的工作通 过'django.middleware.csrf.CsrfViewMiddleware'这个中间层来完成,若验证失 败则 403 错误。在 django 当中防御 csrf 攻击的方式有两种:在表单当中附加 csrf_token、通过 request 请求中添加 X-CSRFToken 请求头。 7. 什么是 wsgi,uwsgi,uWSGI wsgi: 用在 python web 框架编写的应用程序与后端服务器之间的规范; uwsgi: uWSGI 服务器实现的独有的协议; uWSGI: 一个 Web 服务器,它实现 了 WSGI 协议、uwsgi、http 等协议,用于接收前端服务器转发的动态请求并处 理后发给 web 应用程序; 8. Django 本身提供了 runserver,为什么不能用来部署? Django 本身提供的 runserver 是属于开发服务器,这个开发服务器是没有经 过安全测试的,另外 runserver 起来的其实是 HTTPServer 就是 Python 自带的 simple_server,而标准 Python 只能是是单线程,无法并发。对于一个成熟的站 点提供服务,需要 Web 服务器 [静态数据] 和 App 服务器[动态数据],还需要 多线程并发处理能力。 9. 什么是会话技术,cookie,session 的区别, token 呢 会话技术,其实也就是为了状态的保持,延长请求的生命周期,因为 http 协 议是无状态的,每次请求都是一次新的请求,不会保持之前的请求状态。Cookie 所有数据存储在客户端,支持数据过期,但是不能跨浏览器,不能跨域名,数据不 安全,session 所有数据存储在服务端,相对数据安全,支持过期设置,但是要依 赖于 cookie。 10.debug-toolbar 的作用 是一组可配置的面板集合,用来显示 Django Web 应用当前请求/响应的各种 调试信息,进行性能调优,与系统调试 11.orm 中 db first 和 code first 的含义 db first 是基于已存在的数据库,之后再创建实体类,数据库对象与实体类的 匹配关系等,也就是从一个数据库开始,然后生成实体框架和相应代码。 code first,根据需要,为你一个领域的对象创建类集合,而不是首先来设计 数据库,然后来根据数据库设计你的类,Code-First APis 将会基于你的类和配 置,为你创建数据库。 12.简述 ORM,ORM 的优缺点 ORM 是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动 持久化到关系数据库中 优点: 1 不需要再动手写 SQL 语句 2 对不同数据库管理系统的连接以及操作进行了抽象,程序员完全可以不 考虑使用的是什么数据库以及数据库的版本 缺点: 1 ORM 的缺点是会牺牲程序的执行效率和会固定思维模式 2 对于复杂的 SQL 有心无力 3 无法完全屏蔽数据库底层细节 4 关系-对象映射的实现是以性能为代价,方便了开发,牺牲了效率。 13.谈谈你对前后端的理解. 14.谈谈你对 RESTful 规范的认识 REST 是所有 Web 应用都应该遵守的架构设计指导原则。面向资源是 REST 最 明显的特征。将对资源的操作与 HTTP 方法在对应 15.Django REST Framework 框架中有哪些组件 视图、序列化、解析器、认证与权限、分页、throttle(访问频率)组件 16.Django 和 Flask 的区别 Flask 1 Flask 自由、灵活,可扩展性强,第三方库的选择面广,开发时可以结 合自己最喜欢用的轮子,也能结合最流行最强大的 Python 库 2 入门简单,即便没有多少 web 开发经验,也能很快做出网站 3 非常适用于小型网站 4 非常适用于开发 web 服务的 API, 开发大型网站无压力,但代码架构需 要自己设计,开发成本取决于开发者的能力和经验 5 各方面性能均等于或优于 Django Django: 1 Django 的自带 ORM 非常优秀,综合评价略高于 SQLAlchemy 2 自带的模板引擎简单好用 3 ORM 也使 Django 与关系型数据库耦合度过高 4 非常适合企业级网站的开发:快速、靠谱、稳定 5 Django 成熟、稳定、完善,但相比于 Flask 6 Django 的整体生态相对封闭 7 Python web 框架的先驱,用户多,第三方库最丰富 Flask 自由、灵 活,可扩展性强,第三方库的选择面广,开发时可以结合自己最喜欢用的轮 子,也能结合最流行最强大的 Python 库 17.列举 Http 请求中常见的请求方式以及应用场景 GET: 向特定资源发出请求(获取数据) POST: 创建资资源(提交数据) DELETE: 删除资源 PUT: 向指定资源位置上上传其最新内容 18.列举一下 Http 中常见状态码 200: 请求已成功。 302:临时重定向,HTTP1.0 的状态码 400: Bad Request, 语法错误,服务器无法理解 403: Forbidden 权限不够 404:网络资源不存 405, Method Not Allowed 请求方式不被允许 500, Internal Server Error 服务器出错 502, Bad Gateway, 作为网关或代理工作的服务器尝试执行请求时,从上 游服务器接受到无效的响应 19.列举 Http 请求中常见的请求头 refer,location,user-agent,accept,accept-encoding,cookie, cache-control 20.Flask 框架的核心依赖组件 jinja2,Werkzeug 两个核心组件,Jinja2 是一个现代的,设计师友好的 Python 模板语言,模仿 Django 的模板。使用可选的沙盒模板执行环境,它 具有快速,广泛使用和安全性,Werkzeug 不是一个框架,它是一个带有实 用程序的库,可以创建自己的框架或应用程序,因此非常灵活。 21.Flask 的默认 session 处理机制 Flask 的默认 session 利用了 Werkzeug 的 SecureCookie,把信息做序 列化(pickle)后编码(base64),放到 cookie 里了。过期时间是通过 cookie 的 过期时间实现的。为了防止 cookie 内容被篡改,session 会自动打上一个叫 session 的 hash 串,这个串是经过 session 内容、SECRET_KEY 计算出来 的,看得出,这种设计虽然不能保证 session 里的内容不泄露,但至少防止了 不被篡改。 22.flask 中的钩子函数有哪些?可以做什么 app.before_request:共享 session 的鉴权函数、请求黑白名单过滤、根 据 endpoint 进行请求 j 等。蓝图场景包含 api 的请求必填字段校验,是否 json 请求校验,请求的 token 校验等。 app.errorhandler:可以用 redis 进行错误请求计数,超过一定量则进行告 警。可以重定向到一个定制的错误代码页面等 app.context_processor:将一些常量按字典的格式返回,则可以在 jinja2 的模版中引用 场景:在 html 中,如果{'yao','jidan'}直接用{{jidan}}就会在页 面显示 yao app.after_request 场景:一般用于格式化响应结果,包括响应请求头,响 应的格式等。 23.flask 中的四大内置对象,各有什么作用 request 请求对象,封装了客户端发送的 HTTP 请求的内容 session 用户会话,用来记住请求 g 变量 :充当者中间媒介的作用,我们可以通过它传递一些数据 current_app 代表当前的 flask 程序实例,使用时需要 flask 的程序上下文激活 24.什么是负载均衡?常见负载均衡算法 1、轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的 每一台服务器,而不关心服务器实际的连接数和当前的系统负载。 2、随机法:通过系统的随机算法,根据后端服务器的列表大小值来随机选取 其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务 端的次数增多 3、源地址散列:根据获取客户端的 IP 地址,通过哈希函数计算得到的一个 数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要 访问服务器的序号 4、加权轮询法:给配置高、负载低的机器配置更高的权重,让其处理更多的 请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载 5 加权随机法:与加权轮询法一样,加权随机法也根据后端机器的配置,系统 的负载分配不同的权重 6、最小连接数法:根据后端服务器当前的连接情况,动态地选取其中当前积 压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用 效率,将负责合理地分流到每一台服务器 25.Celery 是什么?常用应用场景 Celery 是一个 基于 python 开发的分布式异步消息任务队列,通过它可以轻 松的实现任务的异步处理 使用场景:异步调用:那些用户不关心的但是又存在在 我们 API 里面的操作 我们就可以用异步调用的方式来优化(发送邮件 或者上传 头像)定时任务:定期去统计日志,数据备份,或者其他的统计任务 26.什么是 RPC,常用场景有哪些? RPC:远程过程调用 让构建分布式计算(应用)更容易,在提供强大的远程 调用能力时不损失本地调用的语义简洁性 场景:不允许较大的延迟的应用 ERP 系 统回仓 2 在垂直应用中将核心和公共业务抽取出来,作为独立的服务,实现前后 台逻辑分离 思考下面问题: 1. Django, Flask 和 Tornado 的区别 2. 你的后端工作职责有哪些, 如何编写项目 API 接口 3. 在公司如何与前端工程师联调 4. 后端如何反爬 第四部分 爬虫 1. 请阐述通用爬虫和聚焦爬虫的概念 通常情况下,我们将搜索引擎使用的爬虫我们称之为通用爬虫,就像谷歌 和百度的爬虫,它的作用是把整个互联网上的网页下载到本地,形成一个互联 网内容的镜像备份,在对这些网页进行一定的处理(例如提取关键字、去掉广 告等)之后,就可以提供一个用户检索内容的接口。一般的网站都会通过 robots 协议来告诉通用爬虫,哪些那些页面可以抓取,那些不可以抓取。 我们做 Python 爬虫开发通常是开发聚焦爬虫,聚焦爬虫会针对某种特定 的内容进行爬取,因此会对爬取的内容进行筛选和处理,而且只是抓取与特 定主题需求有相关性的内容。 2. 完整的一个 url 都包含哪些内容 一个完整的 url 包含协议、主机地址、端口、路径和资源。其中不同的协 议代表不同的资源查找方式、资源传输方式;主机地址指的是存放资源的主 机(服务器)的 IP 地址(域名),端口是用来区分不同的服务的,路径是指资 源在主机中的具体位置。 3. 请阐述 http 协议和 https 协议的区别和联系 HTTPS 协议需要到证书颁发机构(CA)申请证书,一般免费证书很少, 需要向证书颁发机构支付费用。HTTP 协议是超文本传输协议,信息是明文传 输,HTTPS 则是具有安全性的 SSL 加密传输协议。采用 HTTP 协议传输数据 的客户端和服务器,客服端给服务器发送请求,服务器接收到请求会直接将 数据返回。采用 HTTPS 协议的时候,客服端给服务器发送请求,服务器接收 到请求后不会马上将数据返回,而是将一个证书传递给客服端(这个证书中 包含了公钥),客户端信任这个证书后,客户端发出的信息会经过加密然后再 发送给服务器。服务器接收到信息后会使用服务器的私钥进行解密。同样 的,服务器发送给客户端的信息也会通过私钥进行加密,在客户端通过公钥 进行解密。 4. robots 协议是什么 Robots 协议,有时候也称为“爬虫协议”或“网络机器人协议”,它的 全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过 Robots 协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。Robots 协议对应的文本 robots.txt 通常保存在网站的根目录下,是一个使用 ASCII 码 字符的纯文本文件,例如我们访问
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/398954
推荐阅读
相关标签
  

闽ICP备14008679号