面试题答案
一键面试设计思路
- 函数式编程优势运用:
- 纯函数:将复杂文本处理逻辑封装为纯函数,这样的函数无副作用,对于相同输入始终返回相同输出,便于测试和推理,也利于在并发环境中安全使用。例如,文本清洗、词频统计等操作都可以写成纯函数。
- 不可变数据:在处理数据时尽量使用不可变数据结构,如元组、frozenset等,避免数据在并发操作中意外修改导致的错误。
- 高阶函数:使用高阶函数来组合和管理并发任务,例如将处理单个文件的函数作为参数传递给一个负责并发调度的高阶函数。
- 结合asyncio库进行并发I/O操作:
- 异步函数定义:将文件读取操作定义为异步函数,使用
async def
关键字。asyncio
库允许在不阻塞主线程的情况下执行I/O操作,提高整体性能。 - 事件循环:使用
asyncio.get_event_loop()
获取事件循环,它负责调度和执行异步任务。 - 任务管理:使用
asyncio.create_task()
创建任务,将多个文件读取和处理任务添加到事件循环中并发执行。
- 异步函数定义:将文件读取操作定义为异步函数,使用
关键代码示例
import asyncio
import aiofiles
# 纯函数,用于文本处理,这里简单示例为统计单词数量
def process_text(text):
words = text.split()
return len(words)
# 异步函数,读取文件内容
async def read_file(file_path):
async with aiofiles.open(file_path, 'r', encoding='utf - 8') as f:
content = await f.read()
return process_text(content)
# 高阶函数,管理并发任务
async def process_files(file_paths):
tasks = [asyncio.create_task(read_file(file_path)) for file_path in file_paths]
results = await asyncio.gather(*tasks)
return results
if __name__ == '__main__':
file_paths = ['file1.txt', 'file2.txt', 'file3.txt']
loop = asyncio.get_event_loop()
try:
total_results = loop.run_until_complete(process_files(file_paths))
print(total_results)
finally:
loop.close()
在上述代码中:
process_text
是一个纯函数,用于处理文本。read_file
是异步函数,负责读取文件并调用纯函数process_text
处理文件内容。process_files
是高阶函数,它创建多个读取文件的异步任务并等待所有任务完成,收集结果。最后通过事件循环执行process_files
函数来完成对多个文件的并发读取和处理。