【面试题】Python软件工程师能力评估试题(一)

news/2025/2/12 3:41:28/

文章目录

  • 前言
  • 应试者需知
  • (一)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 语言基础能力评估的展示啦,希望能够帮到大家,感谢大家的支持。再次声明,笔者的代码仅作参考。


http://www.ppmy.cn/news/32788.html

相关文章

5 全面认识java的控制流程

全面认识java控制流程1.块作用域2.条件语句3.迭代语句3.1while语句3.2do-while语句3.3for语句3.4 for-in语法4.中断控制流程的语句4.1 return4.2 break和continue4.2.1 不带标签的break语句4.2.2 带标签的break语句4.2.3 continue语句4.3 goto()5.多重选择:switch语句1.块作用域…

小米10s格机修复 nv报错案例解析 关于基带分区的一些常识

前面分享过几期关于基带 diag端口与qcn相关的几篇帖子。其中一位粉丝朋友联系我。他的机型因为误格机导致手机进不去系统,反复进入官方rec报错nv损坏。进不去系统。 有兴趣的朋友可以参阅我的几个帖子,只是个人的一些片面理解。 基带相关贴; 安卓玩机…

进程跟线程的区别

进程跟线程的区别 文章目录进程跟线程的区别前言一.什么线程二.线程与进程的联系三.线程与进程有什么不同前言 现代所有计算机都能同时做几件事情,当一个用户程序正在运行时,计算机还能同时读取磁盘,并向屏幕打印输出正文.在一个多道操作程序中,cpu由一道程序向另外一道程的切…

【HTML系列】前章 · HTML前序知识

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

L2-022 重排链表 L2-002 链表去重

给定一个单链表 L1 →L2→⋯→L n−1 →L n ,请编写程序将链表重新排列为 L n →L 1 →L n−1 →L 2 →⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。 输入格式: 每个输入包含1个测试用例。每个测试用例第1行…

33个非常实用的JavaScript一行代码

一、日期处理 1. 检察日期是否有效 该方法用于检测给出的日期是否有效: const isDateValid (...val) > !Number.isNaN(new Date(...val).valueOf());isDateValid("December 17, 1995 03:24:00"); // true2. 计算两个日期之间的间隔 该方法用于计…

关于利用FFT分析时域信号幅相的思考与验证

引言 利用FFT分析/估计时域信号的幅度和相位,属于传统估计的范畴。估计的准确程度受频率分辨率的影响较大。如果被估计的目标频率等于频率分辨率的整数倍,信号的幅相估计都是最准确的。一旦目标频率不等于频率分辨率的整数倍,幅度估计值将会…

《Netty》从零开始学netty源码(八)之NioEventLoop.selector

目录java原生的WEPollSelectorImplnetty的SelectionKey容器SelectedSelectionKeySetnetty的SelectedSelectionKeySetSelectorSelectorTupleopenSelector每一个NioEventLoop配一个选择器Selector,在创建NioEventLoop的构造函数中会调用其自身方法openSelector获取sel…