文章目录
前言
🌰 大家好,我是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 语言基础能力评估的展示啦,希望能够帮到大家,感谢大家的支持。再次声明,笔者的代码仅作参考。