最简单的方法是像跟踪当前最大值一样跟踪值:
定义 f(x,y,z):
最大值 = 0
对于 x 中的 a:
对于 y 中的 b:
对于 z 中的 c:
如果 a*b*c > 最大值:
最大值 = a*b*c
a_max = a
b_max = b
c_max = c
打印(a_max,b_max,c_max)
打印(最大)
您可以通过使用不同于一开始设置maximum = 0 的技术来使您的代码更加健壮。例如,如果您的列表只有负数怎么办?结果将是错误的。您可以使用所谓的标记值(如None)来指示第一次迭代。哨兵是指示“无效”值的标记。这将确保始终找到正确的最大值:
定义 f(x,y,z):
最大值 =
无
对于 x 中的 a:
对于 y 中的 b:
对于 z 中的 c:
如果
最大值为无 或 a*b*c > 最大值:
最大值 = a*b*c
abc_max = (a, b, c)
打印 (
*abc_max, sep=', ')
打印(最大)
您可以通过返回您感兴趣的数字来改进您的代码设计,而不仅仅是打印它们。这将允许您以任何您想要的方式操作它们,包括在之后打印它们。 Python 允许使用元组返回多个值,因此您可以执行以下操作:
定义 f(x,y,z):
最大值 = 无
对于 x 中的 a:
对于 y 中的 b:
对于 z 中的 c:
如果最大值为无或 a*b*c > 最大值:
最大值 = a*b*c
abc_max = (a, b, c)
返回最大值,abc_max
最大值, pqr = f(p, q, r)
打印(*pqr, sep=', ')
打印(最大)
您可能要考虑的优化不是多次评估您的“功能”。这对于不两次返回相同值的更复杂的情况和函数尤其重要。您可以将 if 块的开头替换为类似
...
current_value = a * b * c
if current_value > maximum:
maximum = current_value
...
如果你真的有兴趣在任意函数上进行这项工作,你可以使用 Python 来做到这一点。函数是对象,可以像列表、数字和字符串一样传递:
定义 f(
fn, x, y, z):
最大值 = 无
对于 x 中的 a:
对于 y 中的 b:
对于 z 中的 c:
当前 =
fn(a, b, c)
如果最大值为无或当前 > 最大值:
最大值 = 当前
abc_max = (a, b, c)
返回最大值,abc_max
最大值, pqr = f(
λ x, y, z: x * y * z, p, q, r)
如果您对进一步的概括感兴趣,可以查看itertools,它具有函数product,用于运行嵌套for 循环的“扁平化”版本。这将允许您接受任意数量的输入迭代,而不仅仅是三个。 Python 允许在参数列表中使用* 任意数量的位置参数。名称中带有* 的参数将是所有剩余位置参数的元组。它也可以在 lambda 中使用:
从 functools 导入减少
从 itertools 导入产品
从操作员导入 mul
def f(fn, *iterables):
max_values = max(product(*iterables), key=lambda x: fn(*x))
返回 fn(*max_values), max_values
最大值, pqr = f(lambda *args: reduce(mul, args), p, q, r)
您可以考虑添加一个比较器来做一些除了计算最大值之外的事情。但是,这实际上是多余的,因为您可以使用正确实现的fn 将任何其他操作转换为最大计算量。这与根据键而不是比较器实现 Python 排序函数的逻辑相同。在上面的示例中,您可以通过翻转键的符号来找到最小值:lambda *args: -reduce(mul, args)。您可以使用lambda *args: -abs(sum(args) - reduce(mul, args)) 之类的内容找到乘积最接近其总和的组合。可能性是巨大的。
这里是一个 IDEOne 示例的链接,该示例演示了上面显示的最后一个版本:https://ideone.com/QNj55T。 IDEOne 是一个用于炫耀或测试小型 sn-ps 的便捷工具。我与它没有从属关系,但我经常使用它。