52道常见Python面试题,你都能答对吗?

最近有很多人找小编询问python求职面试的一些情况,python岗位众多,面试官的个性也千人千面,其实是没有固定的套路的。还是一句老话,要成功拿下一个重要的面试,靠的是“台上三分钟,台下几年功”。

小编虽然没有套路,但是有干货呀,最近整理近一年出现概率比较高的面试题,供大家参考。

最近开始整理python的资料,博主建立了一个群78486745,希望给大家提供一个交流的平台 。

Q.1. Python 的特点和优点是什么?

Python 可以作为编程的入门语言,因为他具备以下特质:
1.解释性
2. 动态特性
3. 面向对象
4. 语法简洁
5. 开源
6. 丰富的社区资源

Q.2. 深拷贝和浅拷贝的区别是什么?

深拷贝是将对象本身复制给另一个对象。这意味着如果对对象的副本进行更改时不会影响原对象。在 Python 中,我们使用 deepcopy函数进行深拷贝,使用方法如下:
在这里插入图片描述

深拷贝-Python 面试问题及答案
浅拷贝是将对象的引用复制给另一个对象。因此,如果我们在副本中进行更改,则会影响原对象。使用 copy函数进行浅拷贝,使用方法如下:
在这里插入图片描述
浅拷贝—Python 面试问题及答案

Q.3. 列表和元祖有什么不同?

主要区别在于列表是可变的,元祖是不可变的。看下面的例子:
在这里插入图片描述
会出现以下错误提示:
TypeError: ‘tuple’ object does not support item assignment

Q.4. 解释 Python 中的三元表达式

与 C++不同, 在 Python 中我们不需要使用 ? 符号,而是使用如下语法:
[on true] if [expression]else [on false]

如果 [expression] 为真, 则 [on true] 部分被执行。如果表示为假则 [on false] 部分被执行

下面是例子:
在这里插入图片描述
输出:2
在这里插入图片描述
输出:Hi

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

线程是轻量级的进程,多线程允许一次执行多个线程。众所周知,Python 是一种多线程语言,它有一个多线程包。

GIL(全局解释器锁)确保一次执行单个线程。一个线程保存 GIL 并在将其传递给下一个线程之前执行一些操作,这就产生了并行执行的错觉。但实际上,只是线程轮流在 CPU 上。当然,所有传递都会增加执行的开销。

Q.6. 解释继承

一个类继承自另一个类,也可以说是一个孩子类/派生类/子类,继承自父类/基类/超类,同时获取所有的类成员(属性和方法)。

继承使我们可以重用代码,并且还可以更方便地创建和维护代码。Python 支持以下类型的继承:

  1. 单继承- 一个子类类继承自单个基类
  2. 多重继承- 一个子类继承自多个基类
  3. 多级继承- 一个子类继承自一个基类,而基类继承自另一个基类
  4. 分层继承- 多个子类继承自同一个基类
  5. 混合继承- 两种或两种以上继承类型的组合

Q.7. 什么是 Flask?

Flask 是一个使用 Python 编写的轻量级 Web 应用框架,使用 BSD 授权。其 WSGI 工具箱采用 Werkzeug,模板引擎则使用 Jinja2。除了 Werkzeug 和 Jinja2 以外几乎不依赖任何外部库。因为 Flask 被称为轻量级框架。

Flask 的会话会话使用签名 cookie 来允许用户查看和修改会话内容。它会记录从一个请求到另一个请求的信息。但如果要修改会话,则必须有密钥 Flask.secret_key。

Q.8. 如何在 Python 中管理内存?

Python 用一个私有堆内存空间来放置所有对象和数据结构,我们无法访问它。由解释器来管理它。不过使用一些核心 API,我们可以访问一些 Python 内存管理工具控制内存分配。

Q.9. 解释 Python 中的 help 函数和 dir 函数。

help 函数返回帮助文档和参数说明:
在这里插入图片描述
运行结果如下:
Help on function copy in module copy
copy(x)
Shallow copy operation on arbitrary Python objects.
See the module』s doc string for more info.
dir 函数返回对象中的所有成员 (任何类型)
在这里插入图片描述

Q.10. 当退出 Python 时是否释放所有内存分配?

答案是否定的。那些具有对象循环引用或者全局命名空间引用的变量,在 Python 退出是往往不会被释放.
另外不会释放 C 库保留的部分内容。

Q.11. 什么是猴子补丁?

在运行时动态修改类和模块
在这里插入图片描述
Hi, monkey

