当前位置: 首页 > news >正文

分享 10 个高频 Python 面试题

Python 很容易学会,但很难掌握。

你可以在几天内了解它的基本语法,但是要能够用 Python 开发出足够好的商业软件,多年的实践是必须的。

因为,无论你使用哪种编程语言,你都必须对其复杂的内部机制有足够的了解,才能写出健壮的程序。

本文分享 10 个针对高级开发人员的 Python 面试题。它可以测试你对 Python 内部机制理解的程度。

一、Python中的整数缓存机制

面试官:

请解释在 Python shell 解释器上执行的代码的以下结果:

>>> a=256>>> b=256>>> a is bTrue>>> x=257>>> y=257>>> x is yFalse

回答:

这是因为 Python 中的整数缓存机制。为了节省时间和内存成本,Python 总是预先加载 [-5, 256] 范围内的所有小整数。

因此,[-5, 256] 中的所有整数都已经保存在内存中。当声明此范围内的新整数变量时,Python 只是将缓存的整数引用到它,不会创建任何新对象。

因此,对结果的解释是:

当变量 a 和 b 分配给 256 时,它们被引用到存储 256 的相同内存位置。他们指向同一个对象。

当变量 a 和 b 被分配给 257 时,它们是不同内存位置的两个不同对象,因为 257 不在小整数缓存范围内。

由于 is 运算符要比较两个变量的内存位置,a is b 应该输出 True ,x is y 应该输出 False。

二、如何避免嵌套循环

面试官:

下面的程序使用了嵌套循环,你将如何优化它?

list_a = [1, 2020, 70]list_b = [2, 4, 7, 2000]list_c = [3, 70, 7]for a in list_a:    for b in list_b:        for c in list_c:            if a + b + c == 2077:                print(a, b, c)# 70 2000 7

回答:

可以使用 itertools 中的 product 函数对其进行优化:

from itertools import productlist_a = [1, 2020, 70]list_b = [2, 4, 7, 2000]list_c = [3, 70, 7]for a, b, c in product(list_a, list_b, list_c):    if a + b + c == 2077:        print(a, b, c)# 70 2000 7

因为 product 函数生成输入迭代的笛卡尔积。它可以帮助我们在很多场景中避免嵌套循环。

三、 类方法和静态方法

面试官:

在 Python 类中,类方法和静态方法有什么区别?

回答:

类方法是 Python 类中的第一个参数是类本身的方法。我们用 cls 这个参数来表示。

类方法不仅可以由实例调用,也可以由类直接调用。

静态方法是 Python 类中没有类或实例参数的方法。

因为静态方法不包含有关特定类或实例的参数。我们可以将其定义为类外的独立函数,并将其用作类外的其他普通函数。

可以阅读为什么 classmethod 比 staticmethod 更受宠?了解更多。

四、eval 函数的使用

面试官:

能否用一行 Python 代码中实现一个函数,它将接收两个数字 a 和 b 一个字符串 op。op 代表算术运算符,例如 “+”、“-”、“*”和“/” 。函数需要返回 op 的计算结果 a op b。

回答:

def cal(a, b, op): return eval(f'{a} {op} {b}')

面试官:

好!那你能谈谈 eval 函数的缺点,以及为什么它不适合在生产中使用吗?

回答:

在生产环境中,我们应该仔细检查用户输入以避免意外问题。eval 函数会立即执行输入,这可能造成远程代码执行,这是非常危险的,强烈建议不要在生产环境使用 eval,即使你做了很多安全检查。可以阅读前文看完此文,你还会用 eval 吗?了解更多。

五、抽象类

面试官:

在面向对象编程中,有一个概念叫做抽象类。Python 也支持抽象类吗?

回答:

支持。Python 标准库有个模块 abc,它为抽象类提供功能。

通过继承类 abc.ABC,可以将类定义为抽象类,借助于装饰器 abc.abstractmethod,我们可以将方法定义为抽象方法。

例如:

from abc import ABC, abstractmethodclass Animal(ABC):    @abstractmethod    def move(self):        pass

六、函数传参的机制

面试官:

Python 是按值还是按引用传参?

回答:

既不是按值传递,也不是按引用传递,Python 自有一套机制,我们都知道 Python 的世界里,万物皆对象,从这个方面讲,传递给函数的,都是对象的地址,这有点像引用的概念,但是 Python 的对象分为可变对象和不可变对象,不可变对象就是不可修改的对象,例如:数字、字符串、元组,在不可变对象上的自增操作会新创建一个对象。

如果从其他编程语言过来学 Python 的,可以简单的这么理解:对于不可变对象,是按值传递,函数内部不会修改不可变对象,对于可变对象,是按引用(地址)传递,函数内部的修改会影响到参数本身。

可以阅读前文Python基础系列-可变/不可变数据类型了解更多。

七、Python 中的垃圾回收

面试官:

Python 如何收集垃圾(无用的对象)?

