您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

20 个 Python 面试题来挑战你的知识

时间:2022-10-08 10:31:16  来源:今日头条  作者:喜欢编码的社畜


 

在本文中,我将我的一些笔记变成了20 个面试问题,涵盖了数据结构、核心编程概念和 Python/ target=_blank class=infotextkey>Python 最佳实践。

希望你能完成其中的一些并重温你的 python 技能。

事不宜迟,让我们直接进入。

1. 列表和元组有什么区别?你应该什么时候使用哪一个?

列表是可变数据结构,而元组是不可变数据结构。
Python 中的可变对象具有更改其值的能力。

列表是动态的:你可以向其中添加项目或覆盖和删除现有项目。
元组是固定大小的:它们没有方法Append或extend方法。你也不能从中删除项目。
元组和列表都支持索引并允许使用in运算符检查其中的现有元素。

→ 在某些情况下,我认为元组可能有用。

 

  • 如果你声明一个你知道永远不会更改的项目集合,或者你将只循环而不更改其值,请使用元组。
  • 如果你寻找性能,元组比列表更快,因为它们是只读结构。如果你不需要写操作,请考虑使用元组。
  • 如果你想防止意外写入不需要更改的数据,元组可以使你的代码更安全。

 

这是一个代码示例,显示了元组与列表的不同之处。

>>> 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 assignment2 — 多处理和多线程有什么区别?你应该什么时候使用哪个?

多处理和多线程是旨在加快代码速度的编程范例。

当你使用多处理时,你可以在进程上并行计算。进程是独立的,不相互通信:它们不共享相同的内存区域,并且相互之间有严格的隔离。在应用方面,多处理适用于 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'}

装饰器还可以用于其他目的,例如计时功能、验证输入数据、执行访问控制和身份验证、缓存等。

6 — 如何正确地将数据写入文件?否则会出什么问题?

使用上下文管理器是关键。

当你使用open没有上下文管理器的语句并且在关闭文件之前发生一些异常时(关闭文件是你在以这种方式打开文件时必须记住的事情)可能会发生内存问题并且文件可能会在此过程中损坏。

当你with用来打开一个文件并且发生异常时,Python 保证该文件是关闭的。

d = {"foo": 1}# bad practicef = open("./data.csv", "wb")f.write("some data")v = d["bar"] # KeyError# f.close() never executes which leads to memory issuesf.close()# good practicewith open("./data.csv", "wb") as f:f.write("some data")v = d["bar"]# python still executes f.close() even if the KeyError exception occurs7 — 函数参数是按引用传递还是按值传递?

在 Python 中,所有函数参数都是通过引用传递的:这意味着如果将参数传递给函数,则函数将获得对同一对象的引用。

如果对象是可变的并且函数改变了它,则参数将在函数的外部范围内发生变异。让我们看一个例子:

