taizilongxu / interview_python
关于Python的面试题
AI Architecture Analysis
This repository is indexed by RepoMind. By analyzing taizilongxu/interview_python in our AI interface, you can instantly generate complete architecture diagrams, visualize control flows, and perform automated security audits across the entire codebase.
Our Agentic Context Augmented Generation (Agentic CAG) engine loads full source files into context on-demand, avoiding the fragmentation of traditional RAG systems. Ask questions about the architecture, dependencies, or specific features to see it in action.
Repository Overview (README excerpt)
Crawler view**Table of Contents** • Python语言特性 • 1 Python的函数参数传递 • 2 Python中的元类(metaclass) • 3 @staticmethod和@classmethod • 4 类变量和实例变量 • 5 Python自省 • 6 字典推导式 • 7 Python中单下划线和双下划线 • 8 字符串格式化:\x和.format • 9 迭代器和生成器 • 10 *args and **kwargs • 11 面向切面编程AOP和装饰器 • 12 鸭子类型 • 13 Python中重载 • 14 新式类和旧式类 • 15 __new__和 __init__ 的区别 • 16 单例模式 • 1 使用__new__方法 • 2 共享属性 • 3 装饰器版本 • 4 import方法 • 17 Python中的作用域 • 18 GIL线程全局锁 • 19 协程 • 20 闭包 • 21 lambda函数 • 22 Python函数式编程 • 23 Python里的拷贝 • 24 Python垃圾回收机制 • 1 引用计数 • 2 标记-清除机制 • 3 分代技术 • 25 Python的List • 26 Python的is • 27 read,readline和readlines • 28 Python2和3的区别 • 29 super init • 30 range and xrange • 操作系统 • 1 select,poll和epoll • 2 调度算法 • 3 死锁 • 4 程序编译与链接 • 1 预处理 • 2 编译 • 3 汇编 • 4 链接 • 5 静态链接和动态链接 • 6 虚拟内存技术 • 7 分页和分段 • 分页与分段的主要区别 • 8 页面置换算法 • 9 边沿触发和水平触发 • 数据库 • 1 事务 • 2 数据库索引 • 3 Redis原理 • Redis是什么? • Redis数据库 • Redis缺点 • 4 乐观锁和悲观锁 • 5 MVCC • MySQL 的innodb引擎是如何实现MVCC的 • 6 MyISAM和InnoDB • 网络 • 1 三次握手 • 2 四次挥手 • 3 ARP协议 • 4 urllib和urllib2的区别 • 5 Post和Get • 6 Cookie和Session • 7 apache和nginx的区别 • 8 网站用户密码保存 • 9 HTTP和HTTPS • 10 XSRF和XSS • 11 幂等 Idempotence • 12 RESTful架构(SOAP,RPC) • 13 SOAP • 14 RPC • 15 CGI和WSGI • 16 中间人攻击 • 17 c10k问题 • 18 socket • 19 浏览器缓存 • 20 HTTP1.0和HTTP1.1 • 21 Ajax • *NIX • unix进程间通信方式(IPC) • 数据结构 • 1 红黑树 • 编程题 • 1 台阶问题/斐波那契 • 2 变态台阶问题 • 3 矩形覆盖 • 4 杨氏矩阵查找 • 5 去除列表中的重复元素 • 6 链表成对调换 • 7 创建字典的方法 • 1 直接创建 • 2 工厂方法 • 3 fromkeys()方法 • 8 合并两个有序列表 • 9 交叉链表求交点 • 10 二分查找 • 11 快排 • 12 找零问题 • 13 广度遍历和深度遍历二叉树 • 17 前中后序遍历 • 18 求最大树深 • 19 求两棵树是否相同 • 20 前序中序求后序 • 21 单链表逆置 • 22 两个字符串是否是变位词 • 23 动态规划问题 Python语言特性 1 Python的函数参数传递 看两个例子: 所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。 通过 来看引用 的内存地址可以比较理解: 注:具体的值在不同电脑上运行时可能不同。 可以看到,在执行完 之后, 引用中保存的值,即内存地址发生变化,由原来 对象的所在的地址变成了 这个实体对象的内存地址。 而第2个例子 引用保存的内存值就不会发生变化: 这里记住的是类型是属于对象的,而不是变量。而对象有两种,“可更改”(mutable)与“不可更改”(immutable)对象。在python中,strings, tuples, 和numbers是不可更改的对象,而 list, dict, set 等则是可以修改的对象。(这就是这个问题的重点) 当一个引用传递给函数的时候,函数自动复制一份引用,这个函数里的引用和外边的引用没有半毛关系了.所以第一个例子里函数把引用指向了一个不可变对象,当函数返回的时候,外面的引用没半毛感觉.而第二个例子就不一样了,函数内的引用指向的是可变对象,对它的操作就和定位了指针地址一样,在内存里进行修改. 如果还不明白的话,这里有更好的解释: http://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference 2 Python中的元类(metaclass) 这个非常的不常用,但是像ORM这种复杂的结构还是会需要的,详情请看:http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python 3 @staticmethod和@classmethod Python其实有3个方法,即静态方法(staticmethod),类方法(classmethod)和实例方法,如下: 这里先理解下函数参数里面的self和cls.这个self和cls是对类或者实例的绑定,对于一般的函数来说我们可以这么调用 ,这个函数就是最常用的,它的工作跟任何东西(类,实例)无关.对于实例方法,我们知道在类里每次定义方法的时候都需要绑定这个实例,就是 ,为什么要这么做呢?因为实例方法的调用离不开实例,我们需要把实例自己传给函数,调用的时候是这样的 (其实是 ).类方法一样,只不过它传递的是类而不是实例, .注意这里的self和cls可以替换别的参数,但是python的约定是这俩,还是不要改的好. 对于静态方法其实和普通的方法一样,不需要对谁进行绑定,唯一的区别是调用的时候需要使用 或者 来调用. | \\ | 实例方法 | 类方法 | 静态方法 | | :------ | :------- | :------------- | :-------------- | | a = A() | a.foo(x) | a.class_foo(x) | a.static_foo(x) | | A | 不可用 | A.class_foo(x) | A.static_foo(x) | 更多关于这个问题: • http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python • https://realpython.com/blog/python/instance-class-and-static-methods-demystified/ 4 类变量和实例变量 **类变量:** > 是可在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的)。例如下例中,num_of_instance 就是类变量,用于跟踪存在着多少个Test 的实例。 **实例变量:** > 实例化之后,每个实例单独拥有的变量。 > 补充的例子 这里 是实例调用了类变量,这其实和上面第一个问题一样,就是函数传参的问题, 一开始是指向的类变量 ,但是在实例的作用域里把类变量的引用改变了,就变成了一个实例变量,self.name不再引用Person的类变量name了. 可以看看下面的例子: 当类变量值为可变对象(列表、字典等)时,共享类变量可能会造成意外的结果。 为了避免变量混淆,推荐使用 self 来定义实例变量,使用类名或 cls 来定义类变量。对于可变对象的类变量,可以在类定义时使用深复制来避免共享。 5 Python自省 这个也是python彪悍的特性. 自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型.简单一句就是运行时能够获得对象的类型.比如type(),dir(),getattr(),hasattr(),isinstance(). 6 字典推导式 可能你见过列表推导时,却没有见过字典推导式,在2.7中才加入的: 7 Python中单下划线和双下划线 :一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突,就是例如 , , 这些特殊方法 :一种约定,用来指定变量私有.程序员用来指定私有变量的一种方式.不能用from module import * 导入,其他方面和公有一样访问; :这个有真正的意义:解析器用 来代替这个名字,以区别和其他类相同的命名,它无法直接像公有成员一样随便访问,通过对象名._类名__xxx这样的方式可以访问. 详情见:http://stackoverflow.com/questions/1301346/the-meaning-of-a-single-and-a-double-underscore-before-an-object-name-in-python 或者: http://www.zhihu.com/question/19754941 8 字符串格式化:%和.format .format在许多方面看起来更便利.对于 最烦人的是它无法同时传递一个变量和元组.你可能会想下面的代码不会有什么问题: 但是,如果name恰好是(1,2,3),它将会抛出一个TypeError异常.为了保证它总是正确的,你必须这样做: 但是有点丑..format就没有这些问题.你给的第二个问题也是这样,.format好看多了. 你为什么不用它? • 不知道它(在读这个之前) • 为了和Python2.5兼容(譬如logging库建议使用 (issue #4)) http://stackoverflow.com/questions/5082452/python-string-formatting-vs-format Python f-string 是**执行字符串格式化的最新Python 语法**。 自Python 3.6 起可用。 Python f 字符串提供了一种更快,更易读,更简明且不易出错的在Python 中格式化字符串的方式。f 字符串的前缀为f,并使用{}括号评估值。 在冒号后指定用于类型,填充或对齐的格式说明符。 9 迭代器和生成器 这个是stackoverflow里python排名第一的问题,值得一看: http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python 这是中文版: http://taizilongxu.gitbooks.io/stackoverflow-about-python/content/1/README.html 这里有个关于生成器的创建问题面试官有考: 问: 将列表生成式中[]改成() 之后数据结构是否改变? 答案:是,从列表变为生成器 通过列表生成式,可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含百万元素的列表,不仅是占用很大的内存空间,如:我们只需要访问前面的几个元素,后面大部分元素所占的空间都是浪费的。因此,没有必要创建完整的列表(节省大量内存空间)。 在Python中,我们可以采用生成器:边循环,边计算的机制—>generator 10 and 用 和 只是为了方便并没有强制使用它们. 当你不确定你的函数里将要传递多少参数时你可以用 .例如,它可以传递任意数量的参数: 相似的, 允许你使用没有事先定义的参数名: 你也可以混着用.命名参数首先获得参数值然后所有的其他参数都传递给 和 .命名参数在列表的最前端.例如: 和 可以同时在函数的定义中,但是 必须在 前面. 当调用函数时你也可以用 和 语法.例如: 就像你看到的一样,它可以传递列表(或者元组)的每一项并把它们解包.注意必须与它们在函数里的参数相吻合.当然,你也可以在函数定义或者函数调用时用*. http://stackoverflow.com/questions/3394835/args-and-kwargs 11 面向切面编程AOP和装饰器 这个AOP一听起来有点懵,同学面阿里的时候就被问懵了... 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,**装饰器的作用就是为已经存在的对象添加额外的功能。** 这个问题比较大,推荐: http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python 中文: http://taizilongxu.gitbooks.io/stackoverflow-about-python/content/3/README.html 12 鸭子类型 “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。” 我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。 比如在python中,有很多file-like的东西,比如StringIO,GzipFile,socket。它们有很多相同的方法,我们把它们当作文件使用。 又比如list.extend()方法中,我们并不关心它的参数是不是list,只要它是可迭代的,所以它的参数可以是list/tuple/dict/字符串/生成器等. 鸭子类型在动态语言中经常使用,非常灵活,使得py…