假设我有一个
class Rectangle(object):
def __init__(self, length, width, height=0):
self.l = length
self.w = width
self.h = height
if not self.h:
self.a = self.l * self.w
else:
from itertools import combinations
args = [self.l, self.w, self.h]
self.a = sum(x*y for x,y in combinations(args, 2)) * 2
# original code:
# (self.l * self.w * 2) + \
# (self.l * self.h * 2) + \
# (self.w * self.h * 2)
self.v = self.l * self.w * self.h
第12行的每个人都有什么看法?
self.a = sum(x*y for x,y in combinations(args, 2)) * 2
我听说应该避免显式列表索引引用。
是否有一个我可以使用的函数,如 sum()
,但仅用于乘法?
感谢大家的帮助。
答案 0 :(得分:10)
我认为在这里使用索引没有任何问题:
sum([x[0] * x[1] for x in combinations(args, 2)])
如果你真的想避开它们,你可以这样做:
sum([x*y for x,y in combinations(args, 2)])
但是,说实话,我更喜欢你注释掉的版本。它清晰,可读,更明确。如上面的三个变量一样,你并没有真正获得太多收益。
我可以使用的函数就像sum(),但仅适用于 乘法?
内置?不。但您可以通过以下方式获得该功能:
In : a=[1,2,3,4,5,6]
In : from operator import mul
In : reduce(mul,a)
Out: 720
答案 1 :(得分:3)
或者你可以使用
np.sum(np.prod(x) for x in combinations(args, 2))
'np.prod'可以将列表和元组作为参数。它会返回您想要的产品。
答案 2 :(得分:2)
由于这是Google的最佳搜索结果,因此我将仅添加自python 3.8以来的内容:
from math import prod
t = (5, 10)
l = [2, 100]
prod(t) # 50
prod(l) # 200
答案 3 :(得分:1)
你可以这样做:
from operator import mul
sum(reduce(mul,combinations(args, 2)))
但我认为它只会降低可读性。
但是,在总结之前,您实际上正在构建乘法列表sum([...])
。
self.a = sum([(x[0] * x[1] * 2) for x in combinations(args, 2)])
这不是必需的,只需:
self.a = sum(x * y * 2 for x,y in combinations(args, 2))
答案 4 :(得分:0)
我确实对产品做了一个非常简单的定义;有助于“计算元组的乘积”
def product(tuple1):
"""Calculates the product of a tuple"""
prod = 1
for x in tuple1:
prod = prod * x
return prod
可能是一种更优雅的方式,但这似乎工作正常。据推测,它也可以在列表中工作。