回答:

Python 使用一种称为引用计数的方法来决定何时需要在内存中收集对象。

简单来说,Python 会计算每个对象的引用计数,当一个对象没有引用时,会自动收集。

推荐这两篇文章来理解 Python 的垃圾回收:

  1. 学习一下 Python 的垃圾回收

  1. Python 是如何管理内存的?

八、在 Python 函数中接收无限数量的参数

面试官:

请解释函数参数中星号的以下用法:

def func(*args, **kwargs):    pass

回答:

按照惯例,如果无法清楚地确定其参数的数量,我们会像示例一样定义一个 Python 函数。

以单个星号为前缀的参数 args 表示可以将任意数量的位置参数保存到元组中,args 就是这个元组的名称。

以两个星号为前缀的参数 kwargs 表示可以将任意数量的位置参数保存到字典中,kwargs 就是这个字典的名称。

九、 Lambda 函数

面试官:

Python 中的 lambda 函数是什么?你能否提供一个利用 lambda 函数强大功能的示例?

回答:

lambda 函数,或称为匿名函数,是一个没有函数名的简单 Python 函数。

编写 lambda 函数的模板是:

lambda 参数:表达式

使用它的一个很好的场景是 sort 函数,比如:

leaders = ["Warren Buffett", "Yang Zhou", "Tim Cook", "Elon Musk"]print(leaders)# ['Warren Buffett', 'Yang Zhou', 'Tim Cook', 'Elon Musk']leaders.sort(key=lambda x: len(x))print(leaders)# ['Tim Cook', 'Yang Zhou', 'Elon Musk', 'Warren Buffett']

十、Python 中的一些推导式

面试官:

Python中的推导式是什么?

回答:

推导式技巧是 Python 中的语法糖。它可以帮助轻松生成特定的数据结构。Python 中有四种类型的推导式:

  1. 列表推导式

  1. 生成器推导式

  1. 集合推导式

  1. 字典推导式

例如,我们可以如下生成字典:

Entrepreneurs = ["Yang", "Mark", "steve", "jack", "tom"]D1 = {id: name for id, name in enumerate(Entrepreneurs) if name[0].isupper()}print(D1)# {0: 'Yang', 1: 'Mark'}

相关文章:

分享 10 个高频 Python 面试题

Python 很容易学会,但很难掌握。你可以在几天内了解它的基本语法,但是要能够用 Python 开发出足够好的商业软件,多年的实践是必须的。因为,无论你使用哪种编程语言,你都必须对其复杂的内部机制有足够的了解&#xff0c…...

ThreadLocal原理、结构、源码解析

文章目录一、Thread简介1.什么是ThreadLocal2.为什么要是用ThreadLocal2.1Synchronized、Lock保证线程安全2.2ThreadLocal保证线程安全3.ThreadLocal和Synchronized的区别二、ThreadLocal原理1.Thread抽象内部结构2.ThreadLocal源码2.1Thread、ThreadLocal、ThreadLocalMap、En…...

分布式之PBFT算法

写在前面 在分布式之拜占庭问题 一文中我们分析了拜占庭问题,并一起看了支持拜占庭容错的口信消息性和签名消息性算法,但是这两种算法都有一个非常严重的问题,就是消息数量太多,通信的成本太大,消息数量复杂度为O(n ^…...

Linux 操作系统——查看/修改系统时区、时间、本地时间修改为UTC

文章目录1.背景描述2.知识储备3.解决步骤1. 查看当前时区2.修改设置Linux服务器时区3.复制相应的时区文件,替换系统时区文件;或者创建链接文件4. 查看和修改Linux的时间5. 硬件时间和系统时间的 相互同步1.背景描述 最近一个项目日期采用java8的LocalDa…...

CSS数据类型以及符号

css数据类型定义的是css属性中具有代表性的值&#xff0c;在规范的语法格式中&#xff0c;使用关键字外加一对 <和>表示&#xff0c;例如数值类型<number>、色值类型<color>等。 举个例子&#xff1a;background-image这个css属性语法结构如下&#xff1a; …...

LeetCode-54. 螺旋矩阵

题目来源 54. 螺旋矩阵 题目思路 while循环只遍历"环"&#xff0c;不成环就不遍历了 四个边界 上边界 top : 0下边界 bottom : matrix.length - 1左边界 left : 0右边界 right : matrix[0].length - 1 矩阵不一定是方阵 top < bottom && left < r…...

【Python入门第十八天】Python For 循环

Python For 循环 for 循环用于迭代序列&#xff08;即列表&#xff0c;元组&#xff0c;字典&#xff0c;集合或字符串&#xff09;。 这与其他编程语言中的 for 关键字不太相似&#xff0c;而是更像其他面向对象编程语言中的迭代器方法。 通过使用 for 循环&#xff0c;我们…...

Qt图片定时滚动播放器

目录参考结构PicturePlay.promain.cpppictureplay.hpictureplay.cpppictureplay.ui效果源码参考 Qt图片浏览器 QT制作一个图片播放器 Qt中自适应的labelpixmap充满窗口后&#xff0c;无法缩小只能放大 可以显示jpg、jpeg、png、bmp。可以从电脑上拖动图到窗口并显示出来或者打开…...

李宏毅2023春季机器学习课程

目录2021&2022课程重磅须知我维护的其他项目更新日志课程地址课程资料直链课程作业直链其他优质课程2021&2022课程 CSDN Github 重磅须知 为方便所有网课资料与优质电子书籍的实时更新维护&#xff0c;创建一个在线实时网盘文件夹&#xff1b;   网盘获取方式&#…...

计算机操作系统知识点汇总

计算机操作系统选择填空题&#xff0c;300知识点&#xff0c;包含操作系统概论、处理机管理、内存管理、设备管理、文件管理等&#xff0c;为大学生期末创造奇迹提供无限可能 1、填空题 1、操作系统是对计算机资源进行管理的软件 2、操作系统是提供了处理机管理、 存储器管理…...

【离线数仓-8-数据仓库开发DWD层设计要点-交易域相关事实表】

离线数仓-8-数据仓库开发DWD层设计要点-交易域相关事实表离线数仓-8-数据仓库开发DWD层设计要点-交易域相关事实表一、DWD层设计要点二、交易域相关事实表1.交易域加购事务事实表1.加购事务事实表 前期梳理2.加购事务事实表 DDL表设计分析3.加购事务事实表 加载数据分析1.首日全…...

计算机网络(七):DNS协议和原理,DNS为什么用UDP,网页解析的全过程

文章目录一、什么是DNS二、DNS的作用三、DNS作用四、DNS为什么用UDP五、如果打开一个网站很慢&#xff0c;要如何排查六、网页解析的全过程一、什么是DNS DNS是域名系统的英文缩写&#xff0c;是一种组织成域层次结构的计算机和网络服务命名系统&#xff0c;用于TCP/IP网络。 …...

算法23:多叉树_派对的最大快乐值

公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、 没有环的多叉树。树的头节点是公司唯一的老板。除老板之外的每个员工都有唯一的直接上级。 叶节点是没有任何下属的基层员工(subordinates列表为空)&#xff0c;除基层员工外&#xff0c;每…...

中国ETC行业市场规模及未来发展趋势

中国ETC行业市场规模及未来发展趋势编辑根据市场调研在线网发布的2023-2029年中国ETC行业发展策略分析及战略咨询研究报告分析&#xff1a;随着政府坚持实施绿色出行政策&#xff0c;ETC行业也受到了极大的支持。根据中国智能交通协会统计&#xff0c;2017年中国ETC行业市场规模…...

每日刷题(一)——只出现一次的数字

前言 今天遇到一个位运算的题目&#xff0c;感觉很有意思&#xff0c;记录一下。 Question1 136. 只出现一次的数字 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实…...

洛谷P5737 【深基7.例3】闰年展示 C语言/C++

【深基7.例3】闰年展示 题目描述 输入 x,yx,yx,y&#xff0c;输出 [x,y][x,y][x,y] 区间中闰年个数&#xff0c;并在下一行输出所有闰年年份数字&#xff0c;使用空格隔开。 输入格式 输入两个正整数 x,yx,yx,y&#xff0c;以空格隔开。 输出格式 第一行输出一个正整数&a…...

shell注释

注释对于任何编程语言都是不可忽视的重要组成部分&#xff0c;编写者通过注释来为其他人提供解释或提示&#xff0c;能有效提高代码的可读性。 Bash 同其他编程语言一样提供了两种类型注释的支持。 单行注释多行注释一、Bash 单行注释 在注释段落的开头使用 # &#xff0c;如下…...

【C++入门(上篇)】C++入门学习

前言&#xff1a; 在之前的学习中&#xff0c;我们已经对初阶数据结构进行相应了学习&#xff0c;加上之前C语言的学习功底。今天&#xff0c;我们将会踏上更高一级“台阶”的学习-----即C的学习&#xff01;&#xff01;&#xff01; 文章目录1.C 简介1.1什么是C1.2.C的发展史…...

【密码学】 一篇文章讲透数字签名

【密码学】 一篇文章讲透数字签名 数字签名介绍 数字签名&#xff08;又称公钥数字签名&#xff09;是只有信息的发送者才能产生的别人无法伪造的一段数字串&#xff0c;这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名…...

POI导入导出、EasyExcel批量导入和分页导出

文件导入导出POI、EasyExcel POI&#xff1a;消耗内存非常大&#xff0c;在线上发生过堆内存溢出OOM&#xff1b;在导出大数据量的记录的时候也会造成堆溢出甚至宕机&#xff0c;如果导入导出数据量小的话还是考虑的&#xff0c;下面简单介绍POI怎么使用 POI导入 首先拿到文…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...