Q.12. 什么是 Python 字典?

字典是我在 C++和 Java 中没有见过的数据结构,它拥有键-值对
在这里插入图片描述
3
字典是可变的,我们也可以用推导式的方式创建它.
在这里插入图片描述

Q.13. 能否解释一下 *args 和 **kwargs?

如果我们不知道将多少个参数传递给函数,比如当我们想传递一个列表或一个元组值时,就可以使用*args。
在这里插入图片描述
3
2
1
4
7
当我们不知道将会传入多少关键字参数时,使用**kwargs 会收集关键字参数。
在这里插入图片描述
a.1
b.2
c.7
使用 args 和 kwargs 作为参数名只是举例,可以任意替换。
对于 Python 的基础题任何疑问,请在评论区提问。

Q.14. 编程实现计算文件中的大写字母数

在这里插入图片描述
26

Q.15. 什么是负索引?

我们先创建如下列表:
在这里插入图片描述
与正索引不同,负索引是从右边开始检索。
在这里插入图片描述
6
同样可以用于列表的切片:
在这里插入图片描述
[3, 4, 5, 6, 7]

Q.16. 如何随机打乱列表中元素,要求不引用额外的内存空间?

我们用 random 包中的 shuffle 函数来实现。
在这里插入图片描述
[3, 4, 8, 0, 5, 7, 6, 2, 1]

Q.17. 解释 Python 中的 join 和 split 函数

join 函数可以将指定的字符添加到字符串中。
在这里插入图片描述
‘1,2,3,4,5’

split 函数可以用指定的字符分割字符串
在这里插入图片描述
[‘1’, ‘2’, ‘3’, ‘4’, ‘5’]

Q.18. Python 区分大小写吗?

验证 Python 是否区分大小写的方法是测试 myname 和 Myname 在程序中是不是算同一个标识符。观察以下代码的返回结果:
在这里插入图片描述
Myname

NameError: name ‘Myname’ is not defined

如你所见,这里出现了 NameError,所以 Python 是区分大小的语言。

Q.19. Python 中标识符的命名规则?

Python 中的标识符可以是任意长度,但必须遵循以下命名规则:

  1. 只能以下划线或者 A-Z/a-z 中的字母开头。
  2. 其余部分只能使用 A-Z/a-z/0-9。
  3. Python 标识符区分大小写。
  4. 关键字不能作为标识符。Python 有以下这些关键字:
    在这里插入图片描述

Q.20. 如何删除字符串中的前置空格

前置空格是第一个非空格字符前的所有空格,使用 lstrip 函数来删除.
在这里插入图片描述
‘Ayushi ‘
如图这个字符串既包含前置空格也包含后置空格. 调用 lstrip 函数去除了前置空格。如果想去除后置空格,使用 rstrip 函数。
在这里插入图片描述
‘ Ayushi’

Q.21. 如何将字符串转换为小写?
使用 lower 函数
在这里插入图片描述
‘ayushi’
转换为大写用 upper 函数

‘AYUSHI’

要检查字符串是否为全大写或全小写,使用 isupper 和 islower 函数
在这里插入图片描述
像 @ 和$这样的字符即满足大写也满足小写。

istitle 可以检查字符串是否是标题格式。
在这里插入图片描述
True

Q.22. Python 中的 pass 语句有什么作用?

我们在写代码时,有时可能只写了函数声明而没想好函数怎么写,但为了保证语法检查的正确必须输入一些东西。在这种情况下,我们使用 pass 语句。
在这里插入图片描述
类似的 break 语句可以跳出循环。
在这里插入图片描述
0
1
2
continue 语句可以跳到下一轮循环。
在这里插入图片描述
0
1
2
4
5
6

Q.23. 请解释 Python 中的闭包?

如果在一个内部函数里。对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就是一个闭包。
在这里插入图片描述
7

Q.24. 解释 Python 中的//,%和**运算符

//运算符执行地板除法,返回结果的整数部分 (向下取整)。
在这里插入图片描述
3
用/符号除法结果为 3.5。
符号表示取幂. ab 返回 a 的 b 次方
在这里插入图片描述
% 是取模符号。返回除法后的余数。
在这里插入图片描述
6
在这里插入图片描述
0.5
对于 Python 进阶面试问题和答案有任何疑问请在评论区提问。

Q.25. Python 中有多少种运算符,解释算术运算符。

这类面试问题可以判断你的 Python 功底,可以举一些实例来回答这类问题。

