2015-05-27 3 views
-2

Ниже приведен код, который я написал для добавления двух комплексных чисел. Я не включил «i» часть комплексных чисел. Код не возвращает метод добавления.Добавление двух чисел compex

import math 
class complex(object): 
    def __init__(self, real, imaginary): 
     self.real = real 
     self.imaginary = imaginary 

    def __add__(self, other): 
     return complex(self.real + other.real, self.imaginary + other.imaginary) 

L1 = [map(float, raw_input().split())] 
L2 = [map(float, raw_input().split())] 
z1 = complex(L1[0][0],L1[0][1]) 
z2 = complex(L2[0][0],L2[0][1]) 
print z1.real, z1.imaginary, z2.real, z2.imaginary 
print z1+z2 

код правильно печатает z1.real, z1.imaginary, z2.real, z2.imaginary переменные. Однако, когда я пытаюсь добавить z1 + z2, он ничего не возвращает.

ввода пробы:

2 1 
5 6 

Пример вывода:

2.0 1.0 5.0 6.0 
<__main__.complex object at 0x7fa11c039790> 

Пожалуйста, дайте мне знать, где я делаю ошибку

+0

Почему вы печатаете 'real' и' imaginary' для входов, но не вывод? – user2357112

+2

Что значит, что он ничего не возвращает? Я довольно четко вижу '<__ main __. complex object at 0x7fa11c039790>' там. –

+0

Я хочу, чтобы конечный результат был 7 и 7, когда я делаю z1 + z2. Я довольно новичок в python. – SpaceOddity

ответ

4

Ваш код на самом деле работает. Когда вы print z1+z2, он распечатает правильный объект. И вы можете убедиться, что:

print (z1+z2).real, (z1+z2).imaginary 

Проблема заключается в том, что, когда вы просто print z1+z2, как ваш объект распечатывает как это:

<__main__.complex object at 0x7fa11c039790> 

Это не очень полезно. Но Python не может догадаться, что вы хотите, чтобы ваши типы выглядели так: вы должны это сказать.

Для этого есть два метода: __str__ и __repr__. Если у вас должно быть одно представление для вывода с конечным пользователем, а другое для отладки, вы определяете оба; в противном случае просто определите __repr__.

Например:

class complex(object): 
    def __init__(self, real, imaginary): 
     self.real = real 
     self.imaginary = imaginary 

    def __add__(self, other): 
     return complex(self.real + other.real, self.imaginary + other.imaginary) 

    def __str__(self): 
     return '{}, {}'.format(self.real, self.imaginary) 

    def __repr__(self): 
     return 'complex({}, {})'.format(self.real, self.imaginary) 

Python 3.x добавил некоторые инструменты, чтобы сделать это проще для вас; в частности, SimpleNamespace позаботится об основных __init__ и __repr__ для простых классов, поэтому вам нужно написать только __add__. Но если вы используете Python 2.7, эти инструменты не существуют.

2

Он работает. (Я назвал ваш класс Complex2, чтобы не затенять встроенной complex.)

>>> res = Complex2(1, 3) + Complex2(3, 4) 
>>> res.real 
4 
>>> res.imaginary 
7 
>>> print(res) 
<__main__.Complex2 object at 0x10c321a58> 

Последний вывод является представление экземпляра.

Добавьте метод __repr__ увидеть полезный вывод:

class Complex2(object): 
    def __init__(self, real, imaginary): 
     self.real = real 
     self.imaginary = imaginary 

    def __add__(self, other): 
     return Complex2(self.real + other.real, self.imaginary + other.imaginary) 

    def __repr__(self): 
     return '({}+{}j)'.format(self.real, self.imaginary) 

Сейчас:

print(res) 

показывает:

(4+7j) 

Для реальной работы использовать встроенный в complex. Либо с литералов:

>>> 1 + 3 + 3 + 4j 
(7+4j) 

или с явным созданием нового объекта:

>>> complex(5) 
(5+0j) 
Смежные вопросы