>>> def append_number(numbers):numbers.append(5)>>> numbers = [1, 2, 3, 4]>>> print(f"before: {numbers}"[1, 2, 3, 4]>>> append_number(numbers)>>> numbers[1, 2, 3, 4, 5]8 — 如何覆盖对象的打印方式?

使用 the__str__和__repr__dunder 方法。

这是一个示例,它演示了 Person 类中的实例在打印到控制台时如何被很好地格式化。

class Person:def __init__(self, first_name, last_name, age):self.first_name = first_nameself.last_name = last_nameself.age = agedef __str__(self):return f"{self.first_name} {self.last_name} ({self.age})"def __repr__(self):return f"{self.first_name} {self.last_name} ({self.age})">>> person = Person("John", "Doe", 30) # thanks to __str__John Doe (30)>>> person # thanks to __repr__John Doe (30)9 — 编写一个计算整数 n 阶乘的函数

递归是关键

def factorial(n):if n == 0:return 1else:return n * factorial(n-1)10 — is 和 == 运算符有什么区别?

==是一个测试相等性的运算符,而is是一个测试身份的运算符。

两个对象可以具有相同的值,但不一定相同(即具有相同的内存地址)。

请记住,这a is b是id(a) == id(b).

11 — 什么时候不应该使用 assert 语句?

assert语句对于内部测试和完整性检查很有用。

但是,它不应该用于执行数据验证或错误处理,因为出于性能原因,它通常在生产代码中被禁用。

想象一下,如果你使用断言检查管理员权限:这可能会在生产中引入很大的安全漏洞。

assert你可以抛出自定义错误,而不是使用该语句。

# Dangerous code!def delete_product(user, product_id):assert user.is_admin()user.delete_product(product_id)# Handle this properly by rAIsing an errordef delete_product(user, product_id):if not user.is_admin():raise AuthError("User must have admin privileges")else:user.delete_product(product_id)12 — 什么是 Python 生成器?

Python 生成器是一个生成一系列项目的函数。

生成器看起来像典型的函数,但它们的行为是不同的。对于初学者,不使用return语句,而是使用yield语句。

然后,调用生成器函数不会运行该函数:它只会创建一个生成器对象。生成器的代码仅在next函数应用于生成器对象或生成器被迭代时执行(在这种情况下,next函数被隐式调用)

在生成器对象上调用函数的次数next等于yield在生成器函数中调用语句的次数。

你可以使用 for 循环或生成器表达式定义生成器。

>>> def repeat(n, message):for _ in range(n):yield messagerepeat_hello_five_times = repeat(5, hello)>>> for message in repeat_hello_five_times:print(message)"hello""hello""hello""hello""hello">>> repeat_hello_five_time = ("hello" for _ in range(5))>>> repeat_hello_five_timesat 0x7fb64f2362d0>>>> for message in repeat_hello_five_times:print(message)"hello""hello""hello""hello""hello"13 — 类方法和静态方法有什么区别?什么时候应该使用哪个?

静态方法是一种对调用它的类或实例有任何了解的方法。这是一种逻辑上属于该类但没有隐式参数的方法。
可以在类或其任何实例上调用静态方法。

类方法是传递给调用它的类的方法,就像self传递给类中的其他实例方法一样。类方法的强制参数不是类实例:它实际上是类本身。

类方法的一个典型用例是提供另一种构造实例的方法:执行此操作的类方法称为类的工厂。

这是一个使用类方法的 Employee 类,该类方法创建实例的方式与类的主构造函数略有不同。

class Employee(object):def __init__(self, first_name, last_name):self.first_name = first_nameself.last_name = last_nale@classmethoddef from_string(cls, name_str):first_name, last_name = map(str, name_str.split(' '))employee = cls(first_name, last_name)return employeeahmed = Employee.from_string('Ahmed Besbes')14 — 举一个例子说明你如何使用 zip 和枚举

该zip函数将多个迭代作为输入并将它们聚合到一个元组中。例如,如果你想同时遍历两个列表,这可能很有用。

>>> names = ["john", "bob", "alice"]>>> ages = [10, 16, 20]>>> for name, age in zip(names, ages):print(name, age)john 10bob 16alice 20

该enumerate函数允许循环遍历一个可迭代对象并同时访问正在运行的索引和项目。

>>> names = ["john", "bob", "alice"]>>> for index, name in enumerate(names):print(index, name)0 john1 bob2 alice15 — 你会如何在给定的函数中使用 *args 和 **kwargs?

*args 和 **kwargs 通过接受可变数量的参数使 Python 函数更加灵活。

 

  • *args 在列表中传递可变数量的非关键字参数
  • **kwargs 在字典中传递可变数量的关键字参数

 

这是一个函数示例,该函数采用可变数量的关键字参数,这些参数收集在名为的字典中data(请注意,它不需要命名kwargs)


 

16 — 给出一个使用 map 的函数式编程示例>>> numbers = [1, 2, 3, 4, 5]>>> numbers_times_2 = list(map(lambda n: n * 2, numbers))>>> numbers_times_2[2, 4, 6, 8, 10]17 — continue 和 break 语句有什么区别

该break语句终止包含它的循环。程序立即移动到循环外部范围内的代码段。


 

另一方面,该continue语句跳过当前迭代的其余代码并移至下一个迭代。


 

18 - 如何防止函数被调用不必要的时间?

使用缓存。

如果与给定输入关联的输出在一段时间内没有变化,则使用缓存对函数有意义。

一个典型的场景是查询一个 web 服务器:如果你第一次查询一个 URL,并且你知道响应不会改变,你可以缓存结果。

from cachetools import cached, TTLCachecache = TTLCache(maxsize=100, ttl=86400)@cached(cache)def extract_article_content(url):response = requests.get(url)content = response.contentreturn content19 — 给出一些 PEP8 指南

  • 每个缩进级别使用 4 个空格。
  • 进口应按以下顺序分组:
  1. 标准库导入。
  2. 相关第三方进口。
  3. 本地应用程序/库特定的导入。
  • 函数名和变量名应为小写并用下划线分隔
  • 类名使用 Capwords 约定。
20 — 如何使用具有 2GB RAM 的计算机在 Python 中读取 8GB 文件?

 

此解决方案适用于任何大型(甚至更大)文件。

当你打开文件时,你需要做的就是将文件对象用作迭代器:在循环此文件对象时,你将一次获取一行,并且前面的行将从内存中清除(即它们是垃圾收集)。

这样,文件将永远不会完全加载到内存中。

with open("./large_dataset.txt") as input_file:for line in input_file:process_line(line)感谢阅读

这是我在面试中经常看到的一些问题的概述。我希望你从文章中学到了一些东西。20 个 Python 面试题来挑战你的知识



Tags:Python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一篇文章教会你使用Python中三种简单的函数
所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。一、函数简介所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。二、函数定义...【详细内容】
2024-04-11  Search: Python  点击:(3)  评论:(0)  加入收藏
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。一、前言在Thread和Process中,应当优...【详细内容】
2024-04-11  Search: Python  点击:(2)  评论:(0)  加入收藏
Python 可视化:Plotly 库使用基础
当使用 Plotly 进行数据可视化时,我们可以通过以下示例展示多种绘图方法,每个示例都会有详细的注释和说明。1.创建折线图import plotly.graph_objects as go# 示例1: 创建简单...【详细内容】
2024-04-01  Search: Python  点击:(8)  评论:(0)  加入收藏
Python 办公神器:教你使用 Python 批量制作 PPT
介绍本文将介绍如何使用openpyxl和pptx库来批量制作PPT奖状。本文假设你已经安装了python和这两个库。本文的场景是:一名基层人员,要给一次比赛活动获奖的500名选手制作奖状,并...【详细内容】
2024-03-26  Search: Python  点击:(18)  评论:(0)  加入收藏
Python实现工厂模式、抽象工厂,单例模式
工厂模式是一种常见的设计模式,它可以帮助我们创建对象的过程更加灵活和可扩展。在Python中,我们可以使用函数和类来实现工厂模式。一、Python中实现工厂模式工厂模式是一种常...【详细内容】
2024-03-07  Search: Python  点击:(34)  评论:(0)  加入收藏
不可不学的Python技巧:字典推导式使用全攻略
Python的字典推导式是一种优雅而强大的工具,用于创建字典(dict)。这种方法不仅代码更加简洁,而且执行效率高。无论你是Python新手还是有经验的开发者,掌握字典推导式都将是你技能...【详细内容】
2024-02-22  Search: Python  点击:(35)  评论:(0)  加入收藏
如何进行Python代码的代码重构和优化?
Python是一种高级编程语言,它具有简洁、易于理解和易于维护的特点。然而,代码重构和优化对于保持代码质量和性能至关重要。什么是代码重构?代码重构是指在不改变代码外部行为的...【详细内容】
2024-02-22  Search: Python  点击:(36)  评论:(0)  加入收藏
Python开发者必备的八个PyCharm插件
在编写代码的过程中,括号几乎无处不在,以至于有时我们会拼命辨别哪个闭合括号与哪个开头的括号相匹配。这款插件能帮助解决这个众所周知的问题。前言在PyCharm中浏览插件列表...【详细内容】
2024-01-26  Search: Python  点击:(89)  评论:(0)  加入收藏
Python的Graphlib库,再也不用手敲图结构了
Python中的graphlib库是一个功能强大且易于使用的工具。graphlib提供了许多功能,可以帮助您创建、操作和分析图形对象。本文将介绍graphlib库的主要用法,并提供一些示例代码和...【详细内容】
2024-01-26  Search: Python  点击:(88)  评论:(0)  加入收藏
大语言模型插件功能在携程的Python实践
作者简介成学,携程高级安全研发工程师,关注Python/Golang后端开发、大语言模型等领域。一、背景2023年初,科技圈最火爆的话题莫过于大语言模型了,它是一种全新的聊天机器人模型,...【详细内容】
2024-01-26  Search: Python  点击:(76)  评论:(0)  加入收藏
▌简易百科推荐
一篇文章教会你使用Python中三种简单的函数
所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。一、函数简介所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。二、函数定义...【详细内容】
2024-04-11  Go语言进阶学习  微信公众号  Tags:Python   点击:(3)  评论:(0)  加入收藏
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。一、前言在Thread和Process中,应当优...【详细内容】
2024-04-11  Go语言进阶学习    Tags:Python   点击:(2)  评论:(0)  加入收藏
Python 可视化:Plotly 库使用基础
当使用 Plotly 进行数据可视化时,我们可以通过以下示例展示多种绘图方法,每个示例都会有详细的注释和说明。1.创建折线图import plotly.graph_objects as go# 示例1: 创建简单...【详细内容】
2024-04-01  Python技术    Tags:Python   点击:(8)  评论:(0)  加入收藏
Python 办公神器:教你使用 Python 批量制作 PPT
介绍本文将介绍如何使用openpyxl和pptx库来批量制作PPT奖状。本文假设你已经安装了python和这两个库。本文的场景是:一名基层人员,要给一次比赛活动获奖的500名选手制作奖状,并...【详细内容】
2024-03-26  Python技术  微信公众号  Tags:Python   点击:(18)  评论:(0)  加入收藏
Python实现工厂模式、抽象工厂,单例模式
工厂模式是一种常见的设计模式,它可以帮助我们创建对象的过程更加灵活和可扩展。在Python中,我们可以使用函数和类来实现工厂模式。一、Python中实现工厂模式工厂模式是一种常...【详细内容】
2024-03-07  Python都知道  微信公众号  Tags:Python   点击:(34)  评论:(0)  加入收藏
不可不学的Python技巧:字典推导式使用全攻略
Python的字典推导式是一种优雅而强大的工具,用于创建字典(dict)。这种方法不仅代码更加简洁,而且执行效率高。无论你是Python新手还是有经验的开发者,掌握字典推导式都将是你技能...【详细内容】
2024-02-22  子午Python  微信公众号  Tags:Python技巧   点击:(35)  评论:(0)  加入收藏
如何进行Python代码的代码重构和优化?
Python是一种高级编程语言,它具有简洁、易于理解和易于维护的特点。然而,代码重构和优化对于保持代码质量和性能至关重要。什么是代码重构?代码重构是指在不改变代码外部行为的...【详细内容】
2024-02-22  编程技术汇    Tags:Python代码   点击:(36)  评论:(0)  加入收藏
Python开发者必备的八个PyCharm插件
在编写代码的过程中,括号几乎无处不在,以至于有时我们会拼命辨别哪个闭合括号与哪个开头的括号相匹配。这款插件能帮助解决这个众所周知的问题。前言在PyCharm中浏览插件列表...【详细内容】
2024-01-26  Python学研大本营  微信公众号  Tags:PyCharm插件   点击:(89)  评论:(0)  加入收藏
Python的Graphlib库,再也不用手敲图结构了
Python中的graphlib库是一个功能强大且易于使用的工具。graphlib提供了许多功能,可以帮助您创建、操作和分析图形对象。本文将介绍graphlib库的主要用法,并提供一些示例代码和...【详细内容】
2024-01-26  科学随想录  微信公众号  Tags:Graphlib库   点击:(88)  评论:(0)  加入收藏
Python分布式爬虫打造搜索引擎
简单分布式爬虫结构主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个...【详细内容】
2024-01-25  大雷家吃饭    Tags:Python   点击:(59)  评论:(0)  加入收藏
站内最新
站内热门
站内头条