logo资料库

python面试题100道.docx

第1页 / 共80页
第2页 / 共80页
第3页 / 共80页
第4页 / 共80页
第5页 / 共80页
第6页 / 共80页
第7页 / 共80页
第8页 / 共80页
资料共80页,剩余部分请下载后查看
Python语言特性
1 Python的函数参数传递
2 Python中的元类(metaclass)
3 @staticmethod和@classmethod
4 类变量和实例变量
5 Python自省
6 字典推导式
7 Python中单下划线和双下划线
8 字符串格式化:%和.format
9 迭代器和生成器
10 *args and **kwargs
11 面向切面编程AOP和装饰器
12 鸭子类型
13 Python中重载
14 新式类和旧式类
15 __new__和__init__的区别
16 单例模式
17 Python中的作用域
18 GIL线程全局锁
19 协程
20 闭包
21 lambda函数
22 Python函数式编程
23 Python里的拷贝
24 Python垃圾回收机制
1 引用计数
2 标记-清除机制
3 分代技术
25 Python里面如何实现tuple和list的转换?
26 Python的is
27 read,readline和readlines
28 Python2和3的区别
29到底什么是Python?你可以在回答中与其他技术进行对比
30补充缺失的代码
31阅读下面的代码,写出A0,A1至An的最终值。
32下面代码会输出什么:
33你如何管理不同版本的代码?
34“猴子补丁”(monkey patching)指的是什么?这种做法好吗?
35阅读下面的代码,它的输出结果是什么?
36.介绍一下except的用法和作用?
37.Python中pass语句的作用是什么?
38.介绍一下Python下range()函数的用法?
39.如何用Python来进行查询和替换一个文本字符串?
40.Python里面match()和search()的区别?
41.用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别?
42.Python里面如何生成随机数?
43.有没有一个工具可以帮助查找python的bug和进行静态的代码分析?
44.如何在一个function里面设置一个全局的变量?
45.单引号,双引号,三引号的区别
46 Python和多线程(multi-threading)。这是个好主意码?列举一些让Python
47 将下面的函数按照执行效率高低排序。
48.如何用Python来进行查询和替换一个文本字符串?
可以使用sub()方法来进行查询和替换,sub方法的格式为:sub(replacement, str
match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个strin
50.用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别?
前者是贪婪匹配,会从头到尾匹配 xyz,而后者是非贪婪匹配,只匹配到第一个 >。
51.Python里面如何生成随机数?
import randomrandom.random()它会返回一个随机的0和1之间的浮点数
操作系统
1 select,poll和epoll
2 调度算法
3 死锁
4 程序编译与链接
1 预处理
2 编译
3 汇编
4 链接
5 静态链接和动态链接
6 虚拟内存技术
7 分页和分段
分页与分段的主要区别
8 页面置换算法
9 边沿触发和水平触发
数据库
1 事务
2 数据库索引
3 Redis原理
4 乐观锁和悲观锁
5 MVCC
6 MyISAM和InnoDB
网络
1 三次握手
2 四次挥手
3 ARP协议
4 urllib和urllib2的区别
5 Post和Get区别
GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
GET书签可收藏,POST为书签不可收藏。
GET能被缓存,POST不能缓存 。
GET编码类型application/x-www-form-url,POST编码类型encodeda
GET历史参数保留在浏览器历史中。POST参数不会保存在浏览器历史中。
GET对数据长度有限制,当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(U
GET只允许 ASCII 字符。POST没有限制。也允许二进制数据。
与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感
GET的数据在 URL 中对所有人都是可见的。POST的数据不会显示在 URL 中。
6 Cookie和Session
7 apache和nginx的区别
8 网站用户密码保存
9 HTTP和HTTPS
10 CSRF和XSS
11 RESTful架构(SOAP,RPC)
12 SOAP
13 RPC
14 CGI和WSGI
16 中间人攻击
17 c10k问题
18 socket
19 浏览器缓存
20 HTTP1.0和HTTP1.1
21 Ajax
数据结构
1 红黑树
1 台阶问题/斐波纳挈
2 变态台阶问题
3 矩形覆盖
4 杨氏矩阵查找
5 去除列表中的重复元素
6 链表成对调换
7 创建字典的方法
1 直接创建
2 工厂方法
3 fromkeys()方法
8 合并两个有序列表
9 交叉链表求交点
10 二分查找
11 快排
12 找零问题
13 广度遍历和深度遍历二叉树
17 前中后序遍历
18 求最大树深
19 求两棵树是否相同
20 前序中序求后序
21 单链表逆置
Python Web相关
解释一下 WSGI 和 FastCGI 的关系?
解释一下 Django 和 Tornado 的关系、差别
解释下django-debug-toolbar的使用
解释下Django使用redis缓存服务器
如何进行Django单元测试
Django的单元测试使用python的unittest模块,这个模块使用基于类的方法来定义测试。类
解释下Http协议
解释下Http请求头和常见响应状态码
爬虫
Python 语言特性 1 Python 的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def fun(a): a = 2 fun(a) print(a) # 1 代码二: a = [] def fun(a): a.append(1) fun(a) print(a) # [1] 所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似 c 中 void* 的感觉。 这里记住的是类型是属于对象的,而不是变量。而对象有两种,“可更改”(mutable) 与“不可更改”(immutable)对象。在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。(这就是这个问题的重点) 当一个引用传递给函数的时候,函数自动复制一份引用,这个函数里的引用和外边的 引用没有半毛关系了.所以第一个例子里函数把引用指向了一个不可变对象,当函数
返回的时候,外面的引用没半毛感觉.而第二个例子就不一样了,函数内的引用指向的 是可变对象,对它的操作就和定位了指针地址一样,在内存里进行修改. 2 Python 中的元类(metaclass) 元类就是用来创建类的“东西”。你创建类就是为了创建类的实例对象,但是我们 已经学习到了 Python 中的类也是对象。好吧,元类就是用来创建这些类(对象) 的,元类就是类的类 这个非常的不常用,详情请看:《深刻理解 Python 中的元类(metaclass)》 3 @staticmethod 和@classmethod Python 其实有 3 个方法,即静态方法(staticmethod),类方法(classmethod)和实例 方法,如下: class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,x) @classmethod def class_foo(cls,x): print( "executing class_foo(%s,%s)"%(cls,x)) @staticmethod def static_foo(x): print ("executing static_foo(%s)"%x) a=A() 这里先理解下函数参数里面的 self 和 cls.这个 self 和 cls 是对类或者实例的绑定.对 于实例方法,我们知道在类里每次定义方法的时候都需要绑定这个实例,就是 foo(self, x),为什么要这么做呢?因为实例方法的调用离不开实例,我们需要把实
例自己传给函数,调用的时候是这样的 a.foo(x)(其实是 foo(a, x)).类方法一样, 只不过它传递的是类而不是实例,A.class_foo(x).注意这里的 self 和 cls 可以替换 别的参数,但是 python 的约定是这俩,还是不要改的好. 对于静态方法其实和普通的方法一样,不需要对谁进行绑定,唯一的区别是调用的时 候需要使用 a.static_foo(x)或者 A.static_foo(x)来调用. \ 实例方法 类方法 静态方法 a = A() a.foo(x) a.class_foo(x) a.static_foo(x) A 不可用 A.class_foo(x) A.static_foo(x) 4 类变量和实例变量 class Person: name="aaa" p1=Person() p2=Person() p1.name="bbb" print(p1.name) # bbb print(p2.name) # aaa print(Person.name) # aaa 类变量就是供类使用的变量,实例变量就是供实例使用的. 这里 p1.name="bbb"是实例调用了类变量,这其实和上面第一个问题一样,就是函数 传参的问题,p1.name 一开始是指向的类变量 name="aaa",但是在实例的作用域里把 类变量的引用改变了,就变成了一个实例变量,self.name 不再引用 Person 的类变量 name 了. 可以看看下面的例子:
class Person: name=[] p1=Person() p2=Person() p1.name.append(1) print(p1.name) # [1] print(p2.name) # [1] print(Person.name) # [1] 5 Python 自省 这个也是 python 彪悍的特性. 自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型.简单一句就是 运行时能够获得对象的类型.比如 type(),dir(),getattr(),hasattr(),isinstance(). 6 字典推导式 可能你见过列表推导时,却没有见过字典推导式,在 2.7 中才加入的: d = {key: value for (key, value) in iterable} 7 Python 中单下划线和双下划线 1 2 3 4 5 6 7 8 9 10 11 def __init__(self): self.__superprivate = "Hello" self._semiprivate = ", world!" >>> class MyClass(): ... ... ... ... >>> mc = MyClass() >>> print(mc.__superprivate) Traceback (most recent call last): File "", line 1, in AttributeError: myClass instance has no attribute '__superprivate' >>> print(mc._semiprivate)
12 13 14 , world! >>> print mc.__dict__ {'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'} __foo__:一种约定,Python 内部的名字,用来区别其他用户自定义的命名,以防冲突. _foo:一种约定,用来指定变量私有.程序员用来指定私有变量的一种方式. __foo:这个有真正的意义:解析器用_classname__foo 来代替这个名字,以区别和其 他类相同的命名. 详情见: http://www.zhihu.com/question/19754941 8 字符串格式化:%和.format .format 在许多方面看起来更便利.对于%最烦人的是它无法同时传递一个变量和元 组.你可能会想下面的代码不会有什么问题: Python: "hi there %s" % name 但是,如果 name 恰好是(1,2,3),它将会抛出一个 TypeError 异常.为了保证它总是正 确的,你必须这样做: "hi there %s" % (name,) # 提供一个单元素的数组而不是一个参数 9 迭代器和生成器 在 Python 中,这种一边循环一边计算的机制,称为生成器:generator。 可以被 next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
这个是 stackoverflow 里 python 排名第一的问题,值得一看: http://stackoverflow.com/questions/231767/what-does-the-yield-keyword -do-in-python 10 *args and **kwargs 用*args 和**kwargs 只是为了方便并没有强制使用它们. 当你不确定你的函数里将要传递多少参数时你可以用*args.例如,它可以传递任意 数量的参数: 1 2 3 4 5 6 7 8 >>> def print_everything(*args): for count, thing in enumerate(args): print '{0}. {1}'.format(count, thing) ... ... >>> print_everything('apple', 'banana', 'cabbage') 0. apple 1. banana 2. cabbage 相似的,**kwargs 允许你使用没有事先定义的参数名: 1 2 3 4 5 6 7 for name, value in kwargs.items(): print '{0} = {1}'.format(name, value) >>> def table_things(**kwargs): ... ... ... >>> table_things(apple = 'fruit', cabbage = 'vegetable') cabbage = vegetable apple = fruit 你也可以混着用.命名参数首先获得参数值然后所有的其他参数都传递给*args 和 **kwargs.命名参数在列表的最前端.例如: 1 def table_things(titlestring, **kwargs) *args 和**kwargs 可以同时在函数的定义中,但是*args 必须在**kwargs 前面. 当调用函数时你也可以用*和**语法.例如:
1 2 3 4 5 6 7 print 'a = {0}, b = {1}, c = {2}'.format(a,b,c) >>> def print_three_things(a, b, c): ... ... >>> mylist = ['aardvark', 'baboon', 'cat'] >>> print_three_things(*mylist) a = aardvark, b = baboon, c = cat 就像你看到的一样,它可以传递列表(或者元组)的每一项并把它们解包.注意必须与 它们在函数里的参数相吻合.当然,你也可以在函数定义或者函数调用时用*. http://stackoverflow.com/questions/3394835/args-and-kwargs 11 面向切面编程 AOP 和装饰器 这个 AOP 一听起来有点懵,同学面试的时候就被问懵了… 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插 入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器, 我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的 讲,装饰器的作用就是为已经存在的对象添加额外的功能。 这个问题比较大,推荐: http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-fu nction-decorators-in-python 中文: http://taizilongxu.gitbooks.io/stackoverflow-about-python/content/3/REA DME.html
12 鸭子类型 “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就 可以被称为鸭子。” 我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。 比如在 python 中,有很多 file-like 的东西,比如 StringIO,GzipFile,socket。它们 有很多相同的方法,我们把它们当作文件使用。 又比如 list.extend()方法中,我们并不关心它的参数是不是 list,只要它是可迭代的,所 以它的参数可以是 list/tuple/dict/字符串/生成器等. 鸭子类型在动态语言中经常使用,非常灵活,使得 python 不想 java 那样专门去弄 一大堆的设计模式。 13 Python 中重载 引自知乎:http://www.zhihu.com/question/20053359 函数重载主要是为了解决两个问题。 1. 可变参数类型。 2. 可变参数个数。
分享到:
收藏