Помогите с внутренним циклом в методе Python - PullRequest
1 голос
/ 26 сентября 2011

У меня проблемы с пониманием того, почему внутренний цикл в моем методе не дает желаемого поведения, которое я ожидаю, и я надеюсь, что кто-то может помочь мне понять проблему.

Мой метод требуетряд аргументов (*args) и если аргумент является целым числом, я хочу добавить знаки доллара вокруг целого числа (например, $5$).

def t_row(*args):
    columns = 5
    if len(args) == columns:
        count = 0
        for value in args: 
            if type(value) is int:
                value = ''.join(('$', str(value), '$'))
            count += 1
            if count < len(args):
                penult_args = args[:-1]
                line_prefix = [''.join((str(value), " & ")) for value in penult_args]
            elif count == len(args):
                line_suffix = [''.join((str(value), " \\\\", "\n"))]
        count += 1
        line_list = line_prefix + line_suffix 
        line = ''.join(item for item in line_list)
        return(line)

Код выше используется следующим образом:1008 *

>>> s = q.t_row('data1', 'data2', 3, 'data4', 5)  
>>> print s  
data1 & data2 & 3 & data4 & $5$ \\  

Почему я не получаю знаки доллара вокруг целого числа 3?Как я могу исправить свой код, чтобы исправить эту проблему?

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Потому что в этой строке:

            line_prefix = [''.join((str(value), " & ")) for value in penult_args]

вы извлекаете значения из исходного списка (за исключением последнего элемента), находясь в этой строке:

            value = ''.join(('$', str(value), '$'))

Вы добавили $, но никогда не сохраняли значение обратно в список.

5 получает $ только потому, что это последний элемент, поэтому вы ссылаетесь на него непосредственно в:

            line_suffix = [''.join((str(value), " \\\\", "\n"))]

Лучший способ сделать все это:

def t_row(self, *args):
    if len(args) == self.columns:
        result = []
        for value in args:
            if isinstance(value, int):
                result.append('$%d$' % value)
            else:
                result.append(value)
        return ' $ '.join(result) + r' \\'

Как однострочник, это будет

t_row = lambda self, *args: (' $ '.join('$%d$' % 
          value if isinstance(value, int) else value for value in args) + r' \\' 
              if len(args) == self.columns else None)

но на самом деле это не очень хорошая идея.

2 голосов
/ 26 сентября 2011

Проблема в том, что в этой строке:

line_prefix = [''.join((str(value), " & ")) for value in penult_args]

Вы перезаписываете value исходным значением (без знака доллара).

Это работает для последнего аргументатолько потому, что приведенная выше строка не вызывается для args [-1].

Используйте другое имя переменной для вашего цикла.

(область видимости Python распространяется только на функции и классы, циклы for и операторы if не имеют независимой области действия.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...