目录
题目19:说说你用过Python标准库中的哪些模块。
点评:Python标准库中的模块非常多,建议大家根据自己过往的项目经历来介绍你用过的标准库和三方库,因为这些是你最为熟悉的,经得起面试官深挖的。
模块名 | 介绍 |
---|---|
sys | 跟Python解释器相关的变量和函数,例如:sys.version 、sys.exit() |
os | 和操作系统相关的功能,例如:os.listdir() 、os.remove() |
re | 和正则表达式相关的功能,例如:re.compile() 、re.search() |
math | 和数学运算相关的功能,例如:math.pi 、math.e 、math.cos |
logging | 和日志系统相关的类和函数,例如:logging.Logger 、logging.Handler |
json / pickle | 实现对象序列化和反序列的模块,例如:json.loads 、json.dumps |
hashlib | 封装了多种哈希摘要算法的模块,例如:hashlib.md5 、hashlib.sha1 |
urllib | 包含了和URL相关的子模块,例如:urllib.request 、urllib.parse |
itertools | 提供各种迭代器的模块,例如:itertools.cycle 、itertools.product |
functools | 函数相关工具模块,例如:functools.partial 、functools.lru_cache |
collections / heapq | 封装了常用数据结构和算法的模块,例如:collections.deque |
threading / multiprocessing | 多线程/多进程相关类和函数的模块,例如:threading.Thread |
concurrent.futures / asyncio | 并发编程/异步编程相关的类和函数的模块,例如:ThreadPoolExecutor |
base64 | 提供BASE-64编码相关函数的模块,例如:bas64.encode |
csv | 和读写CSV文件相关的模块,例如:csv.reader 、csv.writer |
profile / cProfile / pstats | 和代码性能剖析相关的模块,例如:cProfile.run 、pstats.Stats |
unittest | 和单元测试相关的模块,例如:unittest.TestCase |
题目20:__init__
和__new__
方法有什么区别?
Python中调用构造器创建对象属于两阶段构造过程,首先执行__new__
方法获得保存对象所需的内存空间,再通过__init__
执行对内存空间数据的填充(对象属性的初始化)。__new__
方法的返回值是创建好的Python对象(的引用),而__init__
方法的第一个参数就是这个对象(的引用),所以在__init__
中可以完成对对象的初始化操作。__new__
是类方法,它的第一个参数是类,__init__
是对象方法,它的第一个参数是对象。
题目21:输入年月日,判断这个日期是这一年的第几天。
方法一:不使用标准库中的模块和函数。
def is_leap_year(year):
"""判断指定的年份是不是闰年,平年返回False,闰年返回True"""
return year % 4 == 0 and year % 100 != 0 or year % 400 == 0
def which_day(year, month, date):
"""计算传入的日期是这一年的第几天"""
# 用嵌套的列表保存平年和闰年每个月的天数
days_of_month = [
[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
]
days = days_of_month[is_leap_year(year)][:month - 1]
return sum(days) + date
方法二:使用标准库中的datetime
模块。
import datetime
def which_day(year, month, date):
end = datetime.date(year, month, date)
start = datetime.date(year, 1, 1)
return (end - start).days + 1
题目22:平常工作中用什么工具进行静态代码分析。
点评:静态代码分析工具可以从代码中提炼出各种静态属性,这使得开发者可以对代码的复杂性、可维护性和可读性有更好的了解,这里所说的静态属性包括:
- 代码是否符合编码规范,例如:PEP-8。
- 代码中潜在的问题,包括:语法错误、缩进问题、导入缺失、变量覆盖等。
- 代码中的坏味道。
- 代码的复杂度。
- 代码的逻辑问题。
工作中静态代码分析主要用到的是Pylint和Flake8。Pylint可以检查出代码错误、坏味道、不规范的代码等问题,较新的版本中还提供了代码复杂度统计数据,可以生成检查报告。Flake8封装了Pyflakes(检查代码逻辑错误)、McCabe(检查代码复杂性)和Pycodestyle(检查代码是否符合PEP-8规范)工具,它可以执行这三个工具提供的检查。
题目23:说一下你知道的Python中的魔术方法。
点评:魔术方法也称为魔法方法,是Python中的特色语法,也是面试中的高频问题。
魔术方法 | 作用 |
---|---|
__new__ 、__init__ 、__del__ | 创建和销毁对象相关 |
__add__ 、__sub__ 、__mul__ 、__div__ 、__floordiv__ 、__mod__ | 算术运算符相关 |
__eq__ 、__ne__ 、__lt__ 、__gt__ 、__le__ 、__ge__ | 关系运算符相关 |
__pos__ 、__neg__ 、__invert__ | 一元运算符相关 |
__lshift__ 、__rshift__ 、__and__ 、__or__ 、__xor__ | 位运算相关 |
__enter__ 、__exit__ | 上下文管理器协议 |
__iter__ 、__next__ 、__reversed__ | 迭代器协议 |
__int__ 、__long__ 、__float__ 、__oct__ 、__hex__ | 类型/进制转换相关 |
__str__ 、__repr__ 、__hash__ 、__dir__ | 对象表述相关 |
__len__ 、__getitem__ 、__setitem__ 、__contains__ 、__missing__ | 序列相关 |
__copy__ 、__deepcopy__ | 对象拷贝相关 |
__call__ 、__setattr__ 、__getattr__ 、__delattr__ | 其他魔术方法 |
题目24:函数参数*arg
和**kwargs
分别代表什么?
Python中,函数的参数分为位置参数、可变参数、关键字参数、命名关键字参数。*args
代表可变参数,可以接收0
个或任意多个参数,当不确定调用者会传入多少个位置参数时,就可以使用可变参数,它会将传入的参数打包成一个元组。**kwargs
代表关键字参数,可以接收用参数名=参数值
的方式传入的参数,传入的参数的会打包成一个字典。定义函数时如果同时使用*args
和**kwargs
,那么函数可以接收任意参数。