一、简答题(20题)
1.面向对象中__new__ 和 init 区别
2.Python 面向对象中的继承有什么特点
3.为什么学习 Python
4.什么是异步非阻塞
5.单例模式与工厂模式
6.re 的 match 和 search 区别
7.简述继承
- Flask 和 Django 的异同
9.with 方法打开文件的作用
10.range 和 xrange 的区别
11.char 和 varchar 的区别
12.TCP 和 UDP 的区别
13.可变类型与不可变类型
14.Python 中的 GIL
- 简述下 Python 中的字符串、列表、元组和字典
16.简述 OSI 七层协议
17.什么是 C/S 和 B/S 架构
- redis 和 memcached 比较
19.try except else finally 的意义
20.什么是负索引
参考答案
1.__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候,是一个实例方法 1、__new__至少要有一个参数 cls,代表当前类,此参数在实例化时由 Python 解释器自动识别。2、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以 return 父类(通过 super(当前类名, cls))__new__出来的实例,或者直接是 object 的__new__出来的实例。3、__init__有一个参数 self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值。4、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过 return 语句里面调用的__new__函数的第一个参数是 cls 来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数
2.a. 同时支持单继承与多继承,当只有一个父类时为单继承,当存在多个父类时为多继承 b. 子类会继承父类所有的属性和方法,子类也可以覆盖父类同名的变量和方法 c. 在继承中基类的构造(init())方法不会被自动调用,它需要在其派生类的构造中专门调用 d. 在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别于在类中调用普通函数时并不需要带上 self 参数
3.Python 语言简单易懂,上手容易,随着 AI 风潮,越来越火
4.同步异步指的是调用者与被调用者之间的关系 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回,一旦调用返回,就得到了返回值 异步的概念和同步相对,调用在发出之后,这个调用就直接返回了,所以没有返回结果。当该异步功能完成后,被调用者可以通过状态、通知或回调来通知调用者 阻塞非阻塞是线程或进程之间的关系 阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。调用线程只有在得到结果之后才会返回。函数只有在得到结果之后才会将阻塞的线程激活 非阻塞和阻塞的概念相对应,非阻塞调用指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程
5.单例模式:主要目的是确保某一个类只有一个实例存在 工厂模式:包涵一个超类,这个超类提供一个抽象化的接口来创建一个特定类型的对象,而不是决定哪个对象可以被创建
6.match()函数只检测要匹配的字符是不是在 string 的开始位置匹配,search()会扫描整个 string 查找匹配
7.一个类继承自另一个类,也可以说是一个孩子类/派生类/子类,继承自父类/基类/超类,同时获取所有的类成员(属性和方法) 继承使我们可以重用代码,并且还可以更方便地创建和维护代码 Python 支持以下类型的继承: 单继承- 一个子类类继承自单个基类 多重继承- 一个子类继承自多个基类 多级继承- 一个子类继承自一个基类,而基类继承自另一个基类 分层继承- 多个子类继承自同一个基类 混合继承- 两种或两种以上继承类型的组合
8.Flask 是 “microframework”,主要用来编写小型应用程序,不过随着 Python 的普及,很多大型程序也在使用 Flask。同时,在 Flask 中,我们必须使用外部库 Django 适用于大型应用程序。它提供了灵活性,以及完整的程序框架和快速的项目生成方法。可以选择不同的数据库,URL结构,模板样式等
9.开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的 f.open 写法,我们需要 try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行 finally f.close() 关闭文件,with 方法帮我们实现了 finally 中 f.close
10.range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列。而 xrange 生成一个生成器,可以很大的节约内存
11.char:存储定长数据很方便,CHAR 字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义 char(10) varchar:存储变长数据,但存储效率没有 CHAR 高,必须在括号里定义长度,可以有默认值
12.TCP 和 UDP 都是 OSI 模型中运输层的协议。TCP 提供可靠的通信传输,而 UDP 则常被用于广播和细节控制交给应用的通信传输。UDP 不提供复杂的控制机制,利用 IP 提供面向无连接的通信服务。TCP 充分实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制 TCP 应用:FTP 传输,点对点短信等 UDP 应用:媒体流等
13.可变数据类型:list、dict、set 不可变数据类型:int/float、str、tuple
14.GIL 是 Python 的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行 Python 程序的时候会占用 Python 解释器(加了一把锁即 GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行
15.字符串(str):字符串是用引号括起来的任意文本,是编程语言中最常用的数据类型。列表(list):列表是有序的集合,可以向其中添加或删除元素。元组(tuple):元组也是有序集合,但是是无法修改的。即元组是不可变的。字典(dict):字典是无序的集合,是由 key-value 组成的。集合(set):是一组 key 的集合,每个元素都是唯一,不重复且无序的。
16.是网络传输协议,人为的把网络传输的不同阶段划分成不同的层次 七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 五层划分为:应用层、传输层、网络层、数据链路层、物理层 物理层:网线,电缆等物理设备 数据链路层:Mac 地址 网络层:IP 地址 传输层:TCP,UDP 协议 应用层:FTP 协议,Email,WWW 等
17.B/S 又称为浏览器/服务器模式。比如各种网站,jupyter notebook 等。优点:零安装,维护简单,共享性好。缺点:安全性较差,个性化不足 C/S 又称为客户端/服务器模式。比如微信客户端,Oracle 客户端等。优点:安全性好,数据传输较快,稳定。缺点:对 PC 机操作系统等有要求,当客户端较多时,服务器端负载较大
18.redis 和 memcached 都是将数据存放在内存中,都是内存数据库。不过 memcached 还可用于缓存其他东西,例如图片、视频等等 redis 不仅仅支持简单的 k/v 类型的数据,同时还提供 list,set,hash 等数据结构的存储 分布式设定, 都可以做一主多从或一主一从 存储数据安全,memcached 挂掉后,数据完全丢失;redis 可以定期保存到磁盘(持久化) 灾难恢复,memcached 挂掉后,数据不可恢复; redis 数据丢失后可以通过 aof 恢复
19.try…except…else 没有捕获到异常,执行 else 语句 try…except…finally 不管是否捕获到异常,都执行 finally 语句
20.Python 中的序列是有索引的,它由正数和负数组成。正的数字使用’0’作为第一个索引,‘1’作为第二个索引,以此类推 负数的索引从’-1’开始,表示序列中的最后一个索引,’ - 2’作为倒数第二个索引,依次类推