写在之前
Python 面试的时候会涉及到很多的八股文,我准备连载一个新的系列【最新Python面试题】
这些面试题是我结合自身经验,以及搜集整理的企业面试真题,主要有以下几个方面:
- Python基础
- Python机制
- Python面向对象
- Python笔试题
- Python算法
- Django框架
- Flask框架
- 其他开源框架
- Scrapy数据爬虫
- Python正则式
- Python数据分析
- Pandas框架
- Python拓展知识(数据结构,常见算法,数据库原理及调优,中间件…)
虽然这些是面试“八股文”,但是只会背答案与流畅的并能结合自身思考的回答,对于面试官来说还是有很大区别的。
所以除了在每道面试题后会提供仔细整理和验证后的答案以外,在每篇文章中会挑选一道难度高且重点的题目做详细的讲解。
希望大家不但能知其然也可以知其所以然,在面试的时候让面试官眼前一亮,这样白花花的offer不就到手了嘛
每天会更新10道题左右,无论是准备面试还是自己学习,这份面试题绝对值得你去看
大家可以关注我,再关注我,使劲关注我,不要错过每天的更新~
1.介绍一下Python的str对象的方法?
capitalize()
:- 将字符串的第一个字符转换为大写,其余字符转换为小写。
casefold()
:- 进行全小写转换,比
lower()
更为激进,能够处理特殊字符。
- 进行全小写转换,比
center(width[, fillchar])
:- 返回一个原字符串居中的字符串,宽度为
width
,不足部分用fillchar
填充。
- 返回一个原字符串居中的字符串,宽度为
count(substring[, start[, end]])
:- 返回子字符串
substring
在字符串中出现的次数,可以指定开始和结束位置。
- 返回子字符串
encode([encoding[, errors]])
:- 将字符串编码为指定编码的字节串,如
utf-8
。
- 将字符串编码为指定编码的字节串,如
endswith(suffix[, start[, end]])
:- 检查字符串是否以
suffix
结尾,返回布尔值。
- 检查字符串是否以
expandtabs([tabsize])
:- 将字符串中的制表符(
\t
)扩展为一定数量的空格,默认为 8 个。
- 将字符串中的制表符(
find(substring[, start[, end]])
:- 查找子字符串
substring
在字符串中的位置,返回索引,如果未找到则返回-1
。
- 查找子字符串
format([format_spec])
:- 进行字符串格式化,可以包含格式化规范。
format_map([mapping])
:- 类似于
format()
,但使用字典或类似的映射对象进行格式化。
- 类似于
index([substring[, start[, end]])
:- 与
find()
类似,但如果没有找到子字符串,会抛出ValueError
。
- 与
isalnum()
:- 检查字符串是否至少有一个字符,并且所有字符都是字母或数字。
isalpha()
:- 检查字符串是否所有字符都是字母。
isdigit()
:- 检查字符串是否所有字符都是数字。
islower()
:- 检查字符串是否所有字符都是小写。
isupper()
:- 检查字符串是否所有字符都是大写。
istitle()
:- 检查字符串是否符合标题的格式,即每个单词的首字母大写。
isspace()
:- 检查字符串是否所有字符都是空白字符。
join(iterable)
:- 将迭代器中的元素连接成一个字符串,元素之间用调用
join()
的字符串分隔。
- 将迭代器中的元素连接成一个字符串,元素之间用调用
lower()
:- 将字符串中的所有大写字符转换为小写。
lstrip([chars])
:- 去除字符串左侧的空白字符或指定字符。
rstrip([chars])
:- 去除字符串右侧的空白字符或指定字符。
strip([chars])
:- 去除字符串两侧的空白字符或指定字符。
replace(old, new[, count])
:- 将字符串中的
old
子字符串替换为new
子字符串,可以指定替换次数。
- 将字符串中的
split(sep=None, maxsplit=-1)
:- 按照指定分隔符
sep
将字符串分割为一个列表,可以指定最大分割次数。
- 按照指定分隔符
splitlines([keepends])
:- 按照行分割字符串,返回一个包含各行的列表。
startswith(prefix[, start[, end]])
:- 检查字符串是否以
prefix
开头,返回布尔值。
- 检查字符串是否以
swapcase()
:- 将字符串中的大写字符转换为小写,小写字符转换为大写。
title()
:- 将字符串的每个单词的首字母转换为大写,其他字母转换为小写。
upper()
:- 将字符串中的所有小写字符转换为大写。
zfill(width)
:- 将字符串用
0
填充到指定的宽度,填充总是在左侧进行。
- 将字符串用
2.Python列表与元组的区别是什么?分别在什么情况下使用?
列表(List)的特点:
- 可变(Mutable):列表的内容可以在创建后修改,可以添加、删除或更改其中的元素。
- 有序:列表保持元素的顺序,可以通过索引访问。
- 允许重复:列表中的元素可以重复。
- 使用方括号:列表使用方括号
[]
定义,例如my_list = [1, 2, 3]
。 - 支持动态扩展:可以在运行时根据需要扩展列表的大小。
元组(Tuple)的特点:
- 不可变(Immutable):元组的内容在创建后不能修改,不能添加、删除或更改其中的元素。
- 有序:元组同样保持元素的顺序,可以通过索引访问。
- 不允许重复:元组中的元素不允许重复,但可以包含可变对象,如列表。
- 使用圆括号:元组使用圆括号
()
定义,或者直接省略括号,例如my_tuple = (1, 2, 3)
或my_tuple = 1, 2, 3
。 - 内存效率:由于不可变性,元组通常在内存使用上比列表更高效。
使用场景:
列表(List):
- 当你需要一个可以修改的数据集合时,应该使用列表。
- 列表适用于数据项需要动态改变的情况,如添加、删除元素或对元素进行各种操作。
- 在需要实现数组或类似数组结构的场景中使用列表。
- 列表也常用于实现算法和数据结构,如链表、栈、队列等。
元组(Tuple):
- 当你需要一个不应被修改的数据集合时,应该使用元组。
- 元组适用于保护数据不被改变的场景,可以作为其他数据结构(如字典的键)的一部分。
- 在函数需要返回多个值时,使用元组可以方便地打包和返回多个结果。
- 元组常用于存储不应更改的数据,如配置数据或固定集合。
3.阐述decorator的用法和它的应用场景?
在 Python 中,装饰器(Decorator)是一种设计模式,用于在不修改原有函数或方法代码的情况下,给函数或方法添加额外的功能。装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数。
日志记录:在函数调用前后添加日志记录,用于调试或记录操作。
性能测试:测量函数执行时间,用于性能分析。
权限校验:在函数执行前检查用户权限,确保安全性。
缓存:缓存函数的结果,避免重复计算。
参数校验:在函数执行前校验输入参数的有效性。
事务处理:在数据库操作函数前后添加事务开始和提交或回滚。
异步编程:将同步函数转换为异步函数。
4.介绍一下Python Date Time方面的类?
date
:- 表示一个特定的日期,如年、月、日。
- 属性包括:
year
、month
、day
。
time
:- 表示一天中的时间,包括时、分、秒和微秒。
- 属性包括:
hour
、minute
、second
、microsecond
。
datetime
:- 结合了
date
和time
,表示一个特定的日期和时间。 - 属性包括:
year
、month
、day
、hour
、minute
、second
、microsecond
。
- 结合了
timedelta
:- 表示两个日期或时间之间的差,即一个时间跨度。
- 属性包括:
days
、seconds
、microseconds
。
tzinfo
:- 这是一个抽象的基类,用于表示时区信息。
- 实际使用时,通常会使用
pytz
库或 Python 3.2 以上版本中的timezone
类来处理时区。
timezone
(Python 3.2+):datetime
的一个子类,用于表示带有时区信息的日期和时间。
5.Python中的模块和包是什么?
模块(Module)
- 单个
.py
文件:一个模块通常是一个.py
文件,它包含了 Python 代码。例如,一个名为mymodule.py
的文件就是一个模块。 - 组织代码:模块允许你将相关的函数和类组织在一起,这样可以在不同的程序中重用这些代码。
- 命名空间:模块在导入时会创建一个命名空间,这个命名空间包含了模块中定义的所有名称(函数、类、变量等)。
- 导入:你可以使用
import
语句来导入模块,然后在你的程序中使用模块中定义的名称。
- 单个
包(Package)
- 目录结构:一个包是一个包含一个
__init__.py
文件的目录,这个文件可以是空的,它告诉 Python 这个目录应该被视为一个包。 - 层次结构:包可以包含其他包,形成一个层次结构,这允许你创建复杂的代码库。
- 导入:你可以使用
import
语句来导入包中的模块,或者使用from ... import ...
语句来直接导入包中的特定名称。 - 命名空间:包有自己的命名空间,它允许你创建具有相同名称的不同模块,只要它们位于不同的包中
- 目录结构:一个包是一个包含一个
6.简述什么是PEP8?
PEP 8 是 Python 编程语言的一种风格指南,它提供了关于如何编写清晰、可读性强的 Python 代码的指导。PEP 8 的全称是 "Python Enhancement Proposal 8",即 "Python 增强提案第8号"。这个提案由 Barry Warsaw 于 2001 年撰写,目的是统一 Python 社区中的代码风格。
PEP 8 包括了一系列关于代码格式化的规则,如缩进、行长度、空格使用、命名规则等
7.**简述Python异常处理 **
Python中的异常处理是一种结构,用于捕获和处理程序执行中发生的异常(错误)。异常处理允许程序在遇到错误时控制流程,而不是立即崩溃。Python 使用 try、except、else 和 finally 语句进行异常处理。
8.Python里面search()和match()的区别?
match()
match()
尝试从字符串的起始处匹配正则表达式模式。- 它只在字符串的开始处进行匹配检查,如果模式匹配了字符串的开始部分,则返回一个匹配对象;否则,返回
None
。 - 由于
match()
只在字符串的开始进行匹配,因此它对于检查字符串是否以特定模式开始非常有用。
search()
search()
扫描整个字符串,寻找正则表达式模式的第一次出现。- 它返回第一个成功的匹配。如果没有找到匹配,它将返回
None
。 search()
对于在字符串中的任意位置查找模式非常有用,不仅仅是开始部分。
9.Python如何取整数的绝对值?
这可以通过abs()函数来完成。
abs(2)
#=> 2
abs(-2)
#=> 2
重点题详解
阐述什么是pickling和unpickling ?
在Python中,"pickling"和"unpickling"是两种与对象序列化和反序列化相关的过程,它们通过pickle
模块实现。
-
Pickling:
-
Pickling是将Python对象转换为字节流的过程,这个字节流可以保存到文件中,或者通过网络发送到其他计算机。这个过程通过
pickle
模块的dump()
或dumps()
函数实现。 -
dump()
函数将对象序列化并写入到一个文件中,而dumps()
函数将对象序列化为一个字节字符串。 -
例如,使用
pickle.dump()
函数将数据序列化到文件的代码如下:import pickle data = {"name": "Alice", "age": 30} with open("data.pkl", "wb") as file: pickle.dump(data, file)
-
Pickling允许保存复杂的Python对象,包括自定义类的实例。
-
-
Unpickling:
-
Unpickling是将字节流转换回Python对象的过程,这通常用于从文件中读取之前序列化的对象。
-
load()
函数从文件中读取字节流并反序列化成Python对象,而loads()
函数将字节字符串反序列化为对象。 -
例如,使用
pickle.load()
函数从文件中加载数据的代码如下:import pickle with open("data.pkl", "rb") as file: data = pickle.load(file)
-
Unpickling时,必须能够访问对象的类定义,否则无法正确还原对象。
-
区别:
- Pickling是序列化过程,用于创建对象的字节流表示。
- Unpickling是反序列化过程,用于从字节流中恢复对象。
安全性:
- 使用
pickle
模块时需要注意安全性,因为反序列化恶意构造的数据可能导致代码执行。因此,只应对可信的数据进行unpickling。
与JSON的比较:
- JSON是一种文本基础的数据交换格式,易于人阅读和编写,也易于机器解析和生成。它是一种轻量级的数据交换语言,不仅用于Python,也广泛用于其他编程语言。
- Pickle是Python特有的二进制序列化格式,不适合跨语言使用,且不可读。
- JSON通常用于存储和传输文本信息,而pickle用于存储复杂的Python对象。
在实际应用中,如果需要跨语言或跨平台的数据交换,推荐使用JSON。如果仅在Python内部进行数据持久化,且需要存储复杂的对象结构,可以使用pickle。但要注意,pickle数据不应该来自不可信的源,以避免潜在的安全风险。
更多资料干货、行业内幕 长期免费更新中!