zl程序教程

您现在的位置是:首页 >  Python

当前栏目

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

2023-04-18 14:14:57 时间

前言

🌰 大家好,我是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_args
    result["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"] = False

        if param.annotation is inspect._empty:
            item["type"] = str 

        # 补充代码检查参数是否为str, int, float, bool 类型: 
        elif param.annotation is str:
            item["type"] = str
        elif param.annotation is int:
            item["type"] = int
        elif param.annotation is float:
            item["type"] = float
        elif param.annotation is bool:
            item["type"] = bool
        elif param.annotation is list or param.annotation is typing.List[str]:
            item["type"] = list
        else:
            item["type"] = str              # default

        if 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] = self
        return a_func(self)
    return write_key

# 假设有一个全局的Dict对象 “global_table”
global_table = {} 

#编写的装饰器可用于任何自定义类的__init__方法装饰,如下: 
class AnyType: 
    @exposer
    def __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("后台任务被取消!")
        return
    except Exception as e: # 处理其他未知异常
        print("未知异常!")
        return
    
async 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 语言基础能力评估的展示啦,希望能够帮到大家,感谢大家的支持。再次声明,笔者的代码仅作参考。