华为od 面试八股文
目录
1:提高Python执行效率的方法你用过哪些?
2:什么是鸭子类型?
3:*arg 和**karg的区别是什么?
4:read、readline、readlines的区别是什么?
5:用过哪些第三方包?
6:Python 中 Django、Flask、Tornado 三大框架各自的应用场景?
7:什么是 restful api,谈谈你的理解?
8:Python 是强语言类型还是弱语言类型?
9:谈一下什么是解释性语言,什么是编译性语言?
10:说一下字典和 json 的区别?
1:提高Python执行效率的方法你用过哪些?
-
优化算法,选择合适的数据结构和算法,减少不必要的计算和迭代。
-
使用numexpr库来进行数值表达式的并行计算。
-
使用多进程或多线程来并行执行计算密集型任务。
-
使用Cython或PyPy来将Python代码转换为优化的C或Python字节码。
-
对频繁调用的函数使用装饰器来缓存结果。
2:什么是鸭子类型?
Python中的鸭子类型(Duck Typing)是一种动态类型的概念。相比对象的类型,Python更关注对象的行为。这个概念源自于一句格言:“如果它走起路来像鸭子,叫起来像鸭子,那么它就是一只鸭子”。
简而言之,鸭子类型意味着只要一个对象实现了特定的方法或者拥有特定的属性,它就可以被用作符合这些方法或属性的目的,而不需要明确地指定它们的类型。这使得Python非常灵活,允许你使用不同的对象类型来完成相似的任务。这也是Python中强大的多态性的一部分。
举个例子,假设你有一个叫做 perform_quack() 的函数,它接受一个参数并调用它的 quack() 方法。这个函数不关心传递的对象具体是什么类型,只要它有一个 quack() 方法就可以。这符合了鸭子类型的思想。
3:*arg 和**karg的区别是什么?
一、主体不同
1、实参:在调用有参函数时,函数名后面括号中的参数为“实际参数”。
2、形参:不是实际存在变量,又称虚拟变量。
二、目的不同
1、实参:可以是常量、变量或表达式, 无论实参是何种类型的量,在进行函数调用时,都必须具有确定的值, 以便把这些值传送给形参。
2、形参:定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。
三、特点不同
1、实参:在调用函数过程中,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值。该值在函数调用期间有效,可以参加该函数中的运算。
2、形参:形参的本质是一个名字,不占用内存空间
4:read、readline、readlines的区别是什么?
(1)read([size])方法
read([size])方法从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止,它范围为字符串对象
f = open("a.txt") lines = f.read() print lines print(type(lines)) f.close() # #字符串类型
(2)readline()方法
该方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。
f = open("a.txt") line = f.readline() print(type(line)) while line: print line, line = f.readline() f.close()
(3)readlines()方法
读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素,但读取大文件会比较占内存
f = open("a.txt") lines = f.readlines() print(type(lines)) for line in lines: print line, f.close()
(4)linecache模块
当然,有特殊需求还可以用linecache模块
5:用过哪些第三方包?
matplotlib(包含pyplot和pylab)
主要用于可视化的2D、3D 绘图。
opencv
主要用于图像处理以及计算机视觉算法。
numpy
主要用于存储和处理大型矩阵,实用的线性代数、傅里叶变换和随机数生成函数,稀疏矩阵运算包scipy配合使用更加方便。
结合自己实际介绍
6:Python 中 Django、Flask、Tornado 三大框架各自的应用场景?
Django
主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过 10000,如果要实现高并发的话,就要对 Django 进行二次开发,比如把整个笨重的框架给拆掉,自己写 socket 实现 http 的通信,底层用纯 c/c++写提升效率,ORM 框架给干掉,自己编写封装与数据库交互的框架,因为啥呢,ORM 虽然面向对象来操作数据库,但是它的效率很低,使用外键来联系表与表之间的查询
Flask
轻量级,主要是用来写接口的一个框架,实现前后端分离,提升开发效率,Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展 Flask-Mail,用户认证 Flask-Login),都需要用第三方的扩展来实现。比如可以用 Flask-extension 加入 ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQL。
其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。Python 最出名的框架要数 Django,此外还有 Flask、Tornado 等框架。虽然 Flask 不是最出名的框架,但是 Flask 应该算是最灵活的框架之一,这也是 Flask 受到广大开发者喜爱的原因。
Tornado
Tornado 是一种 Web 服务器软件的开源版本。
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。
7:什么是 restful api,谈谈你的理解?
REST:Representational State Transfer 的缩写,翻译:“具象状态传输”。一般解释为“表现层状态转换”。
REST 是设计风格而不是标准。是指客户端和服务器的交互形式。我们需要关注的重点是如何设计 REST 风格的网络接口。
REST 的特点:
(1) 具象的。一般指表现层,要表现的对象就是资源。比如,客户端访问服务器,获取的数据就是资源。比如文字、图片、音视频等。
(2) 表现:资源的表现形式。txt 格式、html 格式、json 格式、jpg 格式等。浏览器通过 URL 确定资源的位置,但是需要在 HTTP 请求头中,用 Accept 和 Content-Type 字段指定,这两个字段是对资源表现的描述。
(3) 状态转换:客户端和服务器交互的过程。在这个过程中,一定会有数据和状态的转化,这种转化叫做状态转换。其中,GET 表示获取资源,POST 表示新建资源,PUT 表示更新资源,DELETE 表示删除资源。HTTP 协议中最常用的就是这四种操作方式。
RESTful 架构:
(1) 每个 URL 代表一种资源
(2) 客户端和服务器之间,传递这种资源的某种表现层
(3) 客户端通过四个 http 动词,对服务器资源进行操作,实现表现层状态转换
8:Python 是强语言类型还是弱语言类型?
Python 是强类型的动态脚本语言。
强类型:不允许不同类型相加。
动态:不使用显示数据类型声明,且确定一个变量的类型是在第一次给它赋值的时候。
脚本语言:一般也是解释型语言,运行代码只需要一个解释器,不需要编译。
9:谈一下什么是解释性语言,什么是编译性语言?
计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。
解释性语言在运行程序的时候才会进行翻译。
编译型语言写的程序在执行之前,需要一个专门的编译过程,把程序编译成机器语言(可执行文件)。
10:说一下字典和 json 的区别?
字典是一种数据结构,json 是一种数据的表现形式,字典的 key 值只要是能 hash 的就行,json 的必须是字符串。