Уведомления

Группа в Telegram: @pythonsu

#1 Март 21, 2013 12:06:11

agaspher
Зарегистрирован: 2013-03-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Есть ли разница между %s и str()

Здравствуйте!

Может быть кто-то подскажет, есть ли разница между %s и str()
пытаюсь разобраться с кодировками и работой со строками, но похоже запутался
В доке по python 2.7 вижу:

's' String (converts any Python object using str())
то есть как я понял ‘s’ просто способ вызова str(), но на деле:
cur - подключение к базе firebird 2.1 charset win1251 используя kinterbasdb
 
for tuple in cur:
    print '%s ' % tuple
получаю вывод в человеческом виде:
Administrator
Администратор

если делаю
for tuple in cur:
    print str(tuple)
выводится:
(u'Administrator',)
(u'\u0410\0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440',)

или я неправильно понял, может тогда кто расскажет подробно почему оба варианта работают именно так?

Офлайн

#2 Март 21, 2013 14:01:19

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Есть ли разница между %s и str()

agaspher
сделайте так и посмотрите на результаты:

print str(tuple[0])
print ' '.join(tuple)
а еще посмотрите на это:
>>> t=('qwe',)
>>> tt=('qwe','asd')
>>> print '%s'%t
qwe
>>> print '%s'%tt
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting
>>> l=[1,2]
>>> str(l)
'[1, 2]'
>>> print '%s'%l
[1, 2]

По сути: все дело в том что в вашем первом случае у вас в строке один оператор подстановки, а вы на вход подаете кортеж длиной 1. Соответственно str() была применена к нулевому элементу кортежа, коим является строка. И это единственное значение было корректно в соответствии со всеми правилами выведено на экран.
Во втором случае вы пытаетесь на печать вывести строковое представление кортежа (а не строковое представление его содержимого), а он выглядит именно так как и вы показали.

спать охота, объяснил как смог))



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Март 21, 2013 19:20:14

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Есть ли разница между %s и str()

agaspher
то есть как я понял ‘s’ просто способ вызова str()
>>> print '%s%s%s' % (1, tuple(), [])
1()[]
>>>
вот три раза выполняется str(), и каждый результат вставляется на своё место в форматной строке



Отредактировано py.user.next (Март 21, 2013 19:20:44)

Офлайн

#4 Март 22, 2013 12:30:50

agaspher
Зарегистрирован: 2013-03-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Есть ли разница между %s и str()

Спасибо! Вроде все более менее встало на свои места

строковое представление кортежа (а не строковое представление его содержимого)
вот этой мысли не хватало, даже не думал об этом

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version