Skip to content

Commit 3e8dfdc

Browse files
committed
add python-pattern
1 parent d3cf0a2 commit 3e8dfdc

File tree

4 files changed

+211
-2
lines changed

4 files changed

+211
-2
lines changed

Readme.md

Lines changed: 165 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -376,18 +376,22 @@ filter 函数的功能相当于过滤器。调用一个布尔函数`bool_func`
376376
map函数是对一个序列的每个项依次执行函数,下面是对一个序列每个项都乘以2:
377377

378378
```python
379-
>>> a=map(lambda x:x*2,[1,2,3])
379+
>>> a = map(lambda x:x*2,[1,2,3])
380380
>>> list(a)
381381
[2, 4, 6]
382382
```
383383

384384
reduce函数是对一个序列的每个项迭代调用函数,下面是求3的阶乘:
385385

386386
```python
387-
>>> functools.reduce(lambda x,y:x*y,range(1,4))
387+
>>> reduce(lambda x,y:x*y,range(1,4))
388388
6
389389
```
390390

391+
## 23 Python里的拷贝
392+
393+
copy()和deepcopy()
394+
391395
# 操作系统
392396

393397
## 1 select,poll和epoll
@@ -425,6 +429,86 @@ epoll改了三个缺点.
425429

426430
## 3 ARP协议
427431

432+
## 4 urllib和urllib2的区别
433+
434+
这个面试官确实问过,当时答的urllib2可以Post而urllib不可以.
435+
436+
1. urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
437+
2. urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的User Agent字符串等。
438+
439+
440+
## 5 Post和Get
441+
442+
## 6 Cookie和Session
443+
444+
## 7 apache和nginx的区别
445+
446+
1、nginx相对于apache的优点:
447+
轻量级,同样起web 服务,比apache占用更少的内存及资源
448+
抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
449+
高度模块化的设计,编写模块相对简单
450+
社区活跃,各种高性能模块出品迅速啊
451+
apache 相对于nginx 的优点:
452+
453+
rewrite ,比nginx 的rewrite 强大
454+
动态页面
455+
模块超多,基本想到的都可以找到
456+
少bug ,nginx 的bug 相对较多
457+
458+
超稳定
459+
460+
存在就是理由,一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache 吧。
461+
后者的各种功能模块实现得比前者,例如ssl 的模块就比前者好,可配置项多。这里要注意一点,epoll(freebsd 上是 kqueue )网络
462+
IO 模型是nginx 处理性能高的根本理由,但并不是所有的情况下都是epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文
463+
件,apache 的select 模型或许比epoll 更高性能。当然,这只是根据网络IO 模型的原理作的一个假设,真正的应用还是需要实测了再说
464+
的。
465+
466+
2、作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点
467+
使 Nginx 尤其受到虚拟主机提供商的欢迎。在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生
468+
意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 感谢Nginx为我们选择了 epoll and kqueue 作为开发模型.
469+
Nginx
470+
作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理 服务器对外进行
471+
服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多.
472+
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器), Last.fm 描述了成功并且美妙的使用经验.
473+
Nginx 是
474+
一个安装非常的简单 , 配置文件非常简洁(还能够支持perl语法), Bugs 非常少的服务器: Nginx 启动特别容易, 并且几乎可以做到
475+
7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够不间断服务的情况下进行软件版本的升级 .
476+
477+
3、Nginx 配置简洁, Apache 复杂
478+
Nginx 静态处理性能比 Apache 高 3倍以上
479+
Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端用
480+
Apache 的组件比 Nginx 多
481+
现在 Nginx 才是 Web 服务器的首选
482+
483+
4、最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程
484+
485+
5、nginx处理静态文件好,耗费内存少.但无疑apache仍然是目前的主流,有很多丰富的特性.所以还需要搭配着来.当然如果能确定nginx就适合需求,那么使用nginx会是更经济的方式.
486+
apache有先天不支持多核心处理负载鸡肋的缺点,建议使用nginx做前端,後端用apache。大型网站建议用nginx自代的集群功能
487+
488+
6、
489+
从个人过往的使用情况来看,nginx的负载能力比apache高很多。最新的服务器也改用nginx了。而且nginx改完配置能-t测试一下配置有没
490+
有问题,apache重启的时候发现配置出错了,会很崩溃,改的时候都会非常小心翼翼现在看有好多集群站,前端nginx抗并发,后端apache集群,
491+
配合的也不错。
492+
493+
7、nginx处理动态请求是鸡肋,一般动态请求要apache去做,nginx只适合静态和反向。
494+
495+
8、从我个人的经验来看,nginx是很不错的前端服务器,负载性能很好,在老奔上开nginx,用webbench模拟10000个静态文件请求毫不吃力。apache对php等语言的支持很好,此外apache有强大的支持网路,发展时间相对nginx更久,
496+
497+
9、
498+
Nginx优于apache的主要两点:1.Nginx本身就是一个反向代理服务器 2.Nginx支持7层负载均衡;其他的当然,Nginx可能会比
499+
apache支持更高的并发,但是根据NetCraft的统计,2011年4月的统计数据,Apache依然占有62.71%,而Nginx是
500+
7.35%,因此总得来说,Aapche依然是大部分公司的首先,因为其成熟的技术和开发社区已经也是非常不错的性能。
501+
502+
10、你对web server的需求决定你的选择。大
503+
部分情况下nginx都优于APACHE,比如说静态文件处理、PHP-CGI的支持、反向代理功能、前端Cache、维持连接等等。在
504+
Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出现Apache进程数飙升,从而拒绝服务的现象。
505+
506+
11、可以看一下nginx lua模块:https://github.com/chaoslaw...apache比nginx多的模块,可直接用lua实现apache是最流行的,why?大多数人懒得更新到nginx或者学新事物
507+
508+
12、对于nginx,我喜欢它配置文件写的很简洁,正则配置让很多事情变得简单运行效率高,占用资源少,代理功能强大,很适合做前端响应服务器
509+
510+
13、Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite频繁,那还是Apache吧
511+
428512
# 数据结构
429513

