defdemo1(x, y, z):
product = -float('inf')
positions = ()
fori, v1 inenumerate(x):
forj, v2 inenumerate(y):
fork, v3 inenumerate(z):
t = v1*v2*v3
ift > product:
product = t
positions = (i, j, k)
return(product, positions)
仔细看上面的代码,虽然是Python的语法,但是整个代码散发着浓浓的C语言气息,换汤不换药啊。
仔细分析题意,大概可以知道,因为是乘法运算,所以从每个列表中选择最大数再相乘,应该也是符合题意的,于是编写代码如下:
# 利用Python内置函数和列表对象方法
defdemo2(x, y, z):
i = max(x)
iPos = x.index(i)
j = max(y)
jPos = y.index(j)
k = max(z)
kPos = z.index(k)
return(i*j*k, (iPos, jPos, kPos))
但是,上面的代码看上去还是很笨啊,傻傻的样子,并且和第一段代码一样不灵活,难道就没有更好的办法吗?
# 利用Python函数式编程特点
defdemo3(lst):
maxValues = tuple(map(max, lst))
f =lambdalst, item: lst.index(item)
positions = tuple(map(f, lst, maxValues))
product = eval('*'.join(map(str, maxValues)))
return(product, positions)
上面的代码减少了很多限制,比如可以处理3个以上的列表,对客户的需求改动不敏感。
那么,上面的几段代码是否等价呢,让我们用测试代码来说话,直接测试一亿次吧。注意第三个函数的调用方式与前两个略有区别。
# 测试代码,运行一亿次
fori inrange(10**8):
m = randrange(1, 30)
n = 3
x, y, z = getData(m, n)
if not(demo1(x,y,z) == demo2(x,y,z) == demo3((x,y,z))):
print(x,y,z)
把上面的代码整合到一起运行一下,没有任何输出,说明三个函数功能等价。