2016-02-16 2 views
-2

Мой вопрос касается некоторого кода, который является частью назначения Udacity. Следующий код не возвращает никакого значения. Я предполагаю, что я не называю «скалярную» функцию должным образом из моей «нормализованной» функции. Строка norm = self.scalar(scale) возвращает тип нет. Может кто-нибудь дать мне указатель?Python 3.5.1 - переменная возвращает none

Код:

import math 
from decimal import Decimal, getcontext 

getcontext().prec = 10 

class Vector(object): 
    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 __eq__(self, v): 
     return self.coordinates == v.coordinates 
    def scalar(self, c): 
     new_coordinates = [Decimal(c)*x for x in self.coordinates] 
     #new_coordinates = [] 
     #n = len(self.coordinates) 
     #for i in range(n): 
     # new_coordinates.append(self.coordinates[i] * c) 
     #print(Vector(new_coordinates)) 

    def magnitude(self): 
     new_sq = [x**2 for x in self.coordinates] 
     new_mag = math.sqrt(sum(new_sq)) 
     return (new_mag) 

    def normalized(self): 
     magnitude = self.magnitude() 
     scale = 1/magnitude 
     print(scale) 
     norm = self.scalar(scale) 
     #print(type(norm)) 
     print(norm) 
     return (norm) 

my_vector = Vector([1,2]) 
Vector.normalized(my_vector) 
+8

Ну, есть оператор возврата в методе скалярного? –

+1

Это законный способ импорта? Возможно, это не является источником вашей проблемы, но не должно быть: '' import math'' на одной строке и '' от десятичного импорта Decimal, getcontext'' в своей собственной строке? – Igor

+1

@Igor Я думаю, что это была проблема с копией, она, вероятно, должна была быть «import math; from decimal import ..' where ';' является новой линией –

ответ

5

Python имеет этот прохладный маленький трюк где он всегда будет возвращать None, если не указано. Поэтому, если вы напишете функцию hello world, которая ничего не вернет, вы получите None.

, например:

def hello_world(): 
    print('hello world') 

result = hello_world() 
print(result) # prints nothing cause result==None 

Вы не имеете оператор возврата в методе scalar, поэтому он всегда будет возвращать None.

Я предполагаю, что вы хотите вернуть объект, создать в скалярном

def scalar(self, c): 
    new_coordinates = [Decimal(c)*x for x in self.coordinates] 
    return new_coordinates 

Или для краткости

def scalar(self, c): 
    return [Decimal(c)*x for x in self.coordinates] 
+1

Другими словами, изменение 'new_coordinates = ...' в вашем 'скалярном' методе' return ... 'решит эту проблему. –

+0

@o_o Добавил это в ответ –

+0

Спасибо всем - недостающая линия возврата была основной причиной. Я ценю помощь и терпение с абсолютным новичком. –

0

Проблема заключается в том, что вы пытаетесь получить значение из scalar, даже если он ничего не возвращает. Я не совсем уверен, что вы пытаетесь вернуть, так что вам придется с этим справиться.

Одним из примечательных вопросов является метод, вызывающий атрибут экземпляра my_vector. Это не технически проблема, но ее, вероятно, следует изменить. Ваш код должен быть следующим.

my_vector = Vector([1,2]) 

my_vector.normalized() 
+0

не корень, если проблема, но проблема, которую я допускаю. –

+0

Это технически проблема? Вызов метода класса из класса с экземпляром класса в качестве первого аргумента будет применять функцию с экземпляром как 'self'. Хотя автор, вероятно, не хочет использовать функцию таким образом, это не совсем «неправильно». –

+0

@o_o Я полагаю, вы правы. Вероятно, это было бы лучше, чем комментарий. – GarethPW

Смежные вопросы