在 Python 中我们有 7 中运算符:算术运算符、关系 (比较) 运算符、赋值运算符、逻辑运算符、位运算符、成员运算符、身份运算符。

  1. 加号 (+) 将两个对象的值相加。
    在这里插入图片描述
    15
  2. 减号 (-) 将第一个对象的值减去第二个对象的值。
    在这里插入图片描述
    -1
  3. 乘号 (*) 将两个对象的值相乘。
    在这里插入图片描述
    56
  4. 除号 (/) 将第一个对象的值除以第二个对象的值。
    在这里插入图片描述
    在这里插入图片描述
    1.0
    关于地板除法、取模和取幂,请参考上一个问题。

Q.26. 解释 Python 中的关系运算符。

关系运算符用来比较两个对象。
1.判断小于 (<):如果符号左边的值比右边小则返回 True。
在这里插入图片描述
False

2.判断大于 (>):如果符号左边的值比右边大则返回 True。
在这里插入图片描述
True

出现上面的错误结果是因为 Python 的浮点运算存在一些 Bug。

3.判断小于等于 (<=):如果符号左边的值小于或等于右边则返回 True。
在这里插入图片描述
True

4.大判断于等于 (>=):如果符号左边的值大于或等于右边则返回 True。
在这里插入图片描述
True

5.判断等于 (==) 如果符号两边的值相等则返回 True。
在这里插入图片描述
True

6.判断不等于 (!=) 如果符号两边的值不等则返回 True。
在这里插入图片描述
True
在这里插入图片描述
True

Q.27. 解释 Python 中的赋值和算数运算符?

在这里插入图片描述

Q.28. 解释 Python 中的逻辑运算符

Python 中有三个逻辑运算符:and、or、not
在这里插入图片描述

Q.29. 解释 Python 中的成员运算符

使用 in 和 not in 运算符我们可以判断某个值是否在成员中。
在这里插入图片描述

Q.30. 解释 Python 中的身份运算符

这是非常常见的 Python 面试题,用下面的示例来回答.
is 和 not is 运算符可以判断两个对象是否相同
在这里插入图片描述

Q.31. 解释 Python 中的位运算符

此运算符按二进制位对值进行操作。

1.与 (&) 返回按位与结果
在这里插入图片描述
2

2.或 (|) 返回按位或结果
在这里插入图片描述
3

3.异或 (^) 返回按位异或结果
在这里插入图片描述
1

4.取反 (~) 返回按位取反结果
在这里插入图片描述
-3

5.左移位 (<<) 将符号左边数的二进制左移右边数位
在这里插入图片描述
4

1 的二级制 001 左移 2 位变成 100 也即十进制的 4

6.右移位 (>>)
在这里插入图片描述
1

Q.32. 如何在 Python 使用多进制数字?

除十进制以外,在 Python 中还可以使用二进制、八进制、十六进制。

1.二进制数有 0 和 1 组成,我们使用 0b 或 0B 前缀表示二进制数
在这里插入图片描述
10

使用 bin 函数可以将数字转换为二进制
在这里插入图片描述
‘0b1111’

2.八进制数由数字 0-7 组成,使用前缀 0o 或 0O 表示 8 进制数
在这里插入图片描述
‘0o10’

3.十六进数由数字 0-15 组成,使用前缀 0x 或者 0X 表示 16 进制数
在这里插入图片描述
‘0x10’
在这里插入图片描述
‘0xf’

Q.33. 如何获取字典中的所有键?

使用 keys 来获取字典中的所有键
在这里插入图片描述

Q.34. 问什么标识符不建议使用下划线开头?

因为在 Python 中以下划线开头的变量为私有变量,如果你不想让变量私有,就不要使用下划线开头。

Q.35. 如何声明多个变量并赋值?

有两种方式:
在这里插入图片描述

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

首先我们来介绍元组封装:
在这里插入图片描述
(3, 4, 5)

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

现在我们要将这些值解封装到变量 x,y,z 中
在这里插入图片描述
12

Q.37. 简述面向对象中__new__和__init__区别

__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__函数。

Q.38.简述Django的orm

ORM,全拼Object-Relation Mapping,意为对象-关系映射。

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

Q.39.列出常见MYSQL数据存储引擎

InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。

MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。

MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

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

进程:

1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立
2、稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制

线程:
1、CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源
2、如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃

应用:
IO密集的用多线程,在用户输入,sleep 时候,可以切换到其他线程执行,减少等待的时间
CPU密集的用多进程,因为假如IO操作少,用多线程的话,因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL,其他线程没有GIL,就不能充分利用多核CPU的优势

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

