Вопрос Python для начинающих RE: Тип форматирования строк и функция repr()

Итак, у меня есть этот код:

    formatter = "%r %r %r %r"

print formatter % (1, 2, 3, 4)
print formatter % ("one", "two", "three", "four")

И я получаю этот вывод:

1 2 3 4

'один два три четыре'


Мой вопрос:

Почему вторая строка вывода заключена в одинарные кавычки? Я не совсем понимаю, как на самом деле работает тип преобразования %r.

Когда я меняю код на:

formatter = "%r %r %r %r"

print formatter % (1, 2, 3, 4)
print "%s %s %s %s" % ("one", "two", "three", "four")

Я получаю этот результат:

1 2 3 4

один два три четыре

Я просто не понимаю, почему они работают по-разному. Кто-нибудь может мне его разобрать?


Я прочел:

http://docs.python.org/library/stdtypes.html и

http://docs.python.org/library/functions.html#repr


person Dorje    schedule 28.08.2011    source источник
comment
Это хороший вопрос, особенно если вы новичок. Тогда я проголосовал   -  person eyquem    schedule 29.08.2011


Ответы (2)


В выражении 'abc%rdef' % obj часть '%r' заменяется на repr(obj)

В выражении 'ABC%sDEF' % obj часть '%s' заменяется на str(obj)

.

repr() – это функция, которая для обычных объектов возвращает строку, совпадающую с той, которую вы написали бы в скрипте для определения объекта, переданного в качестве аргумента функции repr(). функция:

Для многих типов эта функция пытается вернуть строку, которая при передаче в eval() дает объект с тем же значением http://docs.python.org/library/functions.html#repr

.

Пример 1

если вы рассматриваете список, определенный li = [12,45,'haze']

print li напечатает [12,45,'дымка']

print repr(li) также выведет [12,45,'haze'] , потому что [12,45,'haze'] – это последовательность символов, записанная в скрипте для определения списка li с этим значением.

Пример 2

если вы считаете строку, определенную ss = 'oregon' :

print ss напечатает oregon без кавычек

print repr(ss) напечатает 'oregon' , так как 'oregon' — это последовательность символов, которую вы должны написать в скрипте, если хотите определить строку ss со значением oregon в программе

.

Таким образом, это означает, что фактически для общих объектов repr() и str() возвращают строки, которые в целом равны, за исключением строкового объекта. Это делает функцию repr() особенно интересной для строковых объектов. Например, очень полезно анализировать содержимое HTML-кодов.

person eyquem    schedule 28.08.2011
comment
Ооооо! И лампочка горит. Это высоко ценится. - person Dorje; 28.08.2011
comment
У вас есть примеры того, как полезно анализировать содержимое HTML-кодов. - person Dorje; 28.08.2011
comment
@ Дордже Да. Сначала прочитайте этот пост: (stackoverflow.com/questions/7213970/) Во второй части сообщения есть эта инструкция li = htmlcode.splitlines(True), за которой следует другая полезная инструкция print '\n'.join(str(i) + ' ' + repr(line)+'\n' for i,line in enumerate(li) if 275<i<300), которая отображает очень полезное представление части содержимого HTML-код. Удалите часть if 275<i<300, и вы получите представление всего содержимого извлеченного HTML-кода. - person eyquem; 28.08.2011
comment
@Dorje Более сложным и более по отношению к вашему вопросу является этот пост (stackoverflow.com/questions/7206143/python-regex-проблема/) - person eyquem; 28.08.2011
comment
@Dorje Кстати, перечитывая документы, касающиеся repr(), я вспомнил, что мы можем писать print `x` вместо repr(x) - person eyquem; 28.08.2011
comment
@Dorje И я понимаю, что лучше написать print '\n'.join('%s %r\n' % (i,line) for i,line in enumerate(li) . Или даже так: print '\n'.join(map(lambda x:'%s %r\n' % x, enumerate(ch.splitlines(True)))) - person eyquem; 28.08.2011
comment
Ух ты. Я понимаю, почему это полезно. Все, что вы здесь добавите, будет полезно для меня, чтобы разобрать и изучить. Большое спасибо. - person Dorje; 29.08.2011

%s сообщите python, чтобы он вызывал функцию str() для каждого элемента вашего кортежа. %r сообщите python, чтобы он вызывал функцию repr() для каждого элемента вашего кортежа.

По документам:

str():

Возвращает строку, содержащую красиво печатное представление объекта. Для строк это возвращает саму строку.

repr():

Возвращает строку, содержащую печатное представление объекта.

Это означает, что если объект, для которого вы вызываете repr(), является строковым объектом (в python все является объектом), он показывает вам, как представлены разные символы.

@ваш конкретный вопрос: я предполагаю, что «...» указывает, что это строка. Если вы вызываете repr() для int, нет "...".

person Aufwind    schedule 28.08.2011
comment
Спасибо за объяснение. Это действительно помогло объяснить документы больше. Это означает, что если объект, для которого вы вызываете repr(), является строковым объектом (в python все является объектом), он показывает вам, как представлены различные символы. - person Dorje; 28.08.2011