python: небольшая логическая ошибка в классе графических функций терминала

` Я создаю персональную графическую систему для использования в терминале. Класс проходит следующим образом:

import parser
def ev(n, x):
code = parser.expr(n).compile()
return eval(code)


class Graph:
def __init__(self, length, width):
    self.l = length
    self.w = width
    self.graph = [['-' for x in range(self.w)] for x in range(self.l)]
def draw(self):
    for i in range(self.l):
        temp = []
        for j in range(self.w):
            temp.append(self.graph[i][j])
        print ''.join(temp)

def add(self, f):
    y = []
    for i in range(self.w):
        y.append(ev(f, i))
    top = max(y)
    bot = min(y)
    print y
    scale = (top - bot)/self.l
    print scale

    adj = 0
    for i in range(self.l,0,1):
        adj = bot + (i * scale)
        for j in y:
            if j >= adj & j < adj + scale:
                self.graph[i][j] = 'X'

все работает хорошо, за исключением модуля добавления, который создает диапазон значений y из предварительно определенной функции для анализа уравнения, т.е. «x ** 2» в последних 6 строках кода, он терпит неудачу, точки в массиве графика не изменяются на «Х»

если бы кто-нибудь был так любезен, чтобы, возможно, сбежать и помочь, это было бы здорово


person Henry Walters    schedule 02.06.2015    source источник
comment
Правильно отформатируйте вопрос и пометьте его используемым языком программирования.   -  person Ignacio Vazquez-Abrams    schedule 02.06.2015


Ответы (2)


Есть несколько проблем:

scale = (top - bot)/self.l

В зависимости от вашей версии Python это может выполнять целочисленное деление, поэтому приведите к float, чтобы убедиться, что вы не округляете до нуля:

scale = (top - bot)/float(self.l)

Кроме того, вычитание единицы позволяет избежать ошибки "не на единицу" (массив n элементов имеет n-1 шагов при итерации от первого до последнего элемента).

scale = (top - bot)/float(self.l-1)

Ваш диапазон неверен (первый параметр должен быть начальным значением)

for i in range(0,self.l,1):

Наконец, & должно быть and (& — это побитовый и оператор)

if j >= adj and j < adj + scale:
person samgak    schedule 02.06.2015

проблема в этой строке:

for i in range(self.l,0,1):

range(some_positive_value, 0, 1) даст пустой список; вы, вероятно, хотите range(0, self.l, 1), что эквивалентно range(self.l). Для получения дополнительной информации введите help(range) в консоли Python. Также для версий Python старше 3 используйте xrange вместо range.

person CristiFati    schedule 02.06.2015