IOError:输入输出异常
AttributeError:试图访问一个对象没有的属性
ImportError:无法引入模块或包,基本是路径问题
IndentationError:语法错误,代码没有正确的对齐
IndexError:下标索引超出序列边界
KeyError:试图访问你字典里不存在的键
SyntaxError:Python代码逻辑语法出错,不能执行
NameError:使用一个还未赋予对象的变量

Q.42.MyISAM 与 InnoDB 区别:

(1、InnoDB 支持事务,MyISAM 不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而 MyISAM就不可以了;

(2、MyISAM 适合查询以及插入为主的应用,InnoDB 适合频繁修改以及涉及到安全性较高的应用;

(3、InnoDB 支持外键,MyISAM 不支持;

(4、对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM表中可以和其他字段一起建立联合索引;

(5、清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表;

Q.43.单引号、双引号、三引号用法

(1、单引号和双引号没有什么区别,不过单引号不用按shift,打字稍微快一点。表示字符串的时候,单引号里面可以用双引号,而不用转义字符,反之亦然。
'She said:“Yes.” ’ or "She said: ‘Yes.’ "

(2、但是如果直接用单引号扩住单引号,则需要转义,像这样:
’ She said:‘Yes.’ ’

(3、三引号可以直接书写多行,通常用于大段,大篇幅的字符串
“”“helloworld”""

Q.44.HTTP请求中get和post区别

(1、GET请求是通过URL直接请求数据,数据信息可以在URL中直接看到,比如浏览器访问;而POST请求是放在请求头中的,我们是无法直接看到的;

(2、GET提交有数据大小的限制,一般是不超过1024个字节,而这种说法也不完全准确,HTTP协议并没有设定URL字节长度的上限,而是浏览器做了些处理,所以长度依据浏览器的不同有所不同;POST请求在HTTP协议中也没有做说明,一般来说是没有设置限制的,但是实际上浏览器也有默认值。总体来说,少量的数据使用GET,大量的数据使用POST。

(3、GET请求因为数据参数是暴露在URL中的,所以安全性比较低,比如密码是不能暴露的,就不能使用GET请求;POST请求中,请求参数信息是放在请求头的,所以安全性较高,可以使用。在实际中,涉及到登录操作的时候,尽量使用HTTPS请求,安全性更好。

Q.45.请尽可能列举python列表的成员方法,并给出列表操作的答案:

(1) a=[1, 2, 3, 4, 5], a[::2]=?, a[-2:] = ?
(2)一行代码实现对列表a中的偶数位置的元素进行加3后求和?
(3)将列表a的元素顺序打乱,再对a进行排序得到列表b,然后把a和b按元素顺序构造一个字典d。

Q.46.请问下面的代码有什么隐患?

def strtest1(num):
str = ‘first’
for i in range(num):
str += ’X’
return str

由于变量str是个不可变对象,每次迭代,python都会生成新的str对象来存储新的字符串,num越大,创建的str对象越多,内存消耗越大。

Q.47.单引号,双引号,三引号的区别

单引号和双引号是等效的,如果要换行,需要符号(),三引号则可以直接换行,并且可以包含注释

如果要表示Let’s go 这个字符串
单引号:s4= ‘Let\’s go’
双引号:s5= “Let’s go”
s6 = ‘I realy like“python”!’
这就是单引号和双引号都可以表示字符串的原因了

Q.48.Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)

赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。

浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}

深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}

Q.49.介绍一下Python下range()函数的用法?

列出一组数据,经常用在for in range()循环中

Q.50.请问如何修改以下Python代码,使得下面的代码调用类A的show方法?

在这里插入图片描述
答:这道题的考点是类继承,只要通过__class__ 方法指定类对象就可以了。补充的代码如下:
在这里插入图片描述

Q.51.请问如何修改以下Python代码,使得代码能够运行?

在这里插入图片描述
此题考察得是方法对象,为了能让对象实例能被直接调用,需要实现 call 方法,补充代码如下:
在这里插入图片描述

Q.52.一个包里有三个模块,mod1.py , mod2.py , mod3.py ,但使用 from demopack import * 导入模块时,如何保证只有 mod1 、 mod3 被导入了。

在包中增加 init.py 文件,并在文件中增加:all = [‘mod1’,’mod3’]

【搜索圆方圆,获得“python教程”,“python下载”,“python入门”类相关信息。】

你可能感兴趣的:(python学习,python教程,python视频,python自学,python零基础,python学习)