【python面试宝典4】函数参数*arg和**kwargs分别代表什么

题目19:说说你用过Python标准库中的哪些模块。

点评:Python标准库中的模块非常多,建议大家根据自己过往的项目经历来介绍你用过的标准库和三方库,因为这些是你最为熟悉的,经得起面试官深挖的。

模块名介绍
sys跟Python解释器相关的变量和函数,例如:sys.versionsys.exit()
os和操作系统相关的功能,例如:os.listdir()os.remove()
re和正则表达式相关的功能,例如:re.compile()re.search()
math和数学运算相关的功能,例如:math.pimath.emath.cos
logging和日志系统相关的类和函数,例如:logging.Loggerlogging.Handler
json / pickle实现对象序列化和反序列的模块,例如:json.loadsjson.dumps
hashlib封装了多种哈希摘要算法的模块,例如:hashlib.md5hashlib.sha1
urllib包含了和URL相关的子模块,例如:urllib.requesturllib.parse
itertools提供各种迭代器的模块,例如:itertools.cycleitertools.product
functools函数相关工具模块,例如:functools.partialfunctools.lru_cache
collections / heapq封装了常用数据结构和算法的模块,例如:collections.deque
threading / multiprocessing多线程/多进程相关类和函数的模块,例如:threading.Thread
concurrent.futures / asyncio并发编程/异步编程相关的类和函数的模块,例如:ThreadPoolExecutor
base64提供BASE-64编码相关函数的模块,例如:bas64.encode
csv和读写CSV文件相关的模块,例如:csv.readercsv.writer
profile / cProfile / pstats和代码性能剖析相关的模块,例如:cProfile.runpstats.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:平常工作中用什么工具进行静态代码分析。

点评:静态代码分析工具可以从代码中提炼出各种静态属性,这使得开发者可以对代码的复杂性、可维护性和可读性有更好的了解,这里所说的静态属性包括:

  1. 代码是否符合编码规范,例如:PEP-8。
  2. 代码中潜在的问题,包括:语法错误、缩进问题、导入缺失、变量覆盖等。
  3. 代码中的坏味道。
  4. 代码的复杂度。
  5. 代码的逻辑问题。

工作中静态代码分析主要用到的是PylintFlake8。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,那么函数可以接收任意参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水木流年追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值