zoukankan      html  css  js  c++  java
  • 面试整理

    数据库整理

     

    一、MySQL

    1、mysql如何做分页

    mysql数据库做分页用limit关键字(数据量万以下),     数据量达到万以上,百万级使用主键或者唯一索引

     select 
            * 
        from 
            tb1 
        where 
            nid < (select nid from (select nid from tb1 where nid > 980 order by nid asc limit 20) A order by A.nid desc limit 1)  
        order by 
            nid desc 
        limit 10;


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

    innodb和myisam两个引擎,两者区别是
    innodb支持事物,myisam不支持
    innodb支持外键,myisam不支持
    innodb不支持全文索引,myisam支持全文索引
    innodb提供提交、回滚、崩溃恢复能力的事物的安全能力,实现并发控制
    myisam提供较高的插入和查询记录的效率,主要用于插入和查询

    http://www.cnblogs.com/ctztake/p/8453990.html


    3、数据库怎么建立索引

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


    4、一张表多个字段,怎么创建组合索引

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


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

    1.创建索引
    2.数据库读写分离,两个数据库,一个作为写,一个作为读
    3. 外键去掉


    4.django中orm表性能相关的


    select_related:

    对于一对一字段(OneToOneField)和外键字段(ForeignKey),可以使用select_related 来对QuerySet进行优化。

    复制代码
    select_related主要针一对一和多对一关系进行优化。
    select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。
    可以通过可变长参数指定需要select_related的字段名。也可以通过使用双下划线“__”连接字段名来实现指定的递归查询。
    没有指定的字段不会缓存,没有指定的深度不会缓存,如果要访问的话Django会再次进行SQL查询。
    也可以通过depth参数指定递归的深度,Django会自动缓存指定深度内所有的字段。如果要访问指定深度外的字段,Django会再次进行SQL查询。
    也接受无参数的调用,Django会尽可能深的递归查询所有的字段。但注意有Django递归的限制和性能的浪费。
    Django >= 1.7,链式调用的select_related相当于使用可变长参数。Django < 1.7,链式调用会导致前边的select_related失效,只保留最后一个。
    复制代码

     

    prefetch_related:

    对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。

    复制代码
    prefetch_related()和select_related()的设计目的很相似,都是为了减少SQL查询的数量,但是实现的方式不一样。后者是通过JOIN语句,在SQL查询内解决问题。
    但是对于多对多关系,使用SQL语句解决就显得有些不太明智,因为JOIN得到的表将会很长,会导致SQL语句运行时间的增加和内存占用的增加。若有n个对象,每个对象的多对多字段对应Mi条
    ,就会生成Σ(n)Mi 行的结果表。 prefetch_related()的解决方法是,分别查询每个表,然后用Python处理他们之间的关系。
    复制代码
    因为select_related()总是在单次SQL查询中解决问题,而prefetch_related()会对每个相关表进行SQL查询,因此select_related()的效率通常比后者高。
    鉴于第一条,尽可能的用select_related()解决问题。只有在select_related()不能解决问题的时候再去想prefetch_related()。
    你可以在一个QuerySet中同时使用select_related()和prefetch_related(),从而减少SQL查询的次数。
    只有prefetch_related()之前的select_related()是有效的,之后的将会被无视掉

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

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

    7、视图和表的区别

    视图是已经编译好的sql语句,是基于sql语句的结果集的可视化的表,而表不是
    视图是窗口,表示内容
    视图没有实际的物理记录,而表有

    视图是虚表,表是实表

    视图的建立和删除只影响视图本身,不影响对应的表

    8、关系型数据库的特点

    数据集中控制
    数据独立性高
    数据共享性好
    数据冗余度小
    数据结构化
    统一的数据保护能力

     

    9、mysql数据库都有哪些索引

    普通索引:普通索引仅有一个功能:加速查找
    唯一索引:唯一索引两个功能:加速查找和唯一约束(可含null)
    外键索引:外键索引两个功能:加速查找和唯一约束(不可为null)
    联合索引:联合索引是将n个列组合成一个索引,应用场景:同时使用n列来进行查询

     

    触发器

    使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询

    # 插入前
    CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 插入后
    CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 删除前
    CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 删除后
    CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 更新前
    CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 更新后
    CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    View Code
    #准备表
    CREATE TABLE cmd (
        id INT PRIMARY KEY auto_increment,
        USER CHAR (32),
        priv CHAR (10),
        cmd CHAR (64),
        sub_time datetime, #提交时间
        success enum ('yes', 'no') #0代表执行失败
    );
    
    CREATE TABLE errlog (
        id INT PRIMARY KEY auto_increment,
        err_cmd CHAR (64),
        err_time datetime
    );
    
    #创建触发器
    delimiter //
    CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW
    BEGIN
        IF NEW.success = 'no' THEN #等值判断只有一个等号
                INSERT INTO errlog(err_cmd, err_time) VALUES(NEW.cmd, NEW.sub_time) ; #必须加分号
          END IF ; #必须加分号
    END//
    delimiter ;
    
    
    #往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
    INSERT INTO cmd (
        USER,
        priv,
        cmd,
        sub_time,
        success
    )
    VALUES
        ('egon','0755','ls -l /etc',NOW(),'yes'),
        ('egon','0755','cat /etc/passwd',NOW(),'no'),
        ('egon','0755','useradd xxx',NOW(),'no'),
        ('egon','0755','ps aux',NOW(),'yes');
    
    
    #查询错误日志,发现有两条
    mysql> select * from errlog;
    +----+-----------------+---------------------+
    | id | err_cmd         | err_time            |
    +----+-----------------+---------------------+
    |  1 | cat /etc/passwd | 2017-09-14 22:18:48 |
    |  2 | useradd xxx     | 2017-09-14 22:18:48 |
    +----+-----------------+---------------------+
    rows in set (0.00 sec)
    
    插入后触发触发器
    View Code

    特别的:NEW表示即将插入的数据行,OLD表示即将删除的数据行。

    二 使用触发器

    触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。

    三 删除触发器

    drop trigger tri_after_insert_cmd;

    10、存储过程

    http://www.cnblogs.com/ctztake/p/7544559.html

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

    11、sql优化:

    选取最适用的字段属性

    使用连接(JOIN)来代替子查询(Sub-Queries)

    select句中避免使用 '*'

    减少访问数据库的次数
    删除重复记录
    用where子句替代having子句
    减少对表的查询
    explain

    12、char和vachar区别:

    char是固定长度,存储需要空间12个字节,处理速度比vachar快,费内存空间,当存储的值没有达到指定的范围时,会用空格替代
    vachar是不固定长度,需要存储空间13个字节,节约存储空间,存储的是真实的值,会在存储的值前面加上1-2个字节,用来表示真实数据的大小

    13、Mechached与redis

    mechached:只支持字符串,不能持久化,数据仅存在内存中,宕机或重启数据将全部失效
    不能进行分布式扩展,文件无法异步法。
    优点:mechached进程运行之后,会预申请一块较大的内存空间,自己进行管理。
    redis:支持服务器端的数据类型,redis与memcached相比来说,拥有更多的数据结构和并发支持更丰富的数据操作,可持久化。
    五大类型数据:string、hash、list、set和有序集合,redis是单进程单线程的。
    缺点:数据库的容量受到物理内存的限制。

    14、sql注入

    sql注入是比较常见的攻击方式之一,针对编程员编程的疏忽,通过sql语句,实现账号无法登陆,甚至篡改数据库。
    防止:凡涉及到执行sql中有变量时,切记不要用拼接字符串的方法


    16、游标是什么?

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

    17、 数据库支持多有标准的SQL数据类型,重要分为三类

    数值类型(tinyint,int,bigint,浮点数,bit)
    字符串类型(char和vachar,enum,text,set)
    日期类型(date,datetime,timestamp)

    枚举类型与集合类型

    18、mysql慢查询

    慢查询对于跟踪有问题的查询很有用,可以分析出当前程序里哪些sql语句比较耗费资源
    慢查询定义:
    指mysql记录所有执行超过long_query_time参数设定的时间值的sql语句,慢查询日志就是记录这些sql的日志。
    mysql在windows系统中的配置文件一般是my.ini找到mysqld
    log-slow-queries = F:MySQLlogmysqlslowquery.log 为慢查询日志存放的位置,一般要有可写权限
    long_query_time = 2 2表示查询超过两秒才记录

    19、memcached命中率

    命中:可以直接通过缓存获取到需要的数据
    不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其他的操作,原因可能是由于缓存中根本不存在,或者缓存已经过期
    缓存的命中率越高则表示使用缓存的收益越高,应额用的性能越好,抗病发能力越强
    运行state命令可以查看memcached服务的状态信息,其中cmd—get表示总的get次数,get—hits表示命中次数,命中率=get—hits / cmd—get

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

    他们都有各自的优点和缺点。考虑到时间因素,我倾向于MySQL
    选择MySQL而不选Oracle的原因
    MySQL开源
    MySQL轻便快捷
    MySQL对命令行和图形界面的支持都很好
    MySQL支持通过Query Browser进行管理

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

    1.为经常出现在关键字order by、group by、distinct后面的字段,建立索引
    2.在union等集合操作的结果集字段上,建立索引,其建立索引的目的同上
    3.为经常用作查询选择的字段,建立索引
    4.在经常用作表连接的属性上,建立索引

    22、数据库底层是用什么结构实现的,你大致画一下

    底层用B+数实现,结构图参考:
    http://blog.csdn.net/cjfeii/article/details/10858721
    http://blog.csdn.net/tonyxf121/article/details/8393545

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

    1.防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量
    2.最小权限原则,特别是不要用root账户,为不同的类型的动作或者组建使用不同的账户
    3.当sql运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄漏服务器和数据库相关信息

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

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

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

    服务器突然断电导致数据文件损坏
    强制关机,没有先关闭mysq服务器等

    26、drop、delete与truncate的区别

    当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,

    DELETE操作不会减少表或索引所占用的空间。

     drop语句将表所占用的空间全释放掉。

    复制代码
    一、delete
    
    1、delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,
    需要手动提交(commit)操作才能生效,可以通过rollback撤消操作。
    2、delete可根据条件删除表中满足条件的数据,如果不指定where子句,那么删除表中所有记录。 3、delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不变。 二、truncate 1、truncate是DDL,会隐式提交,所以,不能回滚,不会触发触发器。 2、truncate会删除表中所有记录,并且将重新设置高水线和所有的索引,缺省情况下将空间释放到minextents个extent,除非使用reuse storage,。不会记录日志,所以执行速度很快,
    但不能通过rollback撤消操作(如果一不小心把一个表truncate掉,也是可以恢复的,只是不能通过rollback来恢复)。
    3、对于外键(foreignkey )约束引用的表,不能使用 truncate table,而应使用不带 where 子句的 delete 语句。 4、truncatetable不能用于参与了索引视图的表。 三、drop 1、drop是DDL,会隐式提交,所以,不能回滚,不会触发触发器。 2、drop语句删除表结构及所有数据,并将表所占用的空间全部释放。 3、drop语句将删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态。
    复制代码

     

    27、数据库范式

    1.第一范式:就是无重复的列
    2.第二范式:就是非主属性非部分依赖于主关键字
    3.第三范式:就是属性不依赖于其他非主属性(消除冗余)

    28、MySQL锁类型

    根据锁的类型分:可以分为共享锁、排他锁、意向共享锁和意向排他锁
    根据锁的粒度分:可以分为行锁、表锁
    对于mysql而言,事务机制更多是靠底层的存储引擎来实现的,因此,mysql层面只有表锁,
    而支持事物的innodb存储引起则实现了行锁(在行相应的索引记录上的锁)
    说明:对于更新操作(读不上锁),只有走索引才可能上行锁
    MVCC(多版本并发控制)并发控制机制下,任何操作都不会阻塞读取操作,
    读取操作也不会阻塞任何操作,只因为读不上锁
    共享锁:由读表操作加上的锁,加锁后其他用户只能获取该表或行的共享锁,不能获取排他锁,
    也就是说只能读不能写
    排他锁:由写表操作加上的锁,加锁后其他用户不能获取该表或该行的任何锁,典型mysql事物中的更新操作
    意向共享锁(IS):事物打算给数据行加行共享锁,事物在给一个数据行加共享锁前必须先取得该表的IS锁
    意向排他锁(IX):事物打算给数据行加行排他锁,事物在给一个数据行家排他锁前必须先取得该表的IX锁

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

    1.在数据库安装的时候指定字符集
    2.如果在按完了以后可以更改配置文件
    3.建立数据库时候:指定字符集类型
    4.建表的时候也指定字符集

    30、数据库应用系统设计

    1.规划
    2.需求分析
    3.概念模型设计
    4.逻辑设计
    5.物理设计
    6. 程序编制及调试
    7.运行及维护

     

    二、django
    1、中间件

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

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

    Django:Django无socket,django的目的是简便,快速开发,并遵循MVC设计,多个组件可以很方便的以“插件”形式服务于整个框架,
    django有许多功能强大的第三方插件。django具有很强的可扩展性。
    Tornado:它是非阻塞式服务器,而且速度相当快,得力于其 非阻塞的方式和对epoll的运用,Future对象,缺点:没有session,需要自定制
    Flask:是一个微型的web框架,配合SQLALchemy来使用,jinja2模板, werkzeug接口

    3、 django版本,Python版本,linux版本

    django:1.11
    Python:3.5
    linux:6.8
    4、django的template的注释是什么样子的

    单行:{#注释#}
    多行注释:{%comment%}

    5、django怎么弄并发的

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

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

    事件循环

    7、select_related和prefetch_related,Q和F

    select_related:一对多使用,查询主动做连表
    prefetch_related:多对多或者一对多的时候使用,不做连表,做多次查询
    Q:用于构造复杂查询条件
    F:更新时用于获取原来的值,专门取对象中某一列进行操作

    8、什么是ORM?

    ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间做一个映射
    ORM优缺点:
    优点:摆脱复杂的SQL操作,适应快速开发,让数据结果变得简单,数据库迁移成本更低
    缺点:性能较差,不适用于大型应用,复杂的SQL操作还需要通过SQL语句实现

    9、CORS跨域资源共享

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

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

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

    11、CBV和FBV

    CBV在指定的类上面加上装饰器或在此方法上面添加装饰器 @method_decorator,并继承view

    12、cookie及session

    cookie:是保留在客户端上面的一组键值对,cookie不是很安全,别人可以分析存放在本地的cookie
    session:是保存在服务器上面的一组键值对,依赖与cookie,安全指数比cookie高

    13、django的请求生命周期

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

    14、uwsgi和wsgi

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

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

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



    三、Python部分
    1、 __new__.__init__区别,如何实现单例模式,有什么优点

    __new__是一个静态方法,__init__是一个实例方法
    __new__返回一个创建的实例,__init__什么都不返回
    __new__返回一个cls的实例时后面的__init__才能被调用
    当创建一个新实例时调用__new__,初始化一个实例时调用__init__

    2、深浅拷贝

    浅拷贝只是增加了一个指针指向一个存在的地址,而深拷贝是增加一个指针并且开辟了新的内存,这个增加的指针指向这个新的内存,
    采用浅拷贝的情况,释放内存,会释放同一内存,深拷贝就不会出现释放同一内存的错误

    3、HTTP/IP相关协议,分别位于哪层

    http协议是超文本传输协议,http协议是基于TCP/IP通信协议来传递数据
    http协议工作与c/s架构上,浏览器作为http的客户端通过URL向http服务端即web服务器发送所用请求。web服务器收到所有请求后,向客户端发送响应信息,
    http特点是短连接,无状态

    地址栏键输入URL,按下回车之后经历了什么?
    1.浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址
    2.解析出IP地址后,根据IP地址和默认端口80,和服务器建立TCP连接
    3.浏览器发出读取文件的http请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器
    4.服务器对浏览器请求做出响应,并把对应的html文件发送给浏览器
    5.释放TCP连接
    6.浏览器将该HMTL渲染并显示内容

    4、TCP/UDP区别

    TCP协议是面向连接,保证高可靠性(数据无丢失,数据无失序,数据无错误,数据无重复达到)传输层协议
    UDP:数据丢失,无秩序的传输层协议(qq基于udp协议)

    5、webscoket

    websocket是基于http协议的,可持续化连接
    轮询:浏览器每隔几秒就发送一次请求,询问服务器是否有新消息
    长轮询:客户端发起连接后,如果没有消息,就一直不返回response给客户端,直到有消息返回,返回完之后,客户端再次发起连接

    6、RabbitMQ:

    服务器端有Erlang语言来编写,支持多种客户端,只会ajax,用于分布式系统中存储转发消息,在易用性、扩展性、高可用性的方面不俗。
    connection是RabbitMQ的socket连接,它封装了socket部分相关协议逻辑
    connectionFactroy为connection的制造工厂
    channel是我们与RabbitMQ打交道的最重要的一个接口,大部分的业务操作是在chaanel这个接口中完成,包括定义Queue、定义Exchange、
    绑定Queue与Exchange,发布消息等

    7、装饰器

    调用装饰器其实是一个闭包函数,为其他函数添加附加功能,不修改被修改的源代码和不修改被修饰的方式,装饰器的返回值也是一个函数对象。
    比如:插入日志、性能测试、事物处理、缓存、权限验证等,有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

    8、闭包

    1.必须有一个内嵌函数
    2.内嵌函数必须引用外部函数的变量(该函数包含对外作用域而不是全局作用域名字的引用)
    3.外部函数的返回值必须是内嵌函数

    9、迭代器与生成器

    迭代可迭代对象对应_iter_(方法)和迭代器对应_next_(方法)的一个过程
    生成器:包括含有yield这个关键字,生成器也是迭代器,调动next把函数变成迭代器。

    10、classmethod,staticmethod,property

    类方法:将类的函数转换成类方法,函数上装饰@classmethod会将函数的自动传值参数改成cls
    静态方法:此方法相当于给类扩展一个功能,将类内的函数实例化,给类或对象使用,此时类内的函数就是普通函数,不管是类还是实例化的对象都可以使用
    实例化:类的实例化就会产生一个实例(对象),可以理解为类()把虚拟的东西实例化,得到具体存在的值

    11、常用的状态码

    200--服务器成功返回网页
    204--请求收到,但返回信息为空
    304--客户端已经执行了GET,但文件未变化
    400--错误请求,如语法错误
    403--无权限访问
    404--请求的页面不存在
    500--服务器产生内部错误

    12、多进程,多线程,协程,GIL

    GIL:全局解释器锁,是锁在cpython解释器上,导致同一时刻,同一进程只能有一个线程被执行
    多进程:多进程模块multiprocessing来实现,cpu密集型,IO计算型可以用多进程
    多线程:多线程模块threading来实现,IO密集型,多线程可以提高效率
    协程:依赖于geenlet,对于多线程应用。cpu通过切片的方式来切换线程间的执行,遇到IO操作自动切换,线程切换时需要耗时,
    而协成好处没有切换的消耗,没有锁定概念。
    进程:是资源管理单位,进行是相互独立的,实现并发和并发
    线程:是最小的执行单位,线程的出现为了降低上下文切换的消耗,提供系统的并发性

    13、IO多路复用/异步非阻塞

    IO多路复用:通过一种机制,可以监听多个描述符 select/poll/epoll
    select:连接数受限,查找配对速度慢,数据由内核拷贝到用户态
    poll:改善了连接数,但是还是查找配对速度慢,数据由内核拷贝到用户态
    epoll:epoll是linux下多路复用IO接口,是select/poll的增强版,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率
    异步非阻塞:异步体现在回调上,回调就是有消息返回时告知一声儿进程进行处理。非阻塞就是不等待,不需要进程等待下去,
    继续执行其他操作,不管其他进程的状态。

    14、PEP8规范,规范的好处是什么?

    1.缩进:4个空实现缩进,尽量不使用Tab
    2.行:没行最大长度不超过79,换行可以使用反斜杠
    3.命名规范:
    4.注释规范:

    15、range-and-xrange

    都在循环时使用,xrange内存性能更好,xrange用法与range完全相同,range一个生成list对象,xrange是生成器

    16、with上下文机制原理

    _enter_和_exit_,上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象类中声明_enter_和_exit_方法,
    使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须收到干预

    17、经典类、新式类

    经典类遵循:深度优先,python2中
    新式类遵循:广度优先,Python3中

    18、有没有一个工具可以帮助查找Python的bug和进行静态的代码分析?

    PyChecker是一个Python代码的静态分析工具,它可以帮助查找Python代码的bug,会对代码的复杂度和格式提出警告,
    Pylint是另外一个工具可以进行codingstandard检查

    19、 Python是如何进行内存管理的

    1.对象引用计数:
    引用计数增加的情况:
    来保持追踪内存中的对象,所有对象都用引用计数,一个对象分配一个新名称
    将其放入一个容器中(列表,字典,元祖)
    引用计数减少的情况:
    使用del语句对对象别名显示的销毁
    引用超出作用域或被重新赋值
    sys.getrefcount()函数可以获得对象的当前引用计数
    2.标记-清除机制

    3.分代技术

    20、什么是python?使用python有什么好处?

    python是一种编程语言,它有对象、模块、线程、异常处理和自动内存管理。它简洁,简单、方便、容易扩展、有许多自带的数据结果,而且它开源

    21、什么是pickling和unpickling?

    Pickle模块读入任何python对象,将它们转换成字符串,然后使用dump函数将其转储到一个文件中——这个过程叫做pickling
    反之从存储的字符串文件中提取原始python对象的过程,叫做unpickling

    22、python是如何被解释的?

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

    23、数组和元祖之间的区别是什么?

    数组和元祖之间的区别:数组内容可以被修改,而元祖内容是只读的,不可被修改的,另外元祖可以被哈希,比如作为字典的key

    24、参数按值传递和引用传递是怎么实现的?

    python中的一切都是类,所有的变量都是一个对象的引用。引用的值是由函数确定的,因此无法被改变,但是如果一个对象是可以被修改的,你可以改动对象

    25、Python都有哪些自带的数据结构?

    Python自带的数据结构分为可变和不可变的:可变的有:数组、集合、字典,不可变的是:字符串、元祖、整数

    26、什么是python的命名空间?

    在python中,所有的名字都存在于一个空间中,它们在改空间中存在和被操作——这就是命名空间,它就好像一个盒子,在每个变量名字都对应装着一个对象,
    当查询变量的时候,会从该盒子里面寻找相应的对象

    27、python中的unittest是什么?

    在python中,unittest是python中的单元测试框架,它拥有支持共享搭建、自动测试、在测试中暂停代码、将不同测试迭代成一组

    28、*args与**kwargs

    *args代表位置参数,它会接收任意多个参数并把这些参数作为元祖传递给函数。**kwargs代表的关键字参数,返回的是字典,位置参数一定要放在关键字前面

    29、在Python中什么是slicing?

    slicing是一种在有序的对象类型中(数组、元祖、字符串)节选某一段的语法

    30、中的docstring是什么?

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

    31、os与sys区别:

    os是模块负责程序与操作系统的交互,提供了访问操作系统底层的接口
    sys模块是负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控Python时运行的环境
    32、实现一个单例模式

    _new_()在 _init_()之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。
    单例模式是指创建唯一对象,单例模式设计的类只能实例,实例化1个对象

    class Singleton(object):
                            __instance=None
                            def __init__(self):
                                pass
                            def __new__(cls, *args, **kwargs):
                                if Singleton.__instance is None:
                                    Singleton.__instance=object.__new__(cls,*args,**kwargs)
                                return Singleton.__instance

    33、算法(冒泡排序,选择排序,插入排序)
    冒泡:首先,列表每两个相邻的数,如果前面的比后边的大,
    那么交换这两个数,代码关键点:趟和无序区,
    时间复杂度为:O(n2)

    import random
        def dublue_sort(li):
            for i in range(len(li)-1):
                exchange= False
                for j in range(len(li)-i -1):
                    if li[j] > li[j+1]:
                        li[j],li[j+1] = li[j+1],li[j]
                        exchange = True
                if not exchange:
                    return
            return li
        li=list(range(100))
        random.shuffle(li)
        print(li)
        print(dublue_sort(li))

    选择:一趟遍历记录最小的数,放到第一个位置,再一趟遍历记录剩余列表中最小的数,
    继续放置,代码关键点:无序区和最小数的位置,时间复杂度为:O(n2)

    def select_sort(li):
         for i in range(len(li)-1): #i是趟
             min_loc=i
             #找i位置到最后位置范围内最小的数
             for j in range(i,len(li)):
                 if li[j] < li[min_loc]:
                     min_loc = j
             #和无序区第一个数作交换
                     li[min_loc],li[i] = li[i],li[min_loc]
         return li
    li=list(range(100))
    random.shuffle(li)
    print(select_sort(li))

    插入:列表被分为有序区和无序区两个部分。最初有序区只有一个元素,
    每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空,
    代码关键点:摸到的牌和手里的牌,时间复杂度为:O(n2)

    def insert_sort(li):
            for i in range(1,len(li)):  #i 代表每次摸到的牌的下标
                tmp=li[i]
                j = i-1  # j代表手里最后一张牌的下标
                while True:
                    if j < 0 or tmp >= li[j]:
                        break
                    li[ j + 1] = li [j]
                    j -=1
                li[j+1] = tmp
        li=list(range(100))
        print(insert_sort(li))

    二分:列表查找:从列表中查找指定元素,输入:列表、待查找元素,输出:元素下标或未查找到元素。
    二分查找,从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,
    可以使候选区减少一半。时间复杂为:O(logn)

    def bin_search(data,val):
        low=0
        high=len(data)-1
        while low <= high :
            mid= (low+high) //2
            if data[mid] == val:
                return mid
            elif data[mid] < high :
                low = mid + 1
            else:
                high = mid - 1
        return None
    print(bin_search([1,2,3,4,5,6,7,8],4))

    四、RESTful API设计指南
    参考地址:
    http://www.ruanyifeng.com/blog/2014/05/restful_api.html

    1、协议

    API与用户的通信协议,总是使用HTTPs协议
    2、域名

    应该尽量将API部署在专用域名之下
    https://api.example.com
    如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下
    https://example.org/api/
    3、版本

    应该将API的版本号放入URL
    https://api.example.com/v1/
    另一种做法是:将版本号放在HTTP头信息中,
    4、路径
    https://api.example.com/v1/zoos
    https://api.example.com/v1/animals
    https://api.example.com/v1/employees
    5、动词
    对于资源的具体操作类型,由HTTP动词表示
    GET(SELECT):从服务器取出资源(一项或多项)。
    POST(CREATE):在服务器新建一个资源。
    PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
    PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
    DELETE(DELETE):从服务器删除资源。
    还有两个不常用的HTTP动词
    GET /zoos:列出所有动物园
    POST /zoos:新建一个动物园
    GET /zoos/ID:获取某个指定动物园的信息
    PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
    PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
    DELETE /zoos/ID:删除某个动物园
    GET /zoos/ID/animals:列出某个指定动物园的所有动物
    DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

    6、过滤信息(Filtering)
    如果记录数量很多,服务器不可能都将它们返回给用户,API应该提供参数,过滤返回结果
    ?limit=10:指定返回记录的数量
    ?offset=10:指定返回记录的开始位置。
    ?page=2&per_page=100:指定第几页,以及每页的记录数。
    ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
    ?animal_type_id=1:指定筛选条件

    7、状态码(Status Code)
    200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
    201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
    202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
    204 NO CONTENT - [DELETE]:用户删除数据成功。
    400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
    401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
    403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
    404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
    406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
    410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
    422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
    500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。 

  • 相关阅读:
    es5预览本地文件、es6练习代码演示案例
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 836 矩形重叠(暴力)
    Subversion under Linux [Reprint]
    Subversion how[Reprint]
  • 原文地址:https://www.cnblogs.com/zcok168/p/9766281.html
Copyright © 2011-2022 走看看