该守则由三个功能组成:
守则如下:
def span_vector(n):
'''n represents dimension of the vector.'''
return [random.randrange(-1000,1000) for x in range(n)]
def span_orthogonal(vec):
'''vec represents n-dimensional vector'''
'''Function spans an arbitrary vector that is orthogonal to vec'''
dimension = len(vec)
orthogonal_vec = []
for k in range(dimension-1):
orthogonal_vec.append(random.randrange(-1000,1000))
last_k = ((-1)*sum([vec[x]*orthogonal_vec[x] for x in range(dimension-1)]))/vec[-1]
orthogonal_vec.append(last_k)
return orthogonal_vec
def cross_product(v1,v2):
return sum(v1[x]*v2[x] for x in range(len(v1)))还有什么可以改进的?
编辑最后一个函数必须读取dot_product,而不是cross_product。我犯了一个错。
发布于 2019-09-18 13:49:41
您可能应该使用Numpy,尽管我对您的情况还不太了解,无法进一步发表评论。
假设您需要保留“纯Python",则可以进行以下改进:
将(-1)*替换为-
将for k in range(dimension-1):循环替换为
orthogonal_vec = [
random.randrange(-1000,1000)
for _ in range(dimension-1)
]n: int,vec: typing.Sequence[float] (可能)。前两个函数返回-> typing.List[float]。cross_product既接受又返回float。
sum([ ... ])不应该使用内部列表。只需将生成器直接传递给sum即可。
发布于 2019-09-18 14:48:05
这只是@莱因德林已经写过的关于您的代码的一个小小的观察。
编写函数文档,就像您用
def span_orthogonal(vec):
'''vec represents n-dimensional vector'''
'''Function spans an arbitrary vector that is orthogonal to vec'''不像预期的那样工作。
如果你使用help(span_orthogonal),你会看到
Help on function span_orthogonal in module __main__:
span_orthogonal(vec)
vec represents n-dimensional vector原因是只有第一个文本块被解释为文档。另外,通常的惯例是编写“反向”的文档,我的意思是首先对您的函数做一个简短的总结,而不是继续提供诸如预期输入之类的细节。这两个方面也可以在臭名昭著的官方Python代码样式指南 (又名PEP 8)的文档字符串一节中找到。
使用
def span_orthogonal(vec):
'''Function spans an arbitrary vector that is orthogonal to vec
vec represents n-dimensional vector
'''打电话给help(...)
Help on function span_orthogonal in module __main__:
span_orthogonal(vec)
Function spans an arbitrary vector that is orthogonal to vec
vec represents n-dimensional vector另外,由于@Reinderien也暗示您要使用numpy,所以让我告诉您,在科学Python堆栈中也经常使用“特殊”文档惯例(又名农比多)。
举个例子:
def span_orthogonal(vec):
'''Function spans an arbitrary vector that is orthogonal to vec
Parameters
----------
vec : array_like
represents n-dimensional vector
'''这种样式更接近于当前Python版本中的类型提示,因为它更结构化。numpydoc背后的想法是使用像狮身人面像这样的工具来促进自动文档生成,但这有点超出了我在这里试图传达的内容。
发布于 2019-09-18 17:38:20
除了前面提到的@Reinderein和@AlexV之外,您还可以在代码中添加以下内容,以提供一个完整的可运行示例:
在顶端:
import random在他的底部,就像:
def main():
v1 = span_vector(3)
v2 = span_orthogonal(v1)
print(v1)
print(v2)
print(cross_product(v1,v2))
if __name__ == '__main__':
main()对于1000's (在-1000中),您可以使用一个“常量”:
MAX_COOR_VAL = 1000(cross)dot_product(v1,v2)的定义可以更清晰一些,与span_orthogonal(vec)更一致:
def dot_product(vec1, vec2):方法span_orthogonal(vec)不是防弹的,当vec等于[1,0]时,它可能会导致ZeroDivisionError异常,而orthogonal_vec的随机创建恰好是[1] (或[2])。
https://codereview.stackexchange.com/questions/229244
复制相似问题