430514
## 1 红黑树
@@ -433,14 +517,93 @@ epoll改了三个缺点.
433517

434518
## 1 台阶问题/斐波纳挈
435519

520+
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
521+
436522
```python
437523
fib = lambda n: 1 if n <= 2 else fib(n - 1) + fib(n - 2)
438524
```
439525

526+
## 2 变态台阶问题
527+
528+
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
529+
530+
```python
531+
fib = lambda n: i if n < 2 else 2 * fib(n - 1)
532+
```
533+
534+
## 矩形覆盖
535+
536+
我们可以用`2*1`的小矩形横着或者竖着去覆盖更大的矩形。请问用n个`2*1`的小矩形无重叠地覆盖一个`2*n`的大矩形,总共有多少种方法?
537+
538+
>`2*n`个矩形的覆盖方法等于第`2*(n-1)`加上第`2*(n-2)`的方法。
539+
540+
```python
541+
f = lambda n: 1 if n < 2 else f(n - 1) + f(n - 2)
542+
```
543+
440544
## 2 杨氏矩阵查找
441545

442546
在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
443547

548+
## 3 去除列表中的重复元素
549+
550+
用集合
551+
552+
```python
553+
list(set(l))
554+
```
555+
556+
用字典
557+
558+
```python
559+
l1 = ['b','c','d','b','c','a','a']
560+
l2 = {}.fromkeys(l1).keys()
561+
print l2
562+
```
563+
564+
用字典并保持顺序
565+
566+
```python
567+
l1 = ['b','c','d','b','c','a','a']
568+
l2 = list(set(l1))
569+
l2.sort(key=l1.index)
570+
print l2
571+
```
572+
573+
列表推导式
574+
575+
```python
576+
l1 = ['b','c','d','b','c','a','a']
577+
l2 = []
578+
[l2.append(i) for i in l1 if not i in l2]
579+
```
580+
581+
面试官提到的,先排序然后删除.
582+
583+
## 4 链表成对调换
584+
585+
`1->2->3->4`转换成`2->1->4->3`.
586+
587+
588+
589+
```python
590+
# Definition for singly-linked list.
591+
# class ListNode:
592+
# def __init__(self, x):
593+
# self.val = x
594+
# self.next = None
595+
596+
class Solution:
597+
# @param a ListNode
598+
# @return a ListNode
599+
def swapPairs(self, head):
600+
if head != None and head.next != None:
601+
next = head.next
602+
head.next = self.swapPairs(next.next)
603+
next.next = head
604+
return next
605+
return head
606+
```
444607

445608

446609

img/builder.graffle

2.6 KB
Binary file not shown.

img/builder.png

28.8 KB
Loading

pattern.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Python设计模式
2+
3+
代码直戳: https://github.com/faif/python-patterns
4+
5+
# 创建型模式
6+
7+
## 工厂方法
8+
9+
10+
实例 -> 类 -> 类工厂
11+
12+
## 抽象工厂
13+
14+
简单来说就是把一些具有相同方法的类再进行封装,抽象共同的方法以供调用.是工厂方法的进阶版本.
15+
16+
实例 -> 类 -> 类工厂 -> 抽象工厂
17+
18+
## 惰性初始化 Lazy evaluation
19+
20+
这个Python里可以使用@property实现,就是当调用的时候才生成.
21+
22+
## 生成器 Builder
23+
24+
![](img/builder.png)
25+
26+
Builder模式主要用于构建一个复杂的对象,但这个对象构建的算法是稳定的,对象中的各个部分经常变化。Builder模式主要在于应对复杂对象各个部分的频繁需求变动。但是难以应对算法的需求变动。这点一定要注意,如果用错了,会带来很多不必要的麻烦。
27+
28+
重点是将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
29+
30+
简单的说:子对象变化较频繁,对算法相对稳定。
31+
32+
## 单例模式 Singleton
33+
34+
一个类只有一个实例
35+
36+
## 原型模式
37+
38+
特点是通过复制一个已经存在的实例来返回新的实例,而不是新建实例.
39+
40+
多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据.
41+
42+
## 对象池 Object pool
43+
44+
一个对象池是一组已经初始化过且可以使用的对象,而可以不用在有需求时创建和销毁对象。池的用户可以从池子中取得对象,对其进行操作处理,并在不需要时归还给池子而非销毁 而不是销毁它.
45+
46+
在Python内部实现了对象池技术.例如像小整型这样的数据引用非常多,创建销毁都会消耗时间,所以保存在对象池里,减少开销.

0 commit comments

Comments
 (0)