在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ python類中的函數(shù)問題

python類中的函數(shù)問題

各位大神好!

我在學(xué)習(xí)的一個(gè)線代基礎(chǔ)課中,需要用到Python來計(jì)算向量,其中有一段代碼是這樣的:

from math import sqrt, acos, pi #導(dǎo)入sqrt, acos, pi
from decimal import Decimal, getcontext

getcontext().prec = 30

class Vector():

    CANNOT_NORMALIZE_ZERO_VECTOR_MSG = 'Cannot normalize the zero vector'
 
    def __init__(self, coordinates): 
        try:
            if not coordinates:
                raise ValueError
            self.coordinates = tuple([Decimal(x) for x in coordinates]) 
            self.dimension = len(self.coordinates) 
        except ValueError:
            raise ValueError('The coordinates must be nonempty')
        except TypeError:
            raise TypeError('The coordinates must be an iterable') 
 
    def plus(self, v):
        """向量加法"""
        new_coordinates = [x + y for x, y in zip(self.coordinates, v.coordinates)]
        return Vector(new_coordinates)
 
    def dot(self, v):
        """計(jì)算向量點(diǎn)積"""
        return sum([x * y for x, y in zip(self.coordinates, v.coordinates)])
 
    def angle_with(self, v, in_degrees = False):
        """計(jì)算向量夾角"""
        try:
            u1 = self.normalized()
            u2 = v.normalized()
            angle_in_radians = acos(u1.dot(u2))
 
            if in_degrees:
                degrees_per_radian = 180. / pi
                return angle_in_radians * degrees_per_radian
            else:
                return angle_in_radians
        except Exception as e:
            if str(e) == self.CANNOT_NORMALIZE_ZERO_VECTOR_MSG:
                raise Exception('Cannot compute an angle with the zero vector')
            else:
                raise e
print('\n向量加法')
v = Vector([8.218, -9.341])
w = Vector([-1.129, 2.111])
print(v.plus(w))

print('\n計(jì)算向量夾角')
v = Vector(['3.183', '-7.627'])
w = Vector(['-2.668', '5.319'])
print(v.angle_with(w))
v = Vector(['7.35', '0.221', '5.188'])
w = Vector(['2.751', '8.259', '3.985'])
print(v.angle_with(w, in_degrees=True))

在向量加法的代碼中,這個(gè) self.coordinatesv = Vector([8.218, -9.341]) 傳入的值,v.coordinatesw = Vector([-1.129, 2.111]) 傳入的值,我有個(gè)問題就是,為什么 v 后面要加上coordinates 呢?這個(gè) v 是類似 self 那樣作為引用,用于訪問這個(gè)屬性 coordinates 嗎?為什么不可以直接使用 v 呢?

另外在“計(jì)算夾角向量”的代碼中:

angle_in_radians = acos(u1.dot(u2))

中的 (u1.dot(u2)) 該怎么理解好呢?

請(qǐng)大神賜教,謝謝!

回答
編輯回答
礙你眼

v是代表一個(gè)對(duì)象,你打印v會(huì)獲取它的內(nèi)存地址,coordinates 是v的一個(gè)屬性,你打印v.coordinates 可以獲取屬性里面的值。當(dāng)然你也直接用v,這樣你需要重寫v的魔方方法,也就是__repr__方法,但是返回值需要轉(zhuǎn)換成str類型,否則會(huì)報(bào)類型錯(cuò)誤~

class Vector:
    def __init__(self):
        self.coordinates = 10

    def __repr__(self):
        return str(self.coordinates)

v = Vector()
print(v)
2017年3月27日 01:24