当前位置: 首页 > news >正文

AI编程方法第六弹:高效编码离不开编程者经验引导

虽然AI编程工具可以提供快速的代码实现,但是在方法实现上往往并不完全符合我们的预期,甚至可能会使用一些非常原始低效的方式来完成。因此,合理的引导提示AI编程工具进行编程,才能写出更为合理高效的代码,这在一定程度上也说明AI编程并不意味着编程人员无需再学习编程,相反,熟练的编程人员才会更好的引导AI快速实现高效的代码。

下面以一个例子来做说明。比如基于NumPy编写代码,允许用户连续输入一组数据,以0结束,找到平均值最大的连续三个数值,比如输入为:
1,2,3,37,56,23,17,20,30,0 这几个数
输出为:
37,56,23

首先进行的AI编程提示为:

允许用户连续输入一组数据,以0结束,找到平均值最大的连续三个数值,比如输入为:
1,2,3,37,56,23,17,20,30,0 这几个数
输出为:
37,56,23(请使用Python和NumPy完成)

得到的初始代码可能为:

import numpy as npdef find_max_avg_triplet():# 读取输入数据,直到遇到0为止input_data = []while True:num = int(input("请输入一个数字(输入0结束): "))if num == 0:breakinput_data.append(num)if len(input_data) < 3:print("输入的数字不足三个,无法计算。")return# 转换为NumPy数组arr = np.array(input_data)# 初始化最大平均值和对应的索引max_avg = -np.infmax_indices = (0, 1, 2)# 滑动窗口计算每个连续三个数的平均值for i in range(len(arr) - 2):current_triplet = arr[i:i+3]current_avg = np.mean(current_triplet)if current_avg > max_avg:max_avg = current_avgmax_indices = (i, i+1, i+2)# 输出结果result = arr[max_indices[0]:max_indices[2]+1]print("平均值最大的连续三个数值是:", ','.join(map(str, result)))# 调用函数
find_max_avg_triplet()

该代码虽然功能正确,但是在实现上非常原始,没有充分利用NumPy序列的集合式处理优势。如果觉得代码啰嗦,简单的限制代码函数并不一定能实现预期目标。如再次AI编程提示为:

压缩代码控制在10行内

得到的代码为:

import numpy as npdef find_max_avg_triplet():input_data = []while (num := int(input("请输入一个数字(输入0结束): "))) != 0: input_data.append(num)if len(input_data) < 3: return print("输入的数字不足三个,无法计算。")arr = np.array(input_data)max_avg, max_indices = -np.inf, (0, 1, 2)for i in range(len(arr) - 2):if (current_avg := np.mean(arr[i:i+3])) > max_avg: max_avg, max_indices = current_avg, (i, i+1, i+2)print("平均值最大的连续三个数值是:", ','.join(map(str, arr[max_indices[0]:max_indices[2]+1])))find_max_avg_triplet()

该代码相较于以前,确实已有改进,采用了滑窗切片的for循环实现了有效的简化处理,但是其自动去除了连续输入的功能,后期还需要自己替换上去。但是,其核心处理序列的代码是否能更突出NumPy编程特点?

此时,如果自己对该类序列处理有经验,可以明确的引导AI编程工具按照自己指定的思路来完成,如AI编程提示为:

可以考虑不要使用循环,利用每三个切片的滑窗,通过集合式整体处理获取对应每三个切片元素的平均值形成一个array,再利用寻找最大值对应的序号来确定原始三个元素的内容

得到的代码为:

import numpy as npdef find_max_average_triplet(arr):# 将输入转换为numpy数组以便高效处理arr = np.array(arr)# 计算滑动窗口的平均值# 使用卷积来高效计算滑动窗口的和,然后除以窗口大小window_size = 3# 使用valid模式,确保窗口不超出边界sums = np.convolve(arr, np.ones(window_size), mode='valid')averages = sums / window_size# 找到最大平均值的索引max_avg_index = np.argmax(averages)# 对应的原始三个元素triplet = arr[max_avg_index:max_avg_index + window_size]return triplet, averages[max_avg_index]# 示例使用
if __name__ == "__main__":example_array = [1, 3, 5, 7, 9, 2, 4, 6, 8]triplet, max_avg = find_max_average_triplet(example_array)print(f"原始数组: {example_array}")print(f"平均值最大的三个连续元素: {triplet}, 平均值: {max_avg}")

如果觉得不必如此复杂,可以要求简化不必要的语句,再次增加调整提示:

请不要使用函数,去除main代码

得到的代码为:

import numpy as np# 示例数组
example_array = [1, 3, 5, 7, 9, 2, 4, 6, 8]# 将输入转换为numpy数组以便高效处理
arr = np.array(example_array)# 计算滑动窗口的平均值
window_size = 3
sums = np.convolve(arr, np.ones(window_size), mode='valid')
averages = sums / window_size# 找到最大平均值的索引
max_avg_index = np.argmax(averages)# 对应的原始三个元素
triplet = arr[max_avg_index:max_avg_index + window_size]# 输出结果
print(f"原始数组: {example_array}")
print(f"平均值最大的三个连续元素: {triplet}, 平均值: {averages[max_avg_index]}")

这次我们会发现AI灵巧的使用了一个NumPy的卷积函数convolve,自动实现了for循环的滑窗切片,具体对该函数的了解可以直接询问AI。

即使此时不想使用这个convolve函数,也可以再次要求AI编程:

能否不使用convolve函数实现相同的效果

得到的代码为:

import numpy as np# 示例数组
example_array = [1, 3, 5, 7, 9, 2, 4, 6, 8]# 将输入转换为numpy数组以便高效处理
arr = np.array(example_array)# 窗口大小
window_size = 3# 使用列表推导式初始化滑动窗口的和数组
sums = [np.sum(arr[i:i + window_size]) for i in range(len(arr) - window_size + 1)]# 计算平均值
averages = np.array(sums) / window_size# 找到最大平均值的索引
max_avg_index = np.argmax(averages)# 对应的原始三个元素
triplet = arr[max_avg_index:max_avg_index + window_size]# 输出结果
print(f"原始数组: {example_array}")
print(f"平均值最大的三个连续元素: {triplet}, 平均值: {averages[max_avg_index]}")

到此,相关代码已经非常简洁,使用的函数也比较常见,可以符合绝大多数普通练习的要求。从中可以看出,编程人员的准确引导是初始AI代码质量获得提升的关键一步。

相关文章:

  • 设计看似完美却测不过? Intra-Pair Skew 是「讯号完整性(Signal Integrity)」里最隐形的杀手
  • venv环境基础指令以及常见问题汇总(持续更新)
  • 《AI大模型趣味实战》智能Agent和MCP协议的应用实例:搭建一个能阅读DOC文件并实时显示润色改写过程的Python Flask应用
  • WPF之项目创建
  • Rule.resource作用说明
  • 安装docker,在docker上安装mysql,docker上安装nginx
  • 微信小程序,基于uni-app的轮播图制作,调用文件中图片
  • 加里·基尔代尔:CP/M之父与个人计算时代的先驱
  • 线程池(六):ThreadLocal相关知识详解
  • 移除元素(简单)
  • 游戏引擎学习第246天:将 Worker 上下文移到主线程创建
  • C语言中结构体的字节对齐的应用
  • WPF与C++ 动态库交互
  • 【网络安全】用 Linux 命令行 CLI 日志文件处理指南
  • 在springboot项目中,如何进行excel表格的导入导出功能?
  • 从OpenAI收购实时数据引擎揭示AI数据库进化方向
  • django之优化分页功能(利用参数共存及封装来实现)
  • 【Linux】Centos7 安装 Docker 详细教程
  • 5.3/Q1,GBD数据库最新文章解读
  • MySQL多查询条件下深度分页性能优化技巧及示例总结
  • 上海第三家“胖永辉”在浦东开业,设立了外贸产品专区
  • 国家发改委:建立实施育儿补贴制度
  • 央行副行长:我们在研究丰富政策工具箱,将适时推出增量政策
  • 一季度全国城镇新增就业308万人
  • 美国政府将暂时恢复部分受影响留学生的合法身份,并将制订新标准
  • 我国对国家发展规划专门立法