精华内容
下载资源
问答
  • python后端开发面试题
    2020-11-23 11:21:54

    1.is和==的区别?

    is判断两个引用是否指向的是同一个变量,即内存id是否相等,==则是调用的__eq__方法,一般是用于判断值是否相等,也可以重写__eq__方法实现想要的效果。

    2. dict与list的查找复杂度?

    dict用hash实现,查找的时间复杂度是O(1),list则为O(n)。

    3. a/b/c三个装饰器依次装饰函数fun(),装饰器的执行顺序?

    注意装饰器函数本身一般有两层,在装饰的时候外层和内层顺序是相反的,参考python 多个装饰器的调用顺序。

    4. 如何运行一个字符串?

    eval和exec。

    5.Python多线程能否充分利用CPU多核心?

    GIL相关

    6. 什么是上下文管理器?如何实现?

    上下文是指程序运行的环境,Python中常见于打开文件或网络连接,其实就是with关键字,如:with open("test.txt") as file:

    print(file.read())

    确保文件在最后会被关闭,只要对一个对象实现了__enter__和__exit__函数,就可以构造自己的上下文管理器了。

    7. 如何判断两个浮点数是否相等?

    Math模块中有一个isclose函数用来判断两个浮点数的值是否接近或相等

    8. MySQL的索引一般是怎么实现的?

    B-Tree(一般是B+Tree)和Hash

    9. 一个函数RAND7()随机返回1~7,使用它构造一个RAND10()函数随机返回10。

    def rand10():

    while 1:

    res = (rand7()-1)*7+rand7() # res等概率随机1~49

    if res < 40: # 只取出0~39共40个数,每个数出现的概率也是相等的

    return res % 10 + 1 # 随机输出1~10

    10. 给定一个数组,按奇数在前升序,偶数在后降序排列,一行代码实现。

    一行代码必然是列表生成式,假设数组是nums,代码如下:

    sorted([n for n in nums if n % 2]) + sorted([n for n in nums if not n % 2], reverse=True)

    11. 实现单例

    单例就是说一个class只能有一个instance,实现的方法有很多,例如改写__new__方法:

    class Singleton(object):

    _instance = None

    def __new__(cls, *args, **kw):

    if not cls._instance:

    cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)

    return cls._instance

    更多相关内容
  • python后端开发面试题

    千次阅读 2021-02-22 19:52:51
    一:简述你对Restful风格的理解: 1: 协议 : 2:域名: 3:版本: 4:路径: 5:请求方式(6种): 6: 请求参数: 7: 状态码: 二:概述python的内存管理机制: 三: cookie 与 Session的区别: 四:你了解web开发中...

    一:简述你对Restful风格的理解:

    1: 协议 :

    • http:
    • https:

    2:域名:

    • 1:将api部署在专用域名下:http://api.example.com
    • 2: 将api部署在主域名下: http://www.example.com/api/

    3:版本:

    • 版本号放在url中:http://www.example.com/api/1.0

    4:路径:

    • 路径要使用名词复数(数据库表的复数): http://www.example.com/api/1.0/goods

    5:请求方式(6种):

    • GET : 获取资源
    • POST: 新增资源
    • PUT:更新资源
    • PATCH: 更新部分资源
    • DELETE : 删除资源
    • OPTIONS : 预检请求

    6: 请求参数:

    • ?加键值对的形式: 多个可以使用&进行连接。

    7: 状态码:

    • 200 : 正常返回响应。
    • 201: 新建、修改数据成功。
    • 202: 请求进入后台排队。
    • 400:请求有误。
    • 401: 权限不足。
    • 403: 访问被禁止。
    • 404: 找不到。
    • 406: 请求格式不正确。
    • 500:服务器内部错误。

    二:概述python的内存管理机制:

    链接地址:https://blog.csdn.net/zx870121209/article/details/81363311

    • 1:引用计数:对于一个对象,每一个变量引用他,都会让这个对象中的引用计数的属性增加1,反之则减一,当引用计数变成0的时候,则进行销毁。
    • 2:垃圾回收(标记—清除,分代回收):
    • 2.1:标记清除:对于循环引用的对象,例如A引用了B,B也引用了A,那么我们让B的引用减一,则B应该被销毁,由于B也引用了A,A也应该被销毁,则表示A,B之间是循环引用,则一起被销毁。
    • 2.2:分代回收: 存活时间越久的对象越不可能是垃圾,因此会相应减少对这些存活时间比较久的对象的扫面,从而也提高python的效率。
    • 3: 内存池:在这里插入图片描述

    三: cookie 与 Session的区别:

    • 1: 存储位置不同: cookie存储在浏览器,session存储在服务器。
    • 2:存储大小不同,cookie存储受限,session由于存储在服务器端,因此不受限。
    • 3:安全性不同:cookie不如session安全。

    四:你了解web开发中存在哪些安全漏洞?

    • 1: CSRF利用cookie进行跨域伪造攻击。
    • 2:SQl注入。

    更多地址:https://www.cnblogs.com/wuhuacong/archive/2013/04/15/3022011.html

    五:Django的中间件:

    • 1:中间件作用:在视图之前拦截请求,在视图返回响应之后,处理响应。
    • 2:你用过Django哪些中间件?
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',  #一些安全设置,比如xss脚本过滤
        'django.contrib.sessions.middleware.SessionMiddleware',#session支持中间件,加入这个中间件,会在数据库中生成一个django_session的表。
        'django.middleware.common.CommonMiddleware',   #通用中间件,会处理一些url
        'django.middleware.csrf.CsrfViewMiddleware',   #跨域请求伪造中间件,加入这个中间件,在提交表单的时候会必须加入csrf_token,cookie中也会生成一个名叫csrftoken的值,也会在header中加入一个HTTP_X_CSRFTOKEN的值来放置CSRF攻击。
        'django.contrib.auth.middleware.AuthenticationMiddleware',  #用户授权中间件。他会在每个HttpRequest对象到达view之前添加当前登录用户的user属性,也就是你可以在view中通过request访问user。
        'django.contrib.messages.middleware.MessageMiddleware',#消息中间件。展示一些后台信息给前端页面。如果需要用到消息,还需要在INSTALLED_APPS中添加django.contrib.message才能有效。如果不需要,可以把这两个都删除。
        'django.middleware.clickjacking.XFrameOptionsMiddleware',#防止通过浏览器页面跨Frame出现clickjacking(欺骗点击)攻击出现。
        'A_orm.middlewares.auth.AuthenticationMiddleware',
    ]
    
    • 3:你自己写过中间件吗?
      没有写过中间件,但是会写,首先定义一个类,继承MiddlewareMixin,然后重写
      中间件5个重写函数:
      process_request(请求之前)
      process_view(视图之前)
      process_template_response(处理每个模板响应之前)
      process_response(返回响应之后)
      process_exception(抛出异常)

    六:Django与Flask的区别?

    • 1:Django的MVT架构、自带ORM、强大的Admin后台管理、自带数据库、还自带开发测试用的服务器。
    • 2:Flask 本身相当于一个内核, 主要实现了路由分发模板渲染功能, 分别集成自 Werkzeug 和 Jinja2模块包, 这两个也是Flask框架的核心。

    七:你在哪里用到装饰器?

    @celery_app.task(name=‘ccp_send_sms_code’)给我们的task取一个名字。

    八:乐观锁与悲观锁的区别?

    九:单例生效的是线程还是进程?假设有20个进程连接MYSQL,单例状态下是有多少个连接?

    答: 单例生效的是线程,对于进程是不起作用的,因为每一个进程都有自己的分配空间,如果有20个进程通过单例连接数据库,则会有20个连接。如果是多线程情况下,需要使用线程锁,保证一个类只有一个实例。

    十:lambda与map函数的使用:

    #1.常规方法
    >>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9,10]
    >>> def square(x):
    return x**2
    
    >>> list(map(square,lst))     #Python2.x使用map(square,lst)
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    
    #2.使用lambda函数
    >>> list(map(lambda x:x**2,lst))     #Python2.x使用map(lambda x:x**2,lst)
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    
    >>> [(lambda x:x**2)(x) for x in lst]
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    
    #map函数除了作用于数字列表外,还可以作用于字符串和元组。
    #例如:
    >>> list(map(ord,'abcdef'))
    [97, 98, 99, 100, 101, 102]
    
    #当传入多个可迭代对象时,且它们元素长度不一致时,生成的迭代器只到最短长度
    >>> list(map(lambda x,y:x+y,'abc','de')) 
    ['ad', 'be']
    

    十一:python中的类方法,实例方法,静态方法

    • 实例方法只能由实例对象来调用。
    • 静态方法,类方法,可以由类和实例调用。
    • 被@classmethod修饰的是类方法,被staticmethod修饰的是静态方法,不修饰的是实例方法。

    十二: 类属性和实例属性的区别?

    • 实例属性:在__init__方法中定义的属性称为实例属性,实例属性是属于某个实例的。
    • 类属性:在类里面和方法外面定义的属性称为类属性,类属性属于当前类。
    • 对象可以访问类属性,但是不能够修改类属性。
    • 如果对象想要修改类属性怎么做???定义类方法,进行调用。

    十三:你的项目中uwsgi部署的时候配置的进程是多少?你们在设计的时候考虑多少并发量?

    答:uwsgi配置32进程,800线程,考虑1000并发量以上。

    十四:你项目上线了吗?有没有域名?

    上线了,域名:www.uguu.com

    十五: 进程之间是如何通信的呢?(关小工,辛嫂)

    • 管道:
    • 消息队列:
    • 共享内存:
    • 信号量:
    • socket

    十六: __init__方法和__new__方法的区别?

    • 顺序不同: __new__方法先执行
    • 作用不同: __new__方法是为了创建实例的,__init__方法是为了初始化实例对象的。
    • 传入值不同: __new__传入cls, 而__init__传入self.
    • 输出值也不同: __new__输出实例,__init__没有输出值。

    十七: 生成器和迭代器的区别是什么?

    • 生成器可以看做是创建迭代器的工具。
    • 生成器:函数 + yield关键字: 自动创建了iter方法和next方法。
    • 迭代器:实现了iter方法和next方法。

    十八: 虚拟机(Docker)的网络配置有哪些?

    • 桥接:
    • 主机模式:
    • None模式:
    • macVlan模式:
    • 覆盖网络模式:

    十九: 查看进程的命令,磁盘,端口

    • 查看磁盘: df -h
    • 根据进程查看端口: netstat -nap | grep pid
    • 根据端口查看进程: netstat -nap | grep port
    • 根据进程查看进程号: ps -aux | grep java

    二十:死锁产生的原因是什么?条件又是什么?

    二十一:请求报文和响应报文的格式:

    • 请求报文:请求行(协议,url地址,请求方式),请求头,空行, 请求体。
    • 响应报文: 响应行, 响应头,响应体。

    二十三:python程序的执行原理:

    首先python是一门解释型的语言,操作系统会将我们的python解释器复制到内存中,然后从上到下的让python解释器翻译python程序中的代码(词法分析,语法分析, 编译等过程。),我们会得到一个.pyc的字节码文件, 再由cpu执行.pyc中的字节码文件即可。

    二十四:python如何实现私有的呢?

    • 变量名、函数名前面增加两个下划线实现私有。
    • python会将我们定义的私有变量和函数名转换成 ,_类名__变量名, _类名__方法名。

    二十五:数据库的三范式:

    • 列不可分
    • 非主键完全依赖于主键,不能部分依赖
      案例: 比如:我们一个表(学号,课程号)作为主键,对于课程学分,只依赖于课程号,跟学号没有任何关系,所以此时违反了第二范式。 一个表只说明一个事物
    • 非主键只依赖于主键,不能依赖于非主键一个数据库表中不包含已在其它表中已包含的非主键字段

    二十六: Django有哪些模块?

    • View模块
    • Template模板
    • URL模块
    • auth模块
    展开全文
  • Python对并发编程的支持? 多进程(multiprocessing):利用多核cpu的能力并行执行任务 多线程(threading):利用cpu和io同时执行的原理,让cpu不会干巴巴的等待io完成 异步io(asyncio):在单线程利用cpu和...

    一、系统相关

    1、并发编程?

    • 为什么需要并发编程?

    提高程序的运行速度

    • Python对并发编程的支持?

    多进程(multiprocessing):利用多核cpu的能力并行执行任务

    多线程(threading):利用cpu和io同时执行的原理,让cpu不会干巴巴的等待io完成

    异步io(asyncio):在单线程利用cpu和io同时执行的原理实现函数异步执行

    • 多进程、多线程、多协程的应用场景?

    多进程:cpu密集型计算

    优点:利用多核cpu并行计算

    缺点:占用资源最多,可启动数目少

    多线程:io密集型计算,同时执行的任务不多

    优点:相比进程更轻量级,占用资源少

    缺点:相比进程,多线程只能并发执行,不能利用多cpu

               相比协程,启动数目有限,占用内存资源

    多协程:io密集型,需要超多任务执行

    优点:内存开销最少,启动数量最多

    缺点:支持的库有限(支持aiohttp,不支持requests),代码实现复杂

    2、GIL(全局解释锁)?

    只允许同一时间一个线程执行,保证数据的完整性

    3、线程安全问题?

    使用Lock锁

    4、进程切换开销为什么比线程大?

    进程切换时需要将当前执行的程序保存到寄存器,包括cpu的切换

    5、进程之间的通信方式?

    1. 管道:半双工通信,只在父子进程中使用,存放数据少
    2. 消息队列:解耦,存放数据量比管道多
    3. 信号量:计数器,主要作为同一进程不同线程的同步手段
    4. 信号:用于通知/接收进程某个事件发生
    5. 共享内存:最快的通信方式,共享内存由一个进程创建,多个进程可以访问,与信号量配合使用
    6. socket:可用于不同机器的进程通信

    6、简述socket中的select、poll和epoll的使用场景以及区别?

    都是io多路复用的

    • select需要不断轮询数据,时间复杂度低,文件描述符有限制(1024),常见的服务器软件Apache用的就是select
    • select和poll的区别在于文件描述符,poll无限制
    • epoll只会注册一个监听事件,当数据有变化时才通知,Nginx底层用的epoll,能处理高并发

    在连接数少的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调

    7、epoll中水平触发和边缘触发的区别?

    当监听事件的文件描述符有发生可读写事件,但是这一次没有把数据读取完,水平触发下次调用时还会通知你,如果一直没有操作完,它会一直通知直到完成操作,而边缘触发只会通知一次 

    8、Linux进程调度中有哪些常见的算法及策略?

    1. 先来先服务和短作业优先调度算法
    2. 高优先权优先调度算法

    9、进程的状态有哪几种?

    • 就绪状态:可以运行,但其他进程正在运行而暂时停止
    • 阻塞状态:不可运行,除非某种外部事件的发送
    • 运行状态:该进程实际占用cpu

    10、简述LRU算法及实现方式?

    一种缓存淘汰机制,从内存中找到最久未使用的数据置换出来,衡量指标是使用时间和次数,合理性在于优先筛选最近使用最多的数据

    利用双向链表实现

    11、线程间的通信方式?

    共享变量、共享内存、共享数据库、消息队列

    12、简述同步与异步,阻塞与非阻塞的区别?

    • 同步:执行一个操作后等待结果,收到结果才继续执行
    • 异步:执行一个操作后可以去执行其他操作,然后等待通知再回来执行
    • 阻塞:进程给cpu传达一个任务后,一直等待cpu处理完,再执行后面操作
    • 非阻塞:进程给cpu传达一个任务后,继续处理后续操作,隔一段时间在询问其操作是否完成,也叫轮询

    同步异步关注的“方式”,阻塞非阻塞关注的“结果”

    13、简述Linux的io模型?

    同步io、异步io、阻塞io、非阻塞io、多路复用io

    二、网络协议相关

    1、简述tcp的三次握手和四次挥手的流程及为什么需要?

    三次握手:建立连接

    四次挥手:断开连接,释放内存

    2、RestFul与RPC的区别及RestFul的优点?

    RPC:远程过程调用(在本地调的函数可能存在远端)

    RPC是面向过程,RestFul是面向资源,并且使用了http动词

    RestFul风格的URL在表述的精简性和可读性更好

    3、HTTP和HTTPS的区别?

    1. HTTP需要申请证书
    2. HTTP是超文本传输协议,属于应用层传输,HTTPS是具有SSL加密安全性传输协议,可以对数据加密
    3. 完全不同的连接方式,HTTP端口是80,HTTPS是443
    4. HTTP连接是无状态的,HTTPS是由SSL+HTTP构建,可进行加密传输,身份认证的网络协议相对于说更安全

    4、一次HTTP请求过程发生了什么?

    输入网址,回车—>域名解析—>发起tcp的三次握手—>建立连接后发起HTTP请求—>服务器响应HTTP请求—>浏览器得到HTML代码—>浏览器解析HTML代码并请求HTML中的资源—>浏览器对页面进行渲染呈现给用户

    5、tcp和udp在网络协议中的哪一层,有什么区别?

    传输层

    tcp面向连接,udp无连接

    6、tcp中常见的拥塞算法?

    慢开始

    发送一段时间后调整cwnd的值,翻倍,此时是网络拥塞

    7、tcp怎么保证可靠性?

    应答机制、超时重传、连接管理、序列号

    8、HTTP1.0、1.1、2.0的主要区别?

    HTTP1.0:无状态、无连接

    HTTP1.1:支持长连接,缓存处理,断点传输

    HTTP2.0:二进制分帧,多路复用,头部压缩,服务器推送

    三、数据库相关

    1、数据库的事务隔离级别有哪些?及其优缺点?

    Read uncommitted(读,未提交):脏读,不可重复读,幻读

    Read committed(读,提交):不可重复读,幻读

    Repeatable read(可重复读):幻读     MySQL默认

    Serializable(序列化)

    脏读:事务B查看了事务A未提交的事务

    不可重复读:第一次和第二次看到的数据不一致

    2、悲观锁和乐观锁?

    读取频繁使用乐观锁,写入频繁使用悲观锁

    3、MySQL哪些情况下索引会失效?

    1. 条件中有or
    2. like查询以%开头
    3. 多列索引的情况不是第一列

    【待更新】

    展开全文
  • Python后端工程师面试题(附答案)终结版

    万次阅读 多人点赞 2018-08-04 17:09:56
    之前在网上搜集python面试题,这是最流行的一个版本。但是没有答案,故自己搜集或回答了一部分。现分享给大家,有些题目 回答的并不准确,望各路大神纠正,完善!!! python语法以及其他基础部分 1.可变与不可变...

    之前在网上搜集python面试题,这是最流行的一个版本。但是没有答案,故自己搜集或回答了一部分。现分享给大家,有些题目

    回答的并不准确,望各路大神纠正,完善!!!

    python语法以及其他基础部分

    1.可变与不可变类型;
        不可变类型(数字、字符串、元组、不可变集合)不可变类型不能被修改。
        可变类型(列表、字典、可变集合)

    2.浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来设计,如何实现;

        基本类型 :
        基本类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们是通过按值来访问的。
        引用类型 :
        引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的。
        栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值的大小不固定,
        因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。
        这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,
        我们把它叫做按引用访问。

        浅拷贝只复制指向某个对象的引用地址,而不复制对象本身(只复制一层对象的属性),新旧对象还是共享同一块内存。
        但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
        浅复制只复制一层对象的属性,而深复制则递归复制了所有层级。
        import copy as cp
        L=[1,[2,3]]
        L1=cp.copy(L) #浅拷贝: 只是引用,并不会开辟新的内存空间,
                                                     L1与L指向同一片内存空间。L改变,L1也会锁着改变。
        L2=cp.deepcopy(L) #深拷贝:会为数据重新开辟一片内存空间,L的变化不会影响L2。


    3.__new__() 与 __init__()的区别;
        _new_作用于_init_之前。前者可以决定是否调用后者,或者说可以决定调用哪个类的_init_方法。
        首先要知道在面向对象编程中,实例化基本遵循创建实例对象、初始化实例对象、最后返回实例对象这么一个过程。
        Python 中的 _new_ 方法负责创建一个实例对象,_init_ 方法负责将该实例对象进行初始化;

    4.你知道几种设计模式;
        单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点,例如框架中的数据库连接
        装饰器模式:不修改元类代码和继承的情况下动态扩展类的功能,例如框架中的每个controller文件会提供before和after方法。
        迭代器模式: 提供一个方法顺序访问一个聚合对象中各个元素,在PHP中将继承 Iterator 类
        命令模式: 将”请求”封闭成对象, 以便使用不同的请求,队列或者日志来参数化其他对象. 命令模式也支持可撤销的操作.

    5.编码和解码你了解过么;

    • 编码 / encode:将 Unicode 字符串转换为特定编码格式对应的字节码的过程
    • 解码 / decode:将特定编码格式的字节码转换为对应的 Unicode 字符串的过程

    6.列表推导list comprehension和生成器的优劣;
        [expr for iter_var in iterable] 列表推导式是将所有的值一次性加载到内存中
        (expr for iter_var in iterable)
        在大数据量处理时,生成器表达式的优势就体现出来了,因为它的内存使用方式更好,
        效率更高,它并不创建一个列表,只是返回一个生成器。

    7.什么是装饰器;如果想在函数之后进行装饰,应该怎么做;
        装饰器是一个函数,这个函数的主要作用是包装另一个函数或类
        包装的目的是在不改变原函数名的情况下改变被包装对象的行为。
        接收一个函数,内部对其包装,然后返回一个新函数,这样子动态的增强函数功能
        通过高阶函数传递函数参数,新函数添加旧函数的需求,然后执行旧函数。

    8.手写个使用装饰器实现的单例模式;

        该模式的主要目的是确保某一个类只有一个实例存在。
        from functools import warps
        def My_decorate(f):
            @warps(f)
            def fn(*args,**kwargs):
                print('decorate called')
                return f(*args,**kwargs)
            return fn
        @My_decorate
        def fx():
            pring('fx called')
        fx()

    9.使用装饰器的单例和使用其他方法的单例,在后续使用中,有何区别;
        使用装饰器单例属性不会被覆盖。因为装饰器单例模式是直接返回之前生成的对象,
        并不会重新初始化对象。像new方法构建的单例模式会重新调用init方法,为实例重新初始化属性。

    10.手写:正则邮箱地址;
        pattern = '[a-zA-Z0-9_.-]+@[a-zA-Z0-9]+\.[a-z]'    
        匹配身份证:
        pattern = '(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)'
        pattern = '^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$'

    11.介绍下垃圾回收:引用计数/分代回收/孤立引用环;
        垃圾回收:python解释器对正在使用的对象保持计数,当某个对像的引用计数降为0时,垃圾收集器就可以释放
                            该对象,获取分配的内存。当分配对象和取消分配对象的差值高于阈值时垃圾回收才会启动。
        分代回收:python将所有的对象分为0,1,2三代。所有的新建对象都是0代对象。当某一代对象经历过垃圾回收,
                            依然存活,那么它就被归入下一代对象。垃圾回收启动时,一定会扫描所有的0代对象。
                            如果0代经过一定次数垃圾回收,那么就启动对0代和1代的扫描清理。
                            当1代也经历了一定次数的垃圾回收后,那么会启动对0,1,2,即对所有对象进行扫描。
        孤立引用环:
        
    12.多进程与多线程的区别;CPU密集型适合用什么;
        多线程:在单个程序中同时运行多个线程完成不同的工作,称为多线程。
        线程共享内存空间;进程的内存是独立的,
        同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现,
        一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程
        优缺点:1.多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程。
                        但是缺点是创建进程的代价非常大,因为操作系统要给每个进程分配固定的资源。
                        2.多线程优点是效率较高一些,但是致命的缺点是任何一个线程崩溃都可能
                        造成整个进程的崩溃,因为它们共享了进程的内存资源池。
        *CPU密集型适合用多进程开发

    13.进程通信的方式有几种;
        进程间通信主要包括管道, 系统IPC(包括消息队列,信号量,共享存储), SOCKET

    14.介绍下协程,为何比线程还快;
        高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理
        协程能保留上一次调用时的状态,管是进程还是线程,每次阻塞、切换都需要陷入系统调用,
        使用线程时需要非常小心地处理同步问题,而协程完全不存在这个问题。
        
    15.range和xrange的区别
        xrange和range 的用法完全相同,但是返回的是一个生成器。
     
    算法排序部分
     
    16.手写快排;堆排;几种常用排序的算法复杂度是多少;快排平均复杂度多少,最坏情况如何优化;

    17.手写:已知一个长度n的无序列表,元素均是数字,要求把所有间隔为d的组合找出来,你写的解法算法复杂度多少;
        def func(x, d):
            L = []
            n = len(x)
            if d > n:
                return None
            L.append(x[0])
            a = d + 1
            while a < n:
                L.append(x[a])
                a = a + d + 1
            return L

        list = [x for x in range(100)]
        result = func(list, 10)
        print(result)
        我写的只考虑到从第一个元素开始组合。没有考虑从第二个,第三个元素开始......求大神提供完全正确方法。
            
            
    18.手写:一个列表A=[A1,A2,…,An],要求把列表中所有的组合情况打印出来;
        
    19.手写:用一行python写出1+2+3+…+10**8 ;
        s = sum([x for x in range(1,10**8+1)])

    20.手写python:用递归的方式判断字符串是否为回文;
        def isHuiWen(str):
            if(len(str) <2):
                return True
            if str[0] !=str[-1]:
                return False
            return isHuiWen(str[1:-1])

        str = input("请输入一个字符串:")
        if isHuiWen(str):
            print("该字符串为回文字符串")
        else:
            print("该字符串不是回文")
                
    21.单向链表长度未知,如何判断其中是否有环;
    22.单向链表如何使用快速排序算法进行排序;
    23.手写:一个长度n的无序数字元素列表,如何求中位数,如何尽快的估算中位数,
        你的算法复杂度是多少;
    def func(list):
        if len(list) <= 1:
            return list
        L = sorted(list)
        n = len(list) % 2
        m = len(list) // 2
        if n == 0:
            s = (L[m] + L[m-1]) / 2
            return s
        s = L[m]
        return s

    l = [1,2,6,84,12,62,100]
    print(func(l))

    24.如何遍历一个内部未知的文件夹(两种树的优先遍历方式)
     
    网络基础部分
     
    25.TCP/IP分别在模型的哪一层;
        TCP 在传输层,
        IP在网络层

    26.socket长连接是什么意思;
        在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,
        需要双方发检测包以维持此链接,一般需要自己做在线维持。
        长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差
        数据库的连接用长连接。如果用短连接频繁的通信会造成socket错误,
        而且频繁的socket创建也是对资源的浪费

    27.select和epoll你了解么,区别在哪;

    28.TCP UDP区别;三次握手四次挥手讲一下;
        TCP协议:  (在传输之前先建立连接)面向连接(的通信服务):可靠地数据传输,失序,无差错,无丢失,无重复
        用途:适用于传输内容比较大,网络情况比较好,需要提供准确的情况.比如:聊天信息,文字传输,邮件传输。
        udp 协议:面向无连接的服务,不可靠,发送时由发送端自主进行,不考虑接收端。
        用途:适用于网络较差,对传输准确性要求低,广播组播.比如:视频会议,广播数据。

        三次握手:
        1.客户端向服务器发起链接请求(问是否可以连接)
        2.服务器接受到请求后进行确认(允许连接)返回报文
        3.客户端收到许可,建立连接

        四次挥手:
        1.主动方发送报文告知被动方要断开连接
        2.被动发返回报文没告知收到请求,准备断开
        3.被动发发送报文给主动方告知准备就绪可以断开
        4.主动方发送报文确定断开
    29.TIME_WAIT过多是因为什么;
    30.http一次连接的全过程:你来说下从用户发起request——到用户接收到response;
        域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,
        浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)
        --> 浏览器对页面进行渲染呈现给用户.
        参考大神文章:https://www.cnblogs.com/engeng/articles/5959335.html
    31.http连接方式。get和post的区别,你还了解其他的方式么;
        get是从服务器上获取数据,post是向服务器传送数据。在客户端, get方式在通过URL提交数据,
        数据在URL中可以看到;post方式,数据放置在HTML HEADER内提交。
        对于get方式,服务器端用Request.QueryString获取变量的值,
        对于post方式,服务器端用Request.Form获取提交的数据。
        Get 方式提交数据,会带来安全问题,比如一个登陆页面,通过 Get 方式提交数据时,
        用户名和密码将出现在 URL 上,如果页面可以被缓存或者其他人可以访问客户这台机器,
        就可以从历史记录获得该用户的帐号和密码,所以表单提交建议使用 Post 方法。
    32.restful你知道么;
    33.状态码你知道多少,比如200/403/404/504等等;
     200:操作成功。
     403:访问受限,授权过期(错误提示)
     404:资源,服务器未找到
     504:网关超时,服务器作为网关或代理,但是没有及时从上游服务器收到请求。

    展开全文
  • python后端开发面试常见问题 (持续更新)

    万次阅读 多人点赞 2021-03-14 15:21:18
    python后端开发面试常见问题   大家好,我叫亓官劼(qí guān jié ),在GitHub和CSDN中记录学习的点滴历程,时光荏苒,未来可期,一起加油~~ 本篇文章将在GitHub和CSDN上持续更新,主要是Python后端开发的...
  • Python 面试的时候,会涉及到很多的八股文,我结合自己的经验,整理Python 最强面试题Python 最强面试题主要包括以下几方面: Python 基础(已完成) Python 进阶(已完成) Python 后台开发 爬虫 机器学习 对...
  • 一、python相关的问题 1、问:python2和python3有什么差异? 编码: Python2 的默认编码是 asscii,这也是导致 Python2 中经常遇到编码问题的原因之一,至于是为什么会使用 asscii 作为默认编码,原因在于 Python...
  • Python后端工程师面试题目有哪些?下面就跟着小编一起赶紧来看看吧! 面试是公司挑选职工的一种重要方法。它给公司和应招者提供了进行双向交流的机会,能使公司和应招者之间相互了解,从而双方都可更准确做出聘用与否...
  • 关于python的基础1、python 中的is 和== 的区别?Python中对象包含的三个基本要素,分别是:id(身份标识) 、type(数据类型)和value(值)。‘==’比较的是value值 值是否相等‘is’比较的是id 是否为同一个对象,也...
  • python后端面试锦集

    千次阅读 2022-03-29 21:48:07
    python锦集 计算机网络 一.OSI与TCP/IP各层的结构与功能,都有哪些协议? 1.1 应用层 ​ 应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中...
  • Python后端面试Python后端技术栈Web请求的流程浏览器负载均衡Web框架业务逻辑数据库缓存Python语言基础语言特点语法基础高级特性算法与数据结构常用算法和数据结构分析时间、控件复杂度实现常见数据结构和算法编程...
  • python后端面试题

    千次阅读 多人点赞 2019-04-02 22:07:16
    理论简单 1. Django 、Flask、Tornado的对比 答案: 1.Django走的是大而全的方向,开发效率高。它的MTV框架,自带的ORM,admin后台管理,自带的sqlite数据库和开发测试用的服务器 给开发者提高了超高的开发效率 2....
  • 此文作为面试题目记录,其中会有一些自己遇到过的和在网上看到的比较具有代表性的面试题,其中如果在前面文章中已经写过的就会比较简略,持续更新,没有顺序。 1、python中的浅拷贝与深拷贝,变量及其引用(python...
  • 本人技术栈为Python后端开发,面经如下:老虎证券(挂)一面python基础部分:1.迭代器生成器 生成器是如何实现迭代的2.list实现3.import一个包时过程是怎么样的?4.装饰器实现5.菱形继承6.内存垃圾回收:分代回收细节7...
  • Python后端开发(主Django)面试题

    千次阅读 2020-08-07 11:51:35
    利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了; uWSGI 是一个全功能的 HTTP 服务器,他要做的就是把 HTTP 协议转化成语言支持的网络协
  • 记一次Python后端开发面试的经历【04/18】电话面试上来没废话,直接开始问问题。1、is和==的区别?is判断两个引用是否指向的是同一个变量,即内存id是否相等,==则是调用的eq方法,一般是用于判断值是否相等,也可以...
  • python后端面试 2020

    万次阅读 2018-08-29 00:26:40
    面试题如下 笔者在7月份遇到的面试题如下 1. 二分查找/算法原理/数据结构 二分查找法 key_num list def binary_search(key_num,list) mid=len(list)/2 if list[mid] &amp;gt; key_num: binary_...
  • 本文为大家分享的Python工程师面试题主要与Python Web相关,供大家参考,具体内容如下 1、解释一下 WSGI 和 FastCGI 的关系? CGI全称是“公共网关接口”(CommonGateway Interface),HTTP服务器与你的或其它机器上的...
  • python后端开发工程师面试题

    千次阅读 2021-05-20 15:19:22
    1.关于 Python 程序格式框架的描述,以下选项中错误的是 ( A ) A: Python 语言不采用严格的“缩进”来表明程序的格式框架 B: Python 单层缩进代码属于之前最邻近的一行非缩进代码,多层缩进代码根据缩进关系决定...
  • 据统计,目前Python开发人员的薪资待遇为10K以上,这样的诱惑很难让人拒绝,所以这几年使得许多人纷纷学习PythonPython 是一种解释型脚本语言,注重可读性和效率的语言,尤其是相较于 Java,PHP 以及 C++ 这样的语言,...
  • 迫于心慌,我好好思考了一阵来给自己打气,当时真正找坑和准备面试的过程大概分为这几个阶段: 反思:自己是不是真的要离职,假如不离职,在老东家接下来应该做什么才能继续提升? 定位:我在硬性技能(编码、架构...
  • 最新的python面试题,应聘初级python语言开发工程师必备之物,内容由浅入深,共近90题,独立无误完成,你的面试就完成了60%。希望可以帮到大家
  • 原标题:2019 Python后端开发面经总结本人技术栈为Python后端开发,面经如下:python基础部分:1. 迭代器生成器 生成器是如何实现迭代的2. list实现3. import一个包时过程是怎么样的?4. 装饰器实现5. 菱形继承6. ...
  • VIP专享文档VIP专享文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP专享文档”标识的文档便...
  • 国庆还在进行中,虽然不忍心破坏气氛,但是,肯定还有小伙伴为了工作烦心着呢,嗯,总结一下我九月三十号的面试,把面试题跟你们分享一下喽~~~~ 我去面试的时候总共有三个人面试我,第一个是面试官。下面是他问我的...
  • python面试题-web后端

    2020-02-21 13:33:00
    多进程开发比单进程多线程开发稳定性要强 多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发 优缺点 多进程: 优点:可以用多核 缺点:资源开销大 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,684
精华内容 4,273
关键字:

python后端开发面试题

友情链接: w32api-3.7.tar.gz