尝试编写我在Python中使用的Matlab脚本。首先,我必须做一个点积,我想测试,以确保它的工作。机械工程师,而不是软件,所以我因缺乏专业知识而受阻。
import operator
def dot( vector1, vector2 ):
dp = sum(map( operator.mul, vector1, vector2))
return dp
所以,首先我设置我的功能。然后,我必须调用我的功能,对吧?像这样:
if __name__ == "__main__":
import sys
#dp = dot([2,5],[10,2])
dp = dot(int(sys.argv[1]),int(sys.argv[2]))
print dp
我试图通过以下方式运行:
python dot.py [1,3] [3,1]
我可以想到int([1,3])
无法工作的一系列原因,但我该如何正确编码呢?
在宏伟的计划中,我将在整个计划中做一堆“矢量数学”;我应该将每个向量的值作为单独的实体来处理吗?这将由一群人使用,所以我想尽可能避免下载新的库。
答案 0 :(得分:2)
我会做%:> my_prog.py 1,3 3,1
然后处理它
vect1 = map(int,sys.argv[1].split(","))
vect2 = map(int,sys.argv[2].split(","))
并且喜欢programmign ... 不要使用eval ..如果你真的想要至少使用ast.literal_eval < / p>
import ast
v1 = ast.literal_eval("[1,3]")
比eval更安全
另一个(比eval好得多)替代方案是json(参见其他答案)
答案 1 :(得分:1)
如果安全不是问题,我会这样做:
dp = dot(eval(sys.argv[1]), eval(eval.argv[2]))
eval
只接受任何看起来像python表达式的字符串并返回该表达式的值。
UPD:更好的解决方案
import json
...
dp = dot(json.loads(sys.argv[1]), json.loads(eval.argv[2]))
P.S。仅当您在两个数组之间放置空格时才会起作用,否则sys.argv
将包含更多元素。
答案 2 :(得分:0)
使用参数的eval将解决您的问题。这会将参数视为实际的python语句,而不是需要解析为数据类型的字符串。
dp = dot(eval(sys.argv[1]),eval(sys.argv[2]))
这一般不是一个很好的解决方案,因为您将来可能会遇到更多问题。您最好使用JSON数据或其他东西从文件中读取。