博客地址:ask.hellobi.com/blog/zhiji 欢迎你们来交流学习。前端
十一小长长长长长长长长假还有一天, 然而, 你不肯再冲进拥挤的人潮, 不肯再涌向苦等的队伍, 不肯再成为那个躺在床上 观看别人朋友圈的人。 或许, 我能够将你的焦虑、你的不安、你的无聊, 通通划掉!而且还将带给你一大波(python)豪(基)礼(础), 对,你没看错!快来手把手跟我复习Python基础。python
#1、python是什么?mysql
#1.python数据结构nginx
Python中常见的数据结构能够统称为容器(container)。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要的容器。程序员
#2.设计模式 设计模式(Design pattern)表明了最佳的实践,一般被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程当中面临的通常问题的解决方案。web
1 . 抽象工厂模式 为一个产品族提供了统一的建立接口。当须要这个产品族的某一系列的时候,能够从抽象工厂中选出相应的系列建立一个具体的工厂类。redis
2 . 工厂方法模式 定义一个接口用于建立对象,可是让子类决定初始化哪一个类。工厂方法把一个类的初始化下放到子类。算法
3 . 生成器模式 将一个复杂对象的构建与它的表示分离,使得一样的构建过程能够建立不一样的表示。sql
4 . 单例模式 确保一个类只有一个实例,并提供对该实例的全局访问。数据库
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance 复制代码
5 . 适配器模式 将某个类的接口转换成客户端指望的另外一个接口表示。适配器模式能够消除因为接口不匹配所形成的类兼容性问题。
6 . 观察者模式 在对象间定义一个一对多的联系性,由此当一个对象改变了状态,全部其余相关的对象会被通知而且自动刷新。
#3.栈和队列 ###1.什么是栈 想象一摞被堆起来的书,这就是栈。这堆书的特色是,最后被堆进去的书,永远在最上面。从这堆书里面取一本书出来,取哪本书最方便?确定是最上面那本。栈这种数据结构的特色就是如此:后进先出(Last In First Out - LIFO),即最后被堆进去的数据,最早被拿出来。 ###2.栈的Python实现
class Stack(object):
# 初始化栈为空列表
def __init__(self):
self.items = []
# 判断栈是否为空,返回布尔值
def is_empty(self):
return self.items == []
# 返回栈顶元素
def peek(self):
return self.items[len(self.items) - 1]
# 返回栈的大小
def size(self):
return len(self.items)
# 把新的元素堆进栈里面(程序员喜欢把这个过程叫作压栈,入栈,进栈……)
def push(self, item):
self.items.append(item)
# 把栈顶元素丢出去(程序员喜欢把这个过程叫作出栈……)
def pop(self, item):
return self.items.pop()
复制代码
Python里面实现栈,就是把list包装成一个类,再添加一些方法做为栈的基本操做。其余的数据结构在Python中也是以相似的方式实现的。 ###3.队列Queue() 队列是一种列表,不一样的是队列只能在队尾插入元素,在队首删除元素。队列用于存储按顺序排列的数据,先进先出,这点和栈不同,在栈中,最后入栈的元素反而被优先处理。 队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。队列被用在不少地方,好比提交操做系统执行的一系列进程、打印任务池等,一些仿真系统用队列来模拟银行或杂货店里排队的顾客。 队列的两种主要操做是:向队列中插入新元素和删除队列中的元素。插入操做也叫作入队,删除操做也叫作出队。入队操做在队尾插入新元素,出队操做删除队头的元素。
#4.python的垃圾回收机制 经过**“引用计数”(reference counting)来跟踪和回收垃圾。 在引用计数的基础上,还能够经过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题。 经过“分代回收”(generation collection)**以空间换取时间来进一步提升垃圾回收的效率。
#5.组合和继承? 组合和继承咱们倾向于选择组合,继承体现的是一种专门化的概念而组合则是一种组装的概念 #6.python代码中使用try except的优缺点? 优势: 正常操做代码的控制流不会和错误处理代码混在一块儿. 当某种条件发生时, 它也容许控制流跳过多个框架;集中报错。
缺点: 可能会致使让人困惑的控制流. 调用库时容易错过错误状况。
#7.SOCKET编程
Socket是进程通信的一种方式,即调用这个网络库的一些API函数实现分布在不一样主机的相关进程之间的数据交换。 适用场合:socket是位于传输层的网络编程了,通常用于须要本身定义应用层的协议的应用程序。
socket的结构:socket的结构很简单,只有三个元素,协议,端口号,IP地址。Socket=Ip address+ TCP/UDP + port
TCP和UDP的区别:(TCP)传输控制协议,是一种提供可靠数据传输的通用协议。(UDP)用户数据报协议,是一个面向无链接的协议。采用该协议不须要两个应用程序先创建链接。UDP协议不提供差错恢复,不能提供数据重传,所以该协议传输数据安全性差。
#8.乐观锁和悲观锁?
2.服务器端应当为一个合法的SYN回送一个SYN/ACK。ACK 的确认码应为 A+1,SYN/ACK 包自己又有一个随机序号 B。
3.最后,客户端再发送一个ACK。当服务端受到这个ACK的时候,就完成了三路握手,并进入了链接建立状态。此时包序号被设定为收到的确认号 A+1,而响应则为 B+1。 #10.四次挥手 TCP的链接的拆除须要发送四个包,所以称为四次挥手(four-way handshake)。客户端或服务器都可主动发起挥手动做,在socket编程中,任何一方执行close()操做便可产生挥手操做。
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。 (2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN同样,一个FIN将占用一个序号。 (3)服务器B关闭与客户端A的链接,发送一个FIN给客户端A。 (4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
#11.HTTP和HTTPS HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。 超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通讯的规则,经过因特网传送万维网文档的数据传送协议。 HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的区别主要以下: 一、https协议须要到ca申请证书,通常免费证书较少,于是须要必定费用。 二、http是超文本传输协议,信息是明文传输,https则是具备安全性的ssl加密传输协议。 三、http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。 四、http的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
#12.Python2和3一些区别 #####1. __future__
模块 from __future__ import division
若是你但愿在Python 2环境下写的代码也能够在Python 3.x中运行,那么建议使用__future__
模块。 #####2.print
函数 Python 2中的print语句被Python 3中的print()
函数取代,这意味着在Python 3中必须用括号将须要输出的对象括起来。 #####3.整数除法 整型除法返回浮点数,要获得整型结果,在python3中使用// Python2中: 3 / 2 = 1
Python3中:3 / 2 = 1.5 #####4.Unicode Python 3中,终于有了Unicode(utf-8)字符串,以及两个字节类:bytes和bytearrays。 #####5.Xrange 在Python 3中,range()的实现方式与xrange()函数相同,因此就不存在专用的xrange()(在Python 3中使用xrange()会触发NameError)。 #####6.异常处理 Python 3中的异常处理也发生了一点变化。在Python 3中必须使用“as”关键字。
try:
.......
except NameError as err:
复制代码
Python2:
try:
.......
except NameError, err:
复制代码
#####7.Python 3改进了input()函数,这样该函数就会老是将用户的输入存储为str对象。在Python 2中,为了不读取非字符串类型会发生的一些危险行为,不得不使用raw_input()代替input()。 #13.GIL 含义、多线程、多线程、 协程区别 ###进程有哪几种基本状态?
一、就绪状态 当进程已分配到除 CPU 之外的全部必要的资源,只要得到 处理机即可当即执行,这时的进程状态称为就绪状态。
二、执行状态 当进程已得到处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
三、阻塞状态 正在执行的进程,因为等待某个事件发生而没法执行时,便放弃处理机而处于阻塞状态。引发进程阻塞的事件可有多种,例如,等待 I/O 完成、申请缓冲区不能知足、等待信件(信号)等。
**注意:**GIL 只存在于CPython 中,其余 PyPy、IronPython、Jython 没有这个问题。
进程:进程之间不共享任何状态,进程的调度由操做系统完成,每一个进程都有本身的独立的内存空间,进程间的通信主要是经过信号传递的方式来实现的,实现的方式有多种,信号量,管道,事件等,任何一种方式的通信效率都须要经过内核,致使通信效率比较低。因为是独立的内存空间,上下文切换的时候须要先保存调用栈的信息,CPU 各寄存器的信息,虚拟内存,以及打开的相关句柄等信息,因此致使上下文进程间切换开销很大,通信麻烦。
线程:线程之间共享变量,解决了通信麻烦的问题,但对变量的访问须要锁,线程的调度主要也是有操做系统完成,一个进程能够拥有多个线程,可是其中每一个线程会共享父进程向操做系统申请资源,这个包括虚拟内存,文件等,因为是共享资源,因此建立线程所须要的系统资源占用比进程小不少,相应的可建立的线程数量也变得相对多不少。线程时间的通信除了可使用进程之间通信的方式以外还能够经过共享内存的方式进行通讯,因此这个速度比经过内核要快不少。另外在调度方面也是因为内存是共享的,因此上下文切换的时候须要保存的东西就相对少一些,这样一来上下文切换也变得高效
协程:协程的调度彻底由用户控制,一个线程能够有多个协程,用户建立了几个协程,而后每一个协程都是循环按照指定的任务清单顺序完成不一样的任务,当任务被堵塞的时候执行下一个任务,当恢复的时候再回来执行这个任务,任务之间的切换只须要保存每一个任务的上下文内容,就像直接操做栈同样的,这样就彻底没有内核
#14.装饰器、生成器 、迭代器
#2、数据库 #1.数据库升序降序 数据库 中使用order by语句进行排序,其中升序用asc,降序用desc。 如:
select * from t order by 列a asc; -- 这是升序 asc能够省略不写
select * from t order by 列a desc; -- 这是降序
复制代码
#2.Mysql优化
#3.Mysql 的链接查询有哪些
INNER JOIN(内链接,或等值链接):取得两个表中存在链接匹配关系的记录。
LEFT JOIN(左链接):取得左表(table1)彻底记录,便是右表(table2)并没有对应匹配记录。
RIGHT JOIN(右链接):与 LEFT JOIN 相反,取得右表(table2)彻底记录,便是左表(table1)并没有匹配对应记录。
#4.mysql 经常使用的引擎InnoDB(我用的是InnoDB) **优势:**InnoDB 支持事务,事务是一种高级的处理方式,如在一些列增删改中只要哪一个出错还能够回滚还原;支持外键;
**缺点:**清空整个表时,InnoDB 是一行一行的删除,效率很是慢。
#5.redis 基本类型 **Redis 支持五种数据类型:**string(字符串)、hash(哈希)、list(列表)、set(集合)及 zset(sorted set:有序集合)。 #6.数据库的隔离级别 (一)可读取未确认(Read uncommitted)
写事务阻止其余写事务,避免了更新遗失。可是没有阻止其余读事务。 存在的问题:脏读。即读取到不正确的数据,由于另外一个事务可能还没提交最终数据,这个读事务就读取了中途的数据,这个数据多是不正确的。 解决办法就是下面的“可读取确认”。
(二)可读取确认(Read committed)
写事务会阻止其余读写事务。读事务不会阻止其余任何事务。 存在的问题:不可重复读。即在一次事务之间,进行了两次读取,可是结果不同,可能第一次id为1的人叫“李三”,第二次读id为1的人就叫了“李四”。由于读取操做不会阻止其余事务。 解决办法就是下面的“可重复读”。
(三)可重复读(Repeatable read)
读事务会阻止其余写事务,可是不会阻止其余读事务。 存在的问题:幻读。可重复读阻止的写事务包括update和delete(只给存在的表加上了锁),可是不包括insert(新行不存在,因此没有办法加锁),因此一个事务第一次读取可能读取到了10条记录,可是第二次可能读取到11条,这就是幻读。 解决办法就是下面的“串行化”。
(四)可串行化(Serializable)
读加共享锁,写加排他锁。这样读取事务能够并发,可是读写,写写事务之间都是互斥的,基本上就是一个个执行事务,因此叫串行化。 #7.数据库的ACID ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具备的四个特性:/原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
#8.同步异步、阻塞非阻塞
同步和异步关注的是消息通讯机制 (synchronous communication/ asynchronous communication)。
举个通俗的例子: 你打电话问书店老板有没有《分布式系统》这本书,若是是同步通讯机制,书店老板会说,“你稍等,我查一下”,而后开始查啊查,等查好了(多是 5 秒,也多是一天)告诉你结果(返回结果)。 而异步通讯机制,书店老板直接告诉你我查一下啊,查好了打电话给你,而后直接挂电话了(不返回结果)。而后查好了,他会主动打电话给你。在这里老板经过“回电”这种方式来回调。
CGI程序是一个独立的程序,它能够用几乎全部语言来写,包括perl,c,lua,python等等。
WSGI, Web Server Gateway Interface,是Python应用程序或框架和Web服务器之间的一种接口,WSGI的其中一个目的就是让用户能够用统一的语言(Python)编写先后端。
#2.XSRF和XSS
CSRF重点在请求,XSS重点在脚本
#3.Django 的架构 Django 采用 MVT 的架构模式:M 为 Model 模型层,是对数据库的数据的抽象与映射;V 为 View 视图层,在此层中进行业务逻辑的处理,包括操做 model和为模版层提供数据;T 为 Template 模版层,负责前端页面的展现。
#4.django 对数据查询结果排序怎么作,降序怎么作,查询大于某个字段怎么作。
order_by()
,如 Entry.objects.order_by('blog__name', 'headline')
;Entry.objects.order_by('-pub_date')
;Entry.objects.filter(pubdate__gt='2006-01-01')
#5.Django处理request的流程
Middleware(中间件,包括request, view, exception, response),URLConf(url映射关系),Template(模板系统)
#6.Django 的 queryset 使用 在进行数据查询时,使用 all()、filter()、exclude()
等会返回 Queryset,在对Queryset 进行过滤链式操做的时候返回的仍是 Queryset,咱们能够对返回的Queryset 进行排序、切片、过滤、去重等操做。
#7.Django 与 Tornado 的对比
Django 是一个大而全的框架,其设计初衷是为了快速开发,因此提供了丰富的套件供开发使用。其框架的全部业务与其内置的 ORM 紧密相关,还提供了自动化的 Admin 管理后台。
而 Tornado 不只仅是 Web 框架,其还提供了一个高性能的 Web 服务器,其设计初衷就是为了解决性能瓶颈问题,目的要打造一个高性能的开发框架。 Tornado 做为 Web 框架要比 Django 轻量的多,没有提供丰富的套件,好比没有ORM、管理后台、表单系统,甚至没有 session 机制,可是提供了异步机制、 WebSocket 等 Django 没有的功能,属于灵活的轻量级框架。
#8.Torando 的优缺点 Tornado 的优势是利用 epoll 机制实现了高性能,并以此提供了异步机制,能够达到异步非阻塞;框架轻量灵活;
其缺点是:Tornado 的运行是单进程的,一旦在处理一个请求时出现了阻塞,将影响总体性能,全部在 Tornado 的开发中要避免阻塞,出现阻塞的地方使用异步,而对于接入的第三方库或 SDK 每每并无提供对 Tornado 框架的异步支持,因此使用第三方接口时须要咱们重复造轮子,本身封装针对于 Tornado 异步的接口调用库。
#9.Tornado 的工做原理
**1.**ioloop 是 tornado 运行的核心
**2.**ioloop 封装了操做管理 epoll 的工做
**3.**当 ioloop 实例启动时,ioloop 将服务器监听的 socket 添加到 epoll 容器中,而后循环等待 epoll 返回可处理的 socket
**4.**当有客户端发起链接后,ioloop 从 epoll 容器中拿到了服务器监听的 socket,并调用服务器实例处理该监听 socket 的方法,接收链接请求,并将新的与客户端对应的 socket 添加到 epoll 容器中,而后继续循环等待 epoll 返回可处理的 socket
**5.**当客户端发送过来请求数据后,ioloop 从 epoll 中拿到了接收数据的 socket,并调用服务器实例处理该传输 socket 的方法,从 socket 中读取出 http 报文数据,解析后调用 Application 的实例,进行路由分发,实例化具体的 RequestHandler,执行其中的具体 http 方法,生成响应数据并打包成 http 报文写入到缓冲区中。
**6.**当与客户端对应的 socket 可写时,ioloop 从 epoll 中拿到了对应可写的 socket,将缓冲区中对应的响应报文数据写入到 socket 中传回给客户端,完成请求处理。
**7.**epoll 每次只返回给 ioloop 能够处理的 socket,而后 ioloop 对拿到的 socket 依次进行处理,有效充分地利用了 cpu 时间,进而达到提高支持高并发的能力。 #10.apache和nginx的区别 nginx 相对 apache 的优势:
apache 相对nginx 的优势:
#11.SOAP SOAP(原为Simple Object Access Protocol的首字母缩写,即简单对象访问协议)是交换数据的一种协议规范,使用在计算机网络Web服务(web service)中,交换带结构信息。SOAP为了简化网页服务器(Web Server)从XML数据库中提取数据时,节省去格式化页面时间,以及不一样应用程序之间按照HTTP通讯协议,听从XML格式执行资料互换,使其抽象于语言实现、平台和硬件。