Python 为什么打印返回的元组不同于按索引打印元组成员?

Python 为什么打印返回的元组不同于按索引打印元组成员?,python,printing,tuples,Python,Printing,Tuples,我有一个函数(见下文),它接受一些值并返回一个元组。如果我使用索引打印元组的值(例如,元组[0],元组[1],等等),那么打印的值是正确的。但如果我只是打印元组或打印函数,那么我会得到一些疯狂的值(有时) 代码如下: import math def getvector(x1,y1,length,angle): x1 = float(x1) y1 = float(y1) length = float(length) angle = float(angle)

我有一个函数(见下文),它接受一些值并返回一个元组。如果我使用索引打印元组的值(例如,元组[0],元组[1],等等),那么打印的值是正确的。但如果我只是打印元组或打印函数,那么我会得到一些疯狂的值(有时)

代码如下:

import math

def getvector(x1,y1,length,angle):

    x1 = float(x1)
    y1 = float(y1)
    length = float(length)
    angle = float(angle)

    x2 = x1 + (length * math.cos(math.radians(angle)))
    y2 = y1 + (length * math.sin(math.radians(angle)))

    print "in getvector x2,y2 = (%f, %f)" % (x2,y2)

    return (x2,y2)


xy2 = getvector(0,0,4,270)
print "in main x2,y2 = (%f, %f)" % (xy2[0],xy2[1])
print getvector(0,0,4,270)
print "tuple =", xy2
结果是:

in getvector x2,y2 = (-0.000000, -4.000000) in main x2,y2 = (-0.000000, -4.000000) in getvector x2,y2 = (-0.000000, -4.000000) (-7.3478807948841188e-16, -4.0) tuple = (-7.3478807948841188e-16, -4.0) 在getvector x2中,y2=(-0.000000,-4.000000) 在主x2中,y2=(-0.000000,-4.000000) 在getvector x2中,y2=(-0.000000,-4.000000) (-7.3478807948841188e-16,-4.0) 元组=(-7.3478807948841188e-16,-4.0)
知道发生了什么吗??当我直接打印元组时,为什么值不同?

使用
%f
格式规范打印时,结果显示为7位有效数字。打印元组本身不是-这就是为什么你得到-7.3。。。数字(非常小,接近于零)。

使用
%f
格式规范打印将以7位有效数字显示结果。打印元组本身不是-这就是为什么你得到-7.3。。。数字(非常小,接近零)。

下面是发生的情况:

单独打印值时,您使用的是格式字符串(%f),该字符串以浮点格式打印数字(即最多7位有效数字)。这部分是正确的

当将值作为元组的一部分打印时,元组本身负责生成自己的字符串表示形式。当它创建值的字符串表示形式时,它不使用%f格式字符串;相反,它只是在对象上调用
repr()
。这不需要格式化,只需获取数字的精确值,精确到小数点后14位。比较:

import math
>>> print "%f" % (0.0 + 4*math.cos(math.radians(270)))
-0.000000
>>> print repr(0.0 + 4*math.cos(math.radians(270)))
-7.3478807948841188e-16

下面是正在发生的事情:

单独打印值时,您使用的是格式字符串(%f),该字符串以浮点格式打印数字(即最多7位有效数字)。这部分是正确的

当将值作为元组的一部分打印时,元组本身负责生成自己的字符串表示形式。当它创建值的字符串表示形式时,它不使用%f格式字符串;相反,它只是在对象上调用
repr()
。这不需要格式化,只需获取数字的精确值,精确到小数点后14位。比较:

import math
>>> print "%f" % (0.0 + 4*math.cos(math.radians(270)))
-0.000000
>>> print repr(0.0 + 4*math.cos(math.radians(270)))
-7.3478807948841188e-16