【面试题】Python软件工程师能力评估试题(一)
文章目录
- 前言
- 应试者需知
- (一)Python 语言基础能力评估
- 1、理解问题并完成代码:
- 2、阅读理解代码,并在空白处补充完整代码:
- 3、编写一个装饰器:exposer
- 4、阅读代码并在空白处补充完整代码:
- 5、自行用Python代码实现一个简单的.ini配置文件解析类:
- 结语
前言
🌰 大家好,我是writer桑。这是自己整理的 Python 真实的面试题,分享出来一起学习。本章内容展示的是试题的第一部分: Python 语言基础能力评估。未经作者允许禁止转载。附上笔者的代码,并非标准答案,仅供参考,如有不同的见解欢迎私信评论区讨论。
应试者需知
1、本能力评估试题旨在全面评估Python软件工程师的知识结构和技能水平,试题会涵盖Python语言的基础知识、Linux操作系统常识、Linux Shell命令、计算机网络知识、Web前/后端开发相关的知识等多个维度。
一些试题因应试者的知识/经验没有涵盖到而无法作答属于正常现象,作答时请不要困扰于自己能力范围之外的问题而影响其它试题作答、进而影响能力评估结果和影响自己的信心。无法作答的问题应直接跳过(不要勉强)【能答对30% - 50%的试题属于正常水平】
2、认真阅读试题所提出的问题、仔细分析试题所描述的上下文内容(包括代码上下文、代码内的注释提示),尽自己的能力去理解和分析,不会有考官对问题进行另行解释。
3、作答时间60分钟,请恪守诚信、不要舞弊;本考试仅作为一种能力评估手段,每个试题/填空没有定量评分,请不要主观猜测试题的分值比重及其对考核成绩的占比。
(一)Python 语言基础能力评估
1、理解问题并完成代码:
代码示例:
def roution(arg1, *args, **kwargs):print(arg1)print(args)print(kwargs)# 以主进程的方式运行
if __name__ == "__main__":roution("value1", "value2",3,extra_args = "hello,world")
运行结果:

补充说明: 直接使用 print 输出函数进行输出即可。
2、阅读理解代码,并在空白处补充完整代码:
代码示例:
import inspect
import typing
from typing import Callable, List def parse_func_args(func: Callable): # 判断参数func是否为可调用对象 result = {} # 判断函数是否为异步调用if inspect.isasyncgenfunction(func):result["async_call"] = True else: result["async_call"] = False result["func"] = func result["doc"] = inspect.getdoc(func) # 获取可调用对象的文档字符串 sign = inspect.signature(func) # signature 函数获取函数的签名对象,包括参数信息。pos_args = [] kw_args = [] result["pos_args"] = pos_argsresult["kw_args"] = kw_args for param in sign.parameters.values():if param.name == "check_list" or param.name == "result_list": continue # 开始判断每个param参数的属性item = {"name": param.name} if param.default is not inspect._empty:item["optional"] = True else: item["optional"] = Falseif param.annotation is inspect._empty:item["type"] = str # 补充代码检查参数是否为str, int, float, bool 类型: elif param.annotation is str:item["type"] = strelif param.annotation is int:item["type"] = intelif param.annotation is float:item["type"] = floatelif param.annotation is bool:item["type"] = boolelif param.annotation is list or param.annotation is typing.List[str]:item["type"] = listelse:item["type"] = str # defaultif param.kind == inspect.Parameter.POSITIONAL_ONLY or \param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD:result["pos_args"].append(item)else:result["kw_args"].append(item)return result def func(num1: str, num2: int):return num1 * num2 # 以主进程的方式运行
if __name__ == "__main__":func("123",11)result = parse_func_args(func)print(result)
运行结果:

补充说明: 原题中关于位置参数、关键字参数的描述不是很合理,麻烦大家自行甄别。上例中笔者写的代码也不是很好,仅作参考。
3、编写一个装饰器:exposer
代码示例:
def exposer(a_func):def write_key(self, key):global_table[key] = selfreturn a_func(self)return write_key# 假设有一个全局的Dict对象 “global_table”
global_table = {} #编写的装饰器可用于任何自定义类的__init__方法装饰,如下:
class AnyType: @exposerdef __init__(self):pass#被装饰过的类在构造时,用户可指定一个名为 “key” 的参数;
#此时,新建的对象将以该key为索引,记录在全局Dict对象“global_table”中。
object1 = AnyType(key = "id001")
object2 = AnyType(key = "id002")print(global_table)
# 此时,global_table的内容将记录为:
# { “id001”: object1, “id002”: object2 }
运行结果:

补充说明: 装饰器的写法有很多,不止上例的一种。若有更好的写法,欢迎评论区或者私信讨论。
4、阅读代码并在空白处补充完整代码:
代码示例:
import asyncio
msg_queue = []msg_lock = asyncio.Lock() # 定义消息队列的锁
signal_event = asyncio.Event() # 定义信号事件async def backend_task():try:for counter in range(0,1000):async with msg_lock: # 在访问msg_queue之前先获得锁msg_queue.append(f"msg{counter}")signal_event.set() # 设置信号事件,通知main函数可以取出消息了await asyncio.sleep(0.5)except asyncio.CancelledError: # 处理任务被取消的异常print("后台任务被取消!")returnexcept Exception as e: # 处理其他未知异常print("未知异常!")returnasync def main():task = asyncio.create_task(backend_task())try:await signal_event.wait() # 等待信号事件async with msg_lock: # 在访问msg_queue之前先获得锁msg = msg_queue.pop()print(f"获取到后台任务的通知消息 {msg}")except Exception: # 处理异常print("异常!正在停止后台任务…")task.cancel() # 取消后台任务await task # 等待后台任务结束loop = asyncio.get_event_loop()try:loop.run_until_complete(main())
finally:loop.close() # 关闭事件循环
运行结果:

补充说明: 此题考查的是 python 中的 asyncio 模块,需要对 asyncio 模块中的锁和事件的应用有一定的掌握程度。
5、自行用Python代码实现一个简单的.ini配置文件解析类:
代码示例:
import configparser# 一个简单的.ini配置文件解析类
class IniClass:def analysis_method():# 实例化一个 ConfigParser 实例 config = configparser.ConfigParser() # 打开 ini 文件 config.read("./cfg.ini", encoding = "utf-8")# 获取所有的 section print(config.sections())# ['SectionName', 'Section2']# 指定section的所有parameter print(config["Section2"])# 指定section输出value值print(config["Section2"].values())# 指定section以item的形式输出print(config["Section2"].items())# 以主进程的方式运行
if __name__ == "__main__": IniClass.analysis_method()
ini 文件的内容:(文件名为 cfg)

运行结果:

补充说明: 解析 .ini 文件可以使用 python 中的 configparser 库,这个库用法很多,并不局限于上例。
结语
🌱 以上就是 Python 语言基础能力评估的展示啦,希望能够帮到大家,感谢大家的支持。再次声明,笔者的代码仅作参考。
相关文章:
【面试题】Python软件工程师能力评估试题(一)
文章目录前言应试者需知(一)Python 语言基础能力评估1、理解问题并完成代码:2、阅读理解代码,并在空白处补充完整代码:3、编写一个装饰器:exposer4、阅读代码并在空白处补充完整代码:5、自行用P…...
Java八股文(Java多线程面试题)
并行和并发的区别?(1)并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生;(2)并行是在不同实体上的多个事件,并发是在同一实体上的多个事件&#…...
小程序当前页面如何分享别的页面内容呢?
需求分析 因为功能的需要分为两点 他需要调转转发,并且有首页转发点击button按钮进行转发邀请好友帮忙助力,如何做到一个页面多种转发 如何区分,是button转发还剩右上角三个点转发呢? 通过onShareAppMessage()这个函数的事件…...
编写Java哪个编译器好
现在能够编写Java代码的工具简直不要太多,各种各样五花八门,但目前效率最高的还是Intellij Idea。但这个工具对于完全零基础的小白来说,第一次用起来是比较复杂的,因为它的功能太多了。这就好比你要学开车,如果上来就给…...
第十六章 Java为什么使用序列化
为何要指定serialVersionUID的值如果不指定显示serialVersionUID的值,jvm在序列化时会自动生成一个serialVersionUID,跟属性一起序列化,再进行持久化或者网络传输,在反序列化时,jvm会根据属性自动生成一个新版的serial…...
28岁小公司程序员,无车无房不敢结婚,要不要转行?
大家好,这里是程序员晚枫,又来分享程序员的职场故事了~ 今天分享的这位朋友叫小青,我认识他2年多了。以前从事的是土木行业,2年前找我咨询转行程序员的学习路线和职业规划后,通过自学加入了一家创业公司,成…...
出道即封神的ChatGPT,现在怎么样了?
从互联网的普及到智能手机,都让广袤的世界触手而及,如今身在浪潮中的我们,已深知其力。前阵子爆火的ChatGPT,不少人保持观望态度。现如今,国内关于ChatGPT的各大社群讨论,似乎沉寂了不少,现在怎…...
【计算机视觉】CNN 可视化算法
文章目录一、CAM算法1.1 概述1.2 CAM算法介绍二、Grad-CAM算法2.1 概述2.2 Guided Backpropagation2.3 Occlusion Sensitivity2.4 Grad-CAM 整体结构和效果2.5 Grad-CAM 实现细节一、CAM算法 1.1 概述 本文介绍 2016 年提出的 CAM (Class Activation Mapping) 算法࿰…...
自动抓取服务器巡检、登录、执行命令记录+备份脚本
文章目录 引抓取【巡检日志】语言&时区设置语言设置时区巡检脚本执行效果抓取【登录信息】登录脚本登录脚本低版本的last命令执行效果抓取【history记录】说明配置history授权日志文件显示时间戳持久化到日志未配置history的配置过history的执行脚本执行脚本...
如何用Python求解微分方程组
文章目录odeint简介示例odeint简介 scipy文档中将odeint函数和ode, comples_ode这两个类称为旧API,是scipy早期使用的微分方程求解器,但由于是Fortran实现的,尽管使用起来并不方便,但速度没得说,所以有的时候还挺推荐…...
【微信小程序】-- 自定义组件 - behaviors(三十九)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
【微信小程序】-- 自定义组件 - 父子组件之间的通信(三十八)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
Java Web 实战 11 - 多线程进阶之常见的锁策略
常见的锁策略常见的锁策略1. 乐观锁 VS 悲观锁2. 普通的互斥锁 VS 读写锁3. 重量级锁 VS 轻量级锁4. 自旋锁 VS 挂起等待锁5. 公平锁 VS 非公平锁6. 可重入锁 vs 不可重入锁7. 常见面试题大家好 , 这篇文章给大家带来的是多线程中常见的锁策略 , 我们会给大家讲解 6 种类别的锁…...
(20)目标检测算法之YOLOv5计算预选框、详解anchor计算
目标检测算法之YOLOv5计算预选框、详解anchor计算 单节段目标检测算法中:预选框的设定直接影响最终的检测精度众所周知,yolov5中采用自适应调整预选框anchor的大小,但万事开头难,配置文件config中的预设还是很重要yolo算法作为on…...
3-1 SpringCloud快速开发入门: Ribbon 是什么
接上一章节Eureka 服务注册中心自我保护机制,这里讲讲Ribbon 是什么 Ribbon 是什么 通常说的负载均衡是指将一个请求均匀地分摊到不同的节点单元上执行,负载均和分为硬件负载均衡和软件负载均衡: **硬件负载均衡:**比如 F5、深信…...
Java【lambda表达式】语法及使用方式介绍
相关文章目录 第一篇: Java【EE初阶】进程相关知识 进程管理 内存管理 文章目录相关文章目录前言一、lambda表达式 是什么?1, lambda表达式 的背景2, 什么是 函数式接口3, lambda表达式 的语法二、lambda表达式 的使用方式1, 无参无返回值2, 有一个参…...
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(2)
目录 写在前面: 题目:94. 递归实现排列型枚举 - AcWing题库 读题: 输入格式: 输出格式: 数据范围: 输入样例: 输出样例: 解题思路: 代码: AC &…...
‘conda‘不是内部或外部命令,也不是可运行的程序或批处理文件。
Anaconda环境搭建常见问题 conda不是内部或外部命令,也不是可运行的程序或批处理文件。 解决方案:配置环境变量 1.找到Anaconda Nvaigator单机右键 2.更多 3.打开文件所在位置 4.继续Anaconda Nvaigator单机右键,更多,选择文件…...
HTTP 3.0来了,UDP取代TCP成为基础协议,TCP究竟输在哪里?
TCP 是 Internet 上使用和部署最广泛的协议之一,多年来一直被视为网络基石,随着HTTP/3正式被标准化,QUIC协议成功“上位”,UDP“取代”TCP成为基础协议,TCP究竟“输”在哪里? HTTP/3 采用了谷歌多年探索的基…...
《JavaCV从入门到实战教程合集》介绍和目录
前言 《JavaCV从入门到实战教程合集》是2016年《JavaCV开发实战教程》和2018年《JavaCV入门教程》2022年《JavaCV音视频实战宝典》三合一汇总合集,完整包含JavaCV入门教程》、《JavaCV开发实战教程》系列和《JavaCV音视频实战宝典》系列所有付费内容。 《JavaCV入…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...









