常见Python面试题

Q 1:Python有哪些特点和优点?

作为一门编程入门语言,Python主要有以下特点和优点:

可解释

具有动态特性

面向对象

简明简单

开源

具有强大的社区支持

Q 2. 在Python中如何实现多线程?

Python并不支持真正意义上的多线程,一个线程就是一个轻量级进程,多线程能让我们一次执行多个线程。我们都知道,Python是多线程语言,其内置有多线程工具包。

Python中的GIL(全局解释器锁)确保一次执行单个线程。一个线程保存GIL并在将其传递给下个线程之前执行一些操作,这会让我们产生并行运行的错觉。但实际上,只是线程在CPU上轮流运行。当然,所有的传递会增加程序执行的内存压力。

Q 3. 解释一下Python中的继承

当一个类继承自另一个类,它就被称为一个子类/派生类,继承自父类/基类/超类。它会继承/获取所有类成员(属性和方法)。

继承能让我们重新使用代码,也能更容易的创建和维护应用。Python支持如下种类的继承:

单继承:一个类继承自单个基类

多继承:一个类继承自多个基类

多级继承:一个类继承自单个基类,而这个单基类继承自另一个基类

分层继承:多个类继承自单个基类

混合继承:两种或多种类型继承的混合

Q 4. 什么是Flask?

Flask是Python编写的一款轻量级Web应用框架。其 WSGI(Web Server Gateway Interface) 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2。Flask使用 BSD (是Unix的衍生系统)授权。其中两个环境依赖是Werkzeug和jinja2,这意味着它不需要依赖外部库。正因如此,我们将其称为轻量级框架。

Q 5. Web应用的本质?

1.  浏览器发送一个HTTP请求;

2. 服务器收到请求,生成一个HTML文档;

3. 服务器把HTML文档作为HTTP响应的Body发送给浏览器;

4. 浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。

Q 6. 在Python中是如何管理内存的?

Python有一个私有堆空间来保存所有的对象和数据结构。作为开发者,我们无法访问它,是解释器在管理它。但是有了核心API后,我们可以访问一些工具。Python内存管理器控制内存分配。

另外,内置垃圾回收器会回收使用所有的未使用内存,所以使其适用于堆空间

Q 7. 解释Python中的help()和dir()函数

Help()函数是一个内置函数,用于查看函数或模块用途的详细说明:

Dir()函数也是Python内置函数,dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。

Q 8. 当退出Python时,是否释放全部内存?

答案是No。循环引用其它对象或引用自全局命名空间的对象的模块,在Python退出时并非完全释放。

另外,也不会释放C库保留的内存部分。

Q 9. 什么是猴子补丁?

在运行期间动态修改一个类或模块

常见Python面试题_第1张图片

Q 10. 什么是负索引?

负索引和正索引不同,它是从右边开始检索。

Q 11. Python中的闭包是什么?

当一个嵌套函数在其外部区域引用了一个值时,并有返回值,该嵌套函数就是一个闭包。

Q 12. 在Python中有多少种运算符?解释一下算数运算符。

在Python中,我们有7种运算符:

算术运算符(+ - / // % *)、

关系运算符(> < = >= <=)、

赋值运算符(+= -=)、

逻辑运算符(and  or  not)、

位运算符(& | ^ ~)、

成员运算符(in not in)、

身份运算符(is not is)

Q 13. 元组的解封装是什么?

将 3,4,5 封装到元组 mytuple 中

>>> mytuple=3,4,5

将这些值解封装到变量 x,y,z 中:

>>> x,y,z=mytuple

Q 14.  说明os,sys模块不同,并列举常用的模块方法?

os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口。

os.remove删除    os.rename重新命名  os.mkdir 创建目录  os.remkdir 删除目录

sys模块负责程序与Python解释器的交互,提供了一系列的函数和变量用户操作Python运行时的环境。

sys. exit(n),0 是正常退出,其他都是异常退出,可以捕获。

sys. path

sys.path.append

Q 15. __new__和__init__的区别。

new是一个静态方法,是在实例创建之前被调用的;而init是一个实例方法,是当实例对象创建完成后被调用的。

new方法会返回一个创建的实例,而init什么都不返回. 

只有在new返回一个cls的实例时后面的init才能被调用. 

Q 16.说一说Python自省。

运行时能够获得对象的类型。比如:type()、dir()、getattr()、hasattr()、isinstance()

Q 17 . python中生成随机整数、随机小数、0--1之间小数方法

随机整数:random.randint(a,b),生成区间内的整数

随机小数:习惯用numpy库,利用np.random.randn(5)生成5个随机小数

0-1随机小数:random.random(),括号中不传参

Q 18 . 一行代码实现1--100之和

sum(range(0,101))

Q 19 . python2和python3的的区别

1.  range():  python2返回列表,python3返回迭代器,节约内存

2.  input/raw_input:  

                        在python2中,input返回是数值列表,raw_input返回的是字符串

                        在Python3中,只有input,返回的是字符串

Q 20 . 一句话解释什么样的语言能够用装饰器?

函数可以作为参数传递的语言,可以使用装饰器

Q 21. python中断言方法举例

assert()方法,断言成功,则程序继续执行,断言失败,则程序报错


Q 22 . 10个Linux常用命令

ls  pwd  cd  vi  rm  mkdir  tree  cp  mv  cat  more  grep  shutdown 

Q 23 . 用python删除文件和用linux命令删除文件方法

python:os.remove(文件名)

linux:       rm  文件名

Q 24 . 请列出你会的任意一种统计图(条形图、折线图等)绘制的开源库,第三方也行

pychart


Q 25 . 简述Django的orm

ORM,全拼Object-Relation Mapping,意为对象-关系映射。实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要修改代码只需要面向对象编程,orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句,所有使用Django开发的项目无需关心程序底层使用的是MySQL、Oracle、sqlite....,如果数据库迁移,只需要更换Django的数据库引擎即可

Q 26 . 提高python运行效率的方法

1、使用生成器,因为可以节约大量内存

2、循环代码优化,避免过多重复代码的执行

3、核心模块用Cython  PyPy等,提高效率

4、多进程、多线程、协程

5、多个if elif条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断的次数,提高效率

Q 27 . 遇到bug如何处理

1、细节上的错误,通过print()打印,能执行到print()说明一般上面的代码没有问题,分段检测程序是否有问题,如果是js的话可以alert或console.log

2、如果涉及一些第三方框架,会去查官方文档或者一些技术博客。

3、对于bug的管理与归类总结,一般测试将测试出的bug用teambin等bug管理工具进行记录,然后我们会一条一条进行修改,修改的过程也是理解业务逻辑和提高自己编程逻辑缜密性的方法,我也都会收藏做一些笔记记录。

4、导包问题、城市定位多音字造成的显示错误问题

Q 28 . 列出常见的状态码和意义

200 OK 

请求正常处理完毕

202

请求被接受,但处理尚未完成 处理方式:阻塞等待

204 No Content 

请求成功处理,没有实体的主体返回

206 Partial Content 

GET范围请求已成功处理

400 Bad Request 

请求报文语法错误或参数错误

401 Unauthorized 

需要通过HTTP认证,或认证失败

403 Forbidden 

请求资源被拒绝

404 Not Found 

无法找到请求资源(服务器无理由拒绝)

500 Internal Server Error 

服务器故障或Web应用故障

503 Service Unavailable 

服务器超负载或停机维护

505

http版本不支持

Q 29 . 分别从前端、后端、数据库阐述web项目的性能优化

前端优化:

1、减少http请求、例如制作精灵图

2、html和CSS放在页面上部,javascript放在页面下面,因为js加载比HTML和Css加载慢,所以要优先加载html和css,以防页面显示不全,性能差,也影响用户体验差

后端优化:

1、缓存存储读写次数高,变化少的数据,比如网站首页的信息、商品的信息等。应用程序读取数据时,一般是先从缓存中读取,如果读取不到或数据已失效,再访问磁盘数据库,并将数据再次写入缓存。

2、异步方式,如果有耗时操作,可以采用异步,比如celery

3、代码优化,避免循环和判断次数太多,如果多个if else判断,优先判断最有可能先发生的情况

数据库优化:

索引、分库分表分区、数据库引擎(一种是innodb、一种是myisam ),myisam的效率大概能够比innodb快1-2倍,mysiam适用于一次插入,多次查询的表

Q 30 . 简述同源策略

 同源策略需要同时满足以下三点要求: 

1)协议相同 

 2)域名相同 

3)端口相同 

Q 31 . 简述cookie和session的区别

1,session 在服务器端,cookie 在客户端(浏览器)

2、session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效,存储Session时,键与Cookie中的sessionid相同,值是开发人员设置的键值对信息,进行了base64编码,过期时间由开发人员设置

3、cookie安全性比session差

Q 32 . 简述多线程、多进程

进程:

1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立

2、稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制

线程:

1、CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源

2、如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃

应用:

IO密集的用多线程,在用户输入,sleep 时候,可以切换到其他线程执行,减少等待的时间

CPU密集的用多进程,因为假如IO操作少,用多线程的话,因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL,其他线程没有GIL,就不能充分利用多核CPU的优势

Q 33 . IOError、AttributeError、ImportError、IndentationError、IndexError、KeyError、SyntaxError、NameError分别代表什么异常

IOError:输入输出异常

AttributeError:试图访问一个对象没有的属性

ImportError:无法引入模块或包,基本是路径问题

IndentationError:语法错误,代码没有正确的对齐

IndexError:下标索引超出序列边界

KeyError:试图访问你字典里不存在的键

SyntaxError:Python代码逻辑语法出错,不能执行

NameError:使用一个还未赋予对象的变量

Q 34 . 列举3条以上PEP8编码规范

1、顶级定义之间空两行,比如函数或者类定义。

2、方法定义、类定义与第一个方法之间,都应该空一行

3、三引号进行注释

4、使用Pycharm、Eclipse一般使用4个空格来缩进代码

Q 35 . Linux命令重定向 > 和 >>

Linux 允许将命令执行结果 重定向到一个 文件

将本应显示在终端上的内容 输出/追加 到指定文件中

> 表示输出,会覆盖文件原有的内容

>> 表示追加,会将内容追加到已有文件的末尾

用法示例:

将 echo 输出的信息保存到 1.txt 里echo Hello Python > 1.txt

将 tree 输出的信息追加到 1.txt 文件的末尾tree >> 1.txt


Q 36. 常见的网络传输协议

UDP(User Datagram Protocol的简称, 中文名是用户数据报协议)、

TCP(Transmission Control Protocol传输控制协议)、

FTP(File Transfer Protocol,文件传输协议)、

HTTP(HyperText Transfer Protocol,超文本传输协议)、

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)

Q 36. 介绍一下Python中webbrowser的用法?

webbrowser模块提供了一个高级接口来显示基于Web的文档,大部分情况下只需要简单的调用open()方法。

webbrowser定义了如下的异常:

exception webbrowser.Error, 当浏览器控件发生错误是会抛出这个异常

webbrowser有以下方法:

webbrowser.open(url[, new=0[, autoraise=1]])

这个方法是在默认的浏览器中显示url, 如果new = 0, 那么url会在同一个浏览器窗口下打开,如果new = 1, 会打开一个新的窗口,如果new = 2, 会打开一个新的tab, 如果autoraise = true, 窗口会自动增长。

webbrowser.open_new(url)

在默认浏览器中打开一个新的窗口来显示url, 否则,在仅有的浏览器窗口中打开url

webbrowser.open_new_tab(url)

在默认浏览器中当开一个新的tab来显示url, 否则跟open_new()一样

webbrowser.get([name]) 根据name返回一个浏览器对象,如果name为空,则返回默认的浏览器

webbrowser.register(name, construtor[, instance])

注册一个名字为name的浏览器,如果这个浏览器类型被注册就可以用get()方法来获取。

37.  dir(builtins)是什么意思

查看系统的内置函数

你可能感兴趣的:(常见Python面试题)