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代码质量获得提升的关键一步。