文章插图
在本文中,我将我的一些笔记变成了20 个面试问题,涵盖了数据结构、核心编程概念和 Python/ target=_blank class=infotextkey>Python 最佳实践 。
希望你能完成其中的一些并重温你的 python 技能 。
事不宜迟,让我们直接进入 。
1. 列表和元组有什么区别?你应该什么时候使用哪一个?
列表是可变数据结构,而元组是不可变数据结构 。
Python 中的可变对象具有更改其值的能力 。
列表是动态的:你可以向其中添加项目或覆盖和删除现有项目 。
元组是固定大小的:它们没有方法Append或extend方法 。你也不能从中删除项目 。
元组和列表都支持索引并允许使用in运算符检查其中的现有元素 。
→ 在某些情况下,我认为元组可能有用 。
- 如果你声明一个你知道永远不会更改的项目集合,或者你将只循环而不更改其值,请使用元组 。
- 如果你寻找性能,元组比列表更快,因为它们是只读结构 。如果你不需要写操作,请考虑使用元组 。
- 如果你想防止意外写入不需要更改的数据,元组可以使你的代码更安全 。
这是一个代码示例,显示了元组与列表的不同之处 。
【20 个 Python 面试题来挑战你的知识】
>>> numbers = [1, 2, 3, 4, 5]>>> numbers[1] = 100>>> print(numbers)[1, 100, 3, 4, 5]>>> names = ("john", "joe", "alice")>>> names[0] = "bob")TypeError Traceback (most recent call last)in----> 1 names[0] = "bob"TypeError: 'tuple' object does not support item assignment
2 — 多处理和多线程有什么区别?你应该什么时候使用哪个?多处理和多线程是旨在加快代码速度的编程范例 。
当你使用多处理时,你可以在进程上并行计算 。进程是独立的,不相互通信:它们不共享相同的内存区域,并且相互之间有严格的隔离 。在应用方面,多处理适用于 CPU 密集型工作负载 。但是,它确实具有与进程数量成正比的大量内存占用 。
另一方面,在多线程应用程序中,线程存在于单个进程中 。因此,它们共享相同的内存区域:它们可以修改相同的变量并且可以相互干扰 。虽然进程是严格并行执行的,但在 Python 中的给定时间点只执行一个线程,这是由于全局解释器锁 ( GIL ) 。多线程适用于受 IO 限制的应用程序,例如网页抓取或从数据库中获取数据 。
→ 如果你想了解有关多线程和多处理的更多信息,我建议你阅读我之前关于多进程跟线程的文章关于多线程你知道多少呢?,该文章全面介绍了这两个概念 。
3 — 模块、包和库之间有什么区别?
模块只是一个 Python 文件,旨在导入脚本或其他模块 。它包含函数、类和全局变量 。
包是模块的集合,它们在文件夹中组合在一起以提供一致的功能 。包可以像模块一样被导入 。它们通常有一个__init__.py文件告诉 Python 解释器按原样处理它们 。
库是包的集合 。
4 — python 中的多线程有什么问题?
全局解释器锁(或 GIL)可防止 Python 解释器同时执行多个线程 。简而言之,GIL 强制在 Python 中的任何时间点只执行一个线程 。
这代表了依赖多线程代码的 CPU 密集型应用程序的一个很大的性能瓶颈 。
5 — 什么是装饰器?你能描述一下装饰器值得使用的情况吗?
装饰器是一个接收函数作为输入并返回函数作为输出的函数 。装饰器的目标是在不改变其核心机制的情况下扩展输入函数的行为 。
使用装饰器还可以防止你重复自己 。它迫使你编写一次通用代码,然后将其用于需要它的每个功能 。
装饰器大放异彩的典型用例是日志记录 。
例如,想象一下,你希望将传递给程序中调用的每个函数的所有参数值记录到终端 。你可以遍历每个函数定义并将其写下来,或者你可以只编写一个装饰器来执行此日志记录任务并将其应用于所有需要它的函数 。
将装饰器应用于函数只需在该函数的定义上方添加一行即可 。
#没有装饰器def my_awesome_function():# 做一些很棒的事情# 带有装饰器@my_awesome_decoratordef my_awesome_function():# 做更棒的事情
下面是一个代码示例,它创建了一个名为的装饰器,该装饰器log记录了传递给函数的参数的值 。
import logginglogging.basicConfig(format="%(asctime)s [%(levelname)s] %(name)s - %(message)s",level=logging.INFO,datefmt="%Y-%m-%d %H:%M:%S",stream=sys.stdout,logger = logging.getLogger("notebook")def log(func):def wrapper(*args, **kwargs):output = func(*args, **kwargs)msg = f"{func.__name__} was run with the following args: {args} and the following kwargs {kwargs}"logger.info(msg)return outputreturn wrapper@logdef print_args(*args, **kwargs):print(args)print(kwargs)>>> print_args(10, a=2, b="test")(10,){'a': 2, 'b': 'test'}2022-03-06 18:07:05,248 - notebook - INFO - print_args was run with the following args: (10,) and the following kwargs {'a': 2, 'b': 'test'}>>> print_args(10, 100, a=2, b="test")(10, 100){'a': 2, 'b': 'test'}2022-03-06 18:07:05,562 - notebook - INFO - print_args was run with the following args: (10, 100) and the following kwargs {'a': 2, 'b': 'test'}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 张子萱|陈赫老婆发视频高调炫富!一个发夹高达3800元,打扮少女被嘲装嫩
- 黄山最值得去的五个景点 黄山市旅游景点
- 异性相处,如何拉近彼此的关系?这三个有效建议值得收藏
- 中国最美的50个地方,我竟然只去过18个,你呢?
- 两口子带着孩子能做什么生意,带两个孩子做什么生意好-
- 男人对妈比对老婆好说明什么-,一个男人对妈妈比对老婆好-
- 秦始皇的第一个皇后叫什么名字,秦始皇的名字叫啥-
- Angelababy|杨颖最新ELLE11月刊封面,惊艳造型满分,氛围感真绝
- 庞尊|庞莹这对千年虐恋看哭了多少人?一个想要自由,一个不想失去
- |要想赢得同事,有必要知道这8个职场职责