python学习总结(2)
1.TCP网络
三次握手(连接):C向S发送一个SYN主动打开请求,***是随机数A,S收到请求后,向C返回SYN/ACK,ACK为A+1***为B,C收到ACK后,再向S发送ACK(此时为B+1)后,连接建立。
四次挥手(断开):C(也可能是S)向S发送一个FIN报文断开请求,S收到后向C发送ACK表示请求已收到,再次向C发送FIN表示要断开连接,C收到后向S发送ACK确认断开连接,S收到后确认断开连接。
2.ARP协议:地址解析协议,根据IP地址获得物理地址的一个TCP/IP协议。
3.GET和POST的区别:一个用于获取数据,一个用于发送数据。
4.函数式编程:
filter 函数的功能相当于过滤器。调用一个布尔函数bool_func
来迭代遍历每个seq中的元素;返回一个使bool_seq
返回值为true的元素的序列。
map函数是对一个序列的每个项依次执行函数,下面是对一个序列每个项都乘以2:
reduce函数是对一个序列的每个项迭代调用函数,下面是求3的阶乘:
5.apache和nginx的区别:
nginx 相对 apache 的优点:
- 轻量级,同样起web 服务,比apache 占用更少的内存及资源
- 抗并发,nginx 处理请求是异步非阻塞的,支持更多的并发连接,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
- 配置简洁
- 高度模块化的设计,编写模块相对简单
- 社区活跃
apache 相对nginx 的优点:
- rewrite ,比nginx 的rewrite 强大
- 模块超多,基本想到的都可以找到
- 少bug ,nginx 的bug 相对较多
- 超稳定
HTTP 和 HTTPS 的相同点
大多数情况下,HTTP 和 HTTPS 是相同的,因为都是采用同一个基础的协议,作为 HTTP 或 HTTPS 客户端——浏览器,设立一个连接到 Web 服务器指定的端口。当服务器接收到请求,它会返回一个状态码以及消息,这个回应可能是请求信息、或者指示某个错误发送的错误信息。系统使用统一资源定位器 URI 模式,因此资源可以被唯一指定。而 HTTPS 和 HTTP 唯一不同的只是一个协议头(https)的说明,其他都是一样的。
HTTP 和 HTTPS 的不同之处
- HTTP 的 URL 以 http:// 开头,而 HTTPS 的 URL 以 https:// 开头
- HTTP 是不安全的,而 HTTPS 是安全的
- HTTP 标准端口是 80 ,而 HTTPS 的标准端口是 443
- 在 OSI 网络模型中,HTTP 工作于应用层,而 HTTPS 工作在传输层
- HTTP 无需加密,而 HTTPS 对传输的数据进行加密
- HTTP 无需证书,而 HTTPS 需要认证证书
7.POST,GET,PUT,DELETE
GET http://www.bank.com/account/123456
,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是一次和N次具有相同的副作用,而不是每次GET的结果相同。GET
http://www.news.com/latest-news
这个HTTP请求可能会每次得到不同的结果,但它本身并没有产生任何副作用,因而是满足幂等性的。
DELETE方法用于删除资源,有副作用,但它应该满足幂等性。比如:DELETE http://www.forum.com/article/4231
,调用一次和N次对系统产生的副作用是相同的,即删掉id为4231的帖子;因此,调用者可以多次调用或刷新页面而不必担心引起错误。
POST所对应的URI并非创建的资源本身,而是资源的接收者。比如:POST http://www.forum.com/articles
的语义是在http://www.forum.com/articles
下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI;所以,POST方法不具备幂等性。
PUT所对应的URI是要创建或更新的资源本身。比如:PUT http://www.forum/articles/4231
的语义是创建或更新ID为4231的帖子。对同一URI进行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有幂等性。
CGI是通用网关接口,是连接web服务器和应用程序的接口,用户通过CGI来获取动态数据或文件等。
CGI程序是一个独立的程序,它可以用几乎所有语言来写,包括perl,c,lua,python等等。
WSGI, Web Server Gateway Interface,是Python应用程序或框架和Web服务器之间的一种接口,WSGI的其中一个目的就是让用户可以用统一的语言(Python)编写前后端。
9.SOCKET编程:推荐http://www.cnblogs.com/bingyun84/archive/2009/10/16/1584387.html,非常不错10。浏览器缓存机制
11.编程题
(1)台阶问题/斐波纳挈
fib = lambda n : n if n<=2 else fib(n-1) + fib(n-2)
或者 def fib(n): a,b= 0,1 for i in range(n): a,b=b,b+a return b
(2)变态台阶问题
fib = lambda n : n if n<2 else 2*fib(n-1)
(3)字典创建
a = [('asd',12),('sad',26)] b=dict(a) a={} a.setdefault('asd',26)
排序:sorted(a.items(),key=lambda asd:asd[1])
(4)list排序
a=[1,3,6,4] sorted(a) a.reverse()
合并:extend
(5)二分查找:
def binarysearch(li, t): low = 0 if len(li) % 2 == 0: high = len(li) - 1 else: high = len(li) while low < high: print(low, high) mid = (low + high)//2 if li[mid] > t: high = mid elif li[mid] < t: low = mid + 1 else: return mid return low if li[low] == t else False(6)快速排序
def qsort(seq): if seq == []: return [] else: first = seq[0] lesser = qsort([x for x in seq[1:] if x < first]) greater = qsort([x for x in seq[1:] if x >= first]) return lesser + [first] + greater if __name__ == '__main__': seq = [5, 6, 78, 9, 0, -1, 2, 3, -65, 12] print(qsort(seq))也可以建立2个list,一个装小于[0]的,一个装大于[0]的,之后三个合并