2
2
3
3
目前面了4家python的公司,基本都是很基础的东西,对比发现和stackoverflow上高票数的问题有很多重复,整理一下希望对别人有帮助.
4
4
5
- 其中有可能是自己想到的一些知识点,也有一些是网上收集的.
5
+ 其中有可能是自己想到的一些知识点,也有一些是网上收集的.答案可能不太详尽,有需要还是自己搜一下吧.
6
6
7
7
#Python语言特性
8
8
@@ -271,6 +271,7 @@ http://stackoverflow.com/questions/3394835/args-and-kwargs
271
271
272
272
##14 新式类和旧式类
273
273
274
+ 这个面试官问了,我说了老半天,不知道他问的真正意图是什么.
274
275
275
276
[ stackoverflow] ( http://stackoverflow.com/questions/54867/what-is-the-difference-between-old-style-and-new-style-classes-in-python )
276
277
@@ -293,6 +294,42 @@ ps: `__metaclass__`是创建类时起作用.所以我们可以分别使用`__met
293
294
294
295
##16 单例模式
295
296
297
+ 这个绝对常考啊.绝对要记住1~ 2个方法,当时面试官是让手写的.
298
+
299
+ ###1 使用` __new__ ` 方法
300
+
301
+ ``` python
302
+ class Singleton (object ):
303
+ def __new__ (cls ,* args ,** kw ):
304
+ if not hasattr (cls ,' _instance' ):
305
+ orig= super (Singleton,cls )
306
+ cls ._instance= orig.__new__ (cls ,* args,** kw)
307
+ return cls ._instance
308
+
309
+ class MyClass (Singleton ):
310
+ a= 1
311
+ ```
312
+
313
+ ###2 共享属性
314
+
315
+ 创建实例时把所有实例的` __dict__ ` 指向同一个字典,这样它们具有相同的属性和方法.
316
+
317
+ ``` python
318
+
319
+ class Borg (object ):
320
+ _state= {}
321
+ def __new__ (cls ,* args ,** kw ):
322
+ ob= super (Borg,cls ).__new__ (cls ,* args,** kw)
323
+ ob.__dict__ = cls ._state
324
+ return ob
325
+
326
+ class MyClass2 (Borg ):
327
+ a= 1
328
+ ```
329
+
330
+ ###3 装饰器版本
331
+
332
+
296
333
297
334
``` python
298
335
def singleton (cls ):
@@ -312,9 +349,9 @@ class MyClass:
312
349
313
350
Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的。
314
351
315
- 函数定义了本地作用域,而模块定义的是全局作用域。 如果想要在函数内定义全局作用域,需要加上global修饰符。
352
+ 当 Python 遇到一个变量的话他会按照这样的顺序进行搜索:
316
353
317
- 变量名解析:LEGB原则 当在函数中使用未认证的变量名时,Python搜索4个作用域 [ 本地作用域(L),之后是上一层结构中def或者lambda的本地作用域(E), 之后是全局作用域(G),最后是内置作用域(B)]并且在第一处能够找到这个变量名的地方停下来。如果变量名在整个的搜索过程中 都没有找到,Python就会报错。 补:上面的变量规则只适用于简单对象,当出现引用对象的属性时,则有另一套搜索规则:属性引用搜索一个或多个对象,而不是作用域,并且有可能涉及到所谓的"继承"
354
+ 本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)
318
355
319
356
##18 线程全局锁
320
357
@@ -390,7 +427,32 @@ reduce函数是对一个序列的每个项迭代调用函数,下面是求3的
390
427
391
428
##23 Python里的拷贝
392
429
393
- copy()和deepcopy()
430
+ 引用和copy(),deepcopy()的区别
431
+
432
+ ``` python
433
+ import copy
434
+ a= [1 ,2 ,3 ,4 , [' a' ,' b' ]]# 原始对象
435
+
436
+ b= a# 赋值,传对象的引用
437
+ c= copy.copy(a)# 对象拷贝,浅拷贝
438
+ d= copy.deepcopy(a)# 对象拷贝,深拷贝
439
+
440
+ a.append(5 )# 修改对象a
441
+ a[4 ].append(' c' )# 修改对象a中的['a', 'b']数组对象
442
+
443
+ print ' a =' , a
444
+ print ' b =' , b
445
+ print ' c =' , c
446
+ print ' d =' , d
447
+
448
+ 输出结果:
449
+ a= [1 ,2 ,3 ,4 , [' a' ,' b' ,' c' ],5 ]
450
+ b= [1 ,2 ,3 ,4 , [' a' ,' b' ,' c' ],5 ]
451
+ c= [1 ,2 ,3 ,4 , [' a' ,' b' ,' c' ]]
452
+ d= [1 ,2 ,3 ,4 , [' a' ,' b' ]]
453
+ ```
454
+
455
+ ##24 Python垃圾回收机制
394
456
395
457
#操作系统
396
458
@@ -429,6 +491,8 @@ epoll改了三个缺点.
429
491
430
492
##3 ARP协议
431
493
494
+ 地址解析协议(Address Resolution Protocol): 根据IP地址获取物理地址的一个TCP/IP协
495
+
432
496
##4 urllib和urllib2的区别
433
497
434
498
这个面试官确实问过,当时答的urllib2可以Post而urllib不可以.
@@ -443,71 +507,79 @@ epoll改了三个缺点.
443
507
444
508
##7 apache和nginx的区别
445
509
446
- 1、nginx相对于apache的优点:
447
- 轻量级,同样起web 服务,比apache占用更少的内存及资源
448
- 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
449
- 高度模块化的设计,编写模块相对简单
450
- 社区活跃,各种高性能模块出品迅速啊
451
- apache 相对于nginx 的优点:
510
+ ##8 网站用户密码保存
511
+
512
+ 1 . 明文保存
513
+ 2 . 明文hash后保存,如md5
514
+ 3 . MD5+Salt方式,这个salt可以随机
515
+ 4 . 知乎使用了Bcrypy(好像)加密
516
+
517
+ ##9 HTTPs
518
+
519
+ 对称加密,非对称加密,TLS/SSL,RSA
520
+
521
+ ##10 XSRF和XSS
522
+
523
+ * CSRF(Cross-site request forgery)跨站请求伪造
524
+ * XSS(Cross Site Scripting)跨站脚本攻击
525
+
526
+ CSRF重点在请求,XSS重点在脚本
527
+
528
+ ##11 幂等 Idempotence
529
+
530
+ HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的** 副作用** 。(注意是副作用)
531
+
532
+ ` GET http://www.bank.com/account/123456 ` ,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是一次和N次具有相同的副作用,而不是每次GET的结果相同。` GET http://www.news.com/latest-news ` 这个HTTP请求可能会每次得到不同的结果,但它本身并没有产生任何副作用,因而是满足幂等性的。
533
+
534
+ DELETE方法用于删除资源,有副作用,但它应该满足幂等性。比如:` DELETE http://www.forum.com/article/4231 ` ,调用一次和N次对系统产生的副作用是相同的,即删掉id为4231的帖子;因此,调用者可以多次调用或刷新页面而不必担心引起错误。
535
+
536
+
537
+ POST所对应的URI并非创建的资源本身,而是资源的接收者。比如:` POST http://www.forum.com/articles ` 的语义是在` http://www.forum.com/articles ` 下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI;所以,POST方法不具备幂等性。
538
+
539
+ PUT所对应的URI是要创建或更新的资源本身。比如:` PUT http://www.forum/articles/4231 ` 的语义是创建或更新ID为4231的帖子。对同一URI进行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有幂等性。
540
+
541
+
542
+ ##12 RESTful架构(SOAP,RPC)
452
543
453
- rewrite ,比nginx 的rewrite 强大
454
- 动态页面
455
- 模块超多,基本想到的都可以找到
456
- 少bug ,nginx 的bug 相对较多
544
+ 推荐:http://www.ruanyifeng.com/blog/2011/09/restful.html
457
545
458
- 超稳定
459
546
460
- 存在就是理由,一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache 吧。
461
- 后者的各种功能模块实现得比前者,例如ssl 的模块就比前者好,可配置项多。这里要注意一点,epoll(freebsd 上是 kqueue )网络
462
- IO 模型是nginx 处理性能高的根本理由,但并不是所有的情况下都是epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文
463
- 件,apache 的select 模型或许比epoll 更高性能。当然,这只是根据网络IO 模型的原理作的一个假设,真正的应用还是需要实测了再说
464
- 的。
547
+ ##13 SOAP
465
548
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不间断运行,即使运行数个月也不需要重新启动. 你还能够不间断服务的情况下进行软件版本的升级 .
549
+ SOAP(原为Simple Object Access Protocol的首字母缩写,即简单对象访问协议)是交换数据的一种协议规范,使用在计算机网络Web服务(web service)中,交换带结构信息。SOAP为了简化网页服务器(Web Server)从XML数据库中提取数据时,节省去格式化页面时间,以及不同应用程序之间按照HTTP通信协议,遵从XML格式执行资料互换,使其抽象于语言实现、平台和硬件。
476
550
477
- 3、Nginx 配置简洁, Apache 复杂
478
- Nginx 静态处理性能比 Apache 高 3倍以上
479
- Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端用
480
- Apache 的组件比 Nginx 多
481
- 现在 Nginx 才是 Web 服务器的首选
551
+ ##14 RPC
482
552
483
- 4、最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程
553
+ RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
484
554
485
- 5、nginx处理静态文件好,耗费内存少.但无疑apache仍然是目前的主流,有很多丰富的特性.所以还需要搭配着来.当然如果能确定nginx就适合需求,那么使用nginx会是更经济的方式.
486
- apache有先天不支持多核心处理负载鸡肋的缺点,建议使用nginx做前端,後端用apache。大型网站建议用nginx自代的集群功能
555
+ 总结:服务提供的两大流派.传统意义以方法调用为导向通称RPC。为了企业SOA,若干厂商联合推出webservice,制定了wsdl接口定义,传输soap.当互联网时代,臃肿SOA被简化为http+xml/json.但是简化出现各种混乱。以资源为导向,任何操作无非是对资源的增删改查,于是统一的REST出现了.
487
556
488
- 6、
489
- 从个人过往的使用情况来看,nginx的负载能力比apache高很多。最新的服务器也改用nginx了。而且nginx改完配置能-t测试一下配置有没
490
- 有问题,apache重启的时候发现配置出错了,会很崩溃,改的时候都会非常小心翼翼现在看有好多集群站,前端nginx抗并发,后端apache集群,
491
- 配合的也不错。
557
+ 进化的顺序: RPC -> SOAP -> RESTful
492
558
493
- 7、nginx处理动态请求是鸡肋,一般动态请求要apache去做,nginx只适合静态和反向。
559
+ ## 15 UGI和WSGI
494
560
495
- 8、从我个人的经验来看,nginx是很不错的前端服务器,负载性能很好,在老奔上开nginx,用webbench模拟10000个静态文件请求毫不吃力。apache对php等语言的支持很好,此外apache有强大的支持网路,发展时间相对nginx更久,
561
+ soapp
496
562
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
563
502
- 10、你对web server的需求决定你的选择。大
503
- 部分情况下nginx都优于APACHE,比如说静态文件处理、PHP-CGI的支持、反向代理功能、前端Cache、维持连接等等。在
504
- Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出现Apache进程数飙升,从而拒绝服务的现象。
564
+ ##16 中间人攻击
505
565
506
- 11、可以看一下nginx lua模块: https://github.com/chaoslaw...apache比nginx多的模块,可直接用lua实现apache是最流行的,why?大多数人懒得更新到nginx或者学新事物
566
+ 在GFW里屡见不鲜的,呵呵.
507
567
508
- 12、对于nginx,我喜欢它配置文件写的很简洁,正则配置让很多事情变得简单运行效率高,占用资源少,代理功能强大,很适合做前端响应服务器
568
+ 中间人攻击(Man-in-the-middle attack,通常缩写为MITM)是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。
569
+
570
+ #* NIX
571
+
572
+ ##unix进程间通信方式(IPC)
573
+
574
+ 1 . 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
575
+ 2 . 命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。
576
+ 3 . 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。
577
+ 4 . 消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺
578
+ 5 . 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
579
+ 6 . 内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
580
+ 7 . 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
581
+ 8 . 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
509
582
510
- 13、Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite频繁,那还是Apache吧
511
583
512
584
#数据结构
513
585
@@ -605,5 +677,109 @@ class Solution:
605
677
return head
606
678
```
607
679
680
+ ##创建字典的方法
681
+
682
+ ###1 直接创建
683
+
684
+ ``` python
685
+ dict = {' name' :' earth' ,' port' :' 80' }
686
+ ```
687
+
688
+ ###2 工厂方法
689
+
690
+ ``` python
691
+ items= [(' name' ,' earth' ),(' port' ,' 80' )]
692
+ dict2= dict (items)
693
+ dict1= dict (([' name' ,' earth' ],[' port' ,' 80' ]))
694
+ ```
695
+
696
+ ###3 fromkeys()方法
697
+
698
+ ``` python
699
+ dict1= {}.fromkeys((' x' ,' y' ),- 1 )
700
+ # dict={'x':-1,'y':-1}
701
+ dict2= {}.fromkeys((' x' ,' y' ))
702
+ # dict2={'x':None, 'y':None}
703
+ ```
704
+
705
+ ##合并两个有序列表
706
+
707
+ 知乎远程面试要求编程
708
+
709
+ 尾递归
710
+
711
+ ``` python
712
+ def _recursion_merge_sort2 (l1 ,l2 ,tmp ):
713
+ if len (l1)== 0 or len (l2)== 0 :
714
+ tmp.extend(l1)
715
+ tmp.extend(l2)
716
+ return tmp
717
+ else :
718
+ if l1[0 ]< l2[0 ]:
719
+ tmp.append(l1[0 ])
720
+ del l1[0 ]
721
+ else :
722
+ tmp.append(l2[0 ])
723
+ del l2[0 ]
724
+ return _recursion_merge_sort2(l1, l2, tmp)
725
+
726
+ def recursion_merge_sort2 (l1 ,l2 ):
727
+ return _recursion_merge_sort2(l1, l2, [])
728
+ ```
729
+
730
+ 循环算法
731
+
732
+ ``` pyhton
733
+ def loop_merge_sort(l1, l2):
734
+ tmp = []
735
+ while len(l1) > 0 and len(l2) > 0:
736
+ if l1[0] < l2[0]:
737
+ tmp.append(l1[0])
738
+ del l1[0]
739
+ else:
740
+ tmp.append(l2[0])
741
+ del l2[0]
742
+ tmp.extend(l1)
743
+ tmp.extend(l2)
744
+ return tmp
745
+ ```
746
+
747
+ ##交叉链表求交点
748
+
749
+ 去哪儿的面试,没做出来.
750
+
751
+ ``` python
752
+ # Definition for singly-linked list.
753
+ # class ListNode:
754
+ # def __init__(self, x):
755
+ # self.val = x
756
+ # self.next = None
757
+ def node (l1 ,l2 ):
758
+ length1, lenth2= 0 ,0
759
+ # 求两个链表长度
760
+ while l1.next:
761
+ l1= l1.next
762
+ length1+= 1
763
+ while l2.next:
764
+ l2= l2.next
765
+ length2+= 1
766
+ # 长的链表先走
767
+ if length1> lenth2:
768
+ for _in range (length1- length2):
769
+ l1= l1.next
770
+ else :
771
+ for _in range (length2- length1):
772
+ l2= l2.next
773
+ while l1and l2:
774
+ if l1.next== l2.next:
775
+ return l1.next
776
+ else :
777
+ l1= l1.next
778
+ l2= l2.next
779
+
780
+
781
+
782
+ ```
783
+
608
784
609
785