首页 > 应用开发 > Python > Python面试宝典之基础篇-05
方法一:不使用标准库中的模块和函数。
def is_leap_year(year):
"""判断指定的年份是不是闰年,平年返回False,闰年返回True"""
return year % 4 == 0 and year % 100 != 0 or year % 400 == 0def 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 datetimedef which_day(year, month, date):
end = datetime.date(year, month, date)
start = datetime.date(year, 1, 1)
return (end - start).days + 1点评:静态代码分析工具可以从代码中提炼出各种静态属性,这使得开发者可以对代码的复杂性、可维护性和可读性有更好的了解,这里所说的静态属性包括:
工作中静态代码分析主要用到的是 Pylint和 Flake8。Pylint可以检查出代码错误、坏味道、不规范的代码等问题,较新的版本中还提供了代码复杂度统计数据,可以生成检查报告。Flake8封装了Pyflakes(检查代码逻辑错误)、McCabe(检查代码复杂性)和Pycodestyle(检查代码是否符合PEP-8规范)工具,它可以执行这三个工具提供的检查。
点评:魔术方法也称为魔法方法,是Python中的特色语法,也是面试中的高频问题。

*arg和
**kwargs分别代表什么?Python中,函数的参数分为位置参数、可变参数、关键字参数、命名关键字参数。
*args代表可变参数,可以接收
0个或任意多个参数,当不确定调用者会传入多少个位置参数时,就可以使用可变参数,它会将传入的参数打包成一个元组。
**kwargs代表关键字参数,可以接收用
参数名=参数值的方式传入的参数,传入的参数的会打包成一个字典。定义函数时如果同时使用
*args和
**kwargs,那么函数可以接收任意参数。
点评:高频面试题,也是最简单的装饰器,面试者必须要掌握的内容。
方法一:用函数实现装饰器。
from functools import wrapsfrom time import timedef record_time(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time()
result = func(*args, **kwargs)
print(f'{func.__name__}执行时间: {time() - start}秒')
return result
return wrapper方法二:用类实现装饰器。类有
__call__魔术方法,该类对象就是可调用对象,可以当做装饰器来使用。
from functools import wrapsfrom time import timeclass Record:
def __call__(self, func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time()
result = func(*args, **kwargs)
print(f'{func.__name__}执行时间: {time() - start}秒')
return result
return wrapper说明:装饰器可以用来装饰类或函数,为其提供额外的能力,属于设计模式中的 代理模式。
扩展:装饰器本身也可以参数化,例如上面的例子中,如果不希望在终端中显示函数的执行时间而是希望由调用者来决定如何输出函数的执行时间,可以通过参数化装饰器的方式来做到,代码如下所示。
from functools import wrapsfrom time import timedef record_time(output):
"""可以参数化的装饰器"""
def decorate(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time()
result = func(*args, **kwargs)
output(func.__name__, time() - start)
return result
return wrapper
return decorate温馨提示:Python面试宝典会持续更新,从基础到项目实战的内容都会慢慢覆盖到。虽然每天只更新5个题目,但是每道题扩散出的信息量还是比较大的,希望对找工作的小伙伴所有帮助。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69923331/viewspace-2698066/ ,如需转载,请注明出处,否则将追究法律责任。