Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 11, 2014 22:21:23

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

Работа со строками

Budulianin
Теже самые символы в той же самой последовательности?
Тебе нужно понять, что такое юникод.

Budulianin
Unicode это стандарт, в соответствии с которым, каждому символу определён код типа \u0444.
Не, юникод - это набор чисел, часть из которых отображается на символы, часть отображается на кусочки символов, а часть вообще отображается на пустоту.
Ты не можешь считать это набором символов, потому что очень многие числа не соотвествуют ничему. Числа называются “кодовые точки”. Этих чисел около одного миллиона.

>>> 65536 * 17
1114112
>>>

Они разделены на блоки по 65536 чисел. Первый блок называется BMP (Basic Multilingual Plane). В этом блоке помещается практически всё европейское. Также в этом блоке есть и служебные кодовые точки, которые называются суррогатами. Из пар этих точек можно составлять точки в оставшейся части юникода.

Вот utf-16 - двубайтовая кодировка, её хватает на кодирование только этой BMP. Но, так как в BMP есть суррогаты, то в этой кодировке можно представить и любую кодовую точку из оставшихся 16 плоскостей.

Что такое кодировки utf-8, utf-16 и utf-32? Это кодировки для всего юникода. То есть каждая из этих кодировок может представить любую кодовую точку юникода. Каждая из этих кодировок делает это по-своему: utf-32 является прямой кодировкой, utf-16 - экономной кодировкой, utf-8 - оптимальной кодировкой.

Budulianin
Теже самые символы в той же самой последовательности?
latin1 была до юникода, ascii была до latin1. Поэтому ascii входит в latin1, а latin1 входит в юникод.

Budulianin
Дак если latin1 перевели в Unicode, он должен быть записан символами Unicode

>>> u'\xd1' is u'\u00d1'
True
>>>



Отредактировано py.user.next (Сен. 11, 2014 22:21:57)

Офлайн

#2 Сен. 13, 2014 12:08:48

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Работа со строками

py.user.next

В чём прикол?

>>> 'ф'.decode('latin1') is 'ф'.decode('latin1')
False

>>> id('ф'.decode('latin1')) == id('ф'.decode('latin1'))
True



Офлайн

#3 Сен. 14, 2014 00:11:10

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

Работа со строками

Это глюки питона.

>>> a = 'ф'.decode('latin1')
>>> b = 'ф'.decode('latin1')
>>> a is b
False
>>> a, b
(u'\xd1\x84', u'\xd1\x84')
>>> u'\xd1\x84' is u'\xd1\x84'
True
>>> 

В третьем то же самое.
>>> a = b'\xd1\x84'.decode('latin1')
>>> b = b'\xd1\x84'.decode('latin1')
>>> a is b
False
>>> a, b
(\x84', \x84')
>>> 
>>> b'\xd1\x84' is b'\xd1\x84'
True
>>>

Глюки не запрещённые.



Офлайн

#4 Сен. 14, 2014 00:34:40

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Работа со строками

py.user.next
Это глюки питона.
Хе-хе, баг наковырял.

py.user.next
Глюки не запрещённые.
Что значит не запрещённые? Это баг, надо править.



Офлайн

#5 Сен. 14, 2014 02:03:30

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

Работа со строками

Budulianin
Что значит не запрещённые?
Нигде не сказано, что одинаковые константы должны указывать на один объект. Если C рассматривать, там то же самое по поводу строковых литералов.

Budulianin
Это баг, надо править.
В питоне подобных несостыковок - вагон и маленькая тележка.

>>> 'abc'.endswith(('a', 'b', 'c'))
True
>>> 'abc'.endswith(['a', 'b', 'c'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: endswith first arg must be str or a tuple of str, not list
>>>

Казалось бы, тут должен быть любой итерэбл, а не только кортеж. Но они говорят, что там вообще должно быть только множество. То есть, если у тебя откуда-то список окончаний, ты должен его приводить ко множеству. Вопрос: почему я не могу сам решить?



Отредактировано py.user.next (Сен. 14, 2014 02:08:55)

Офлайн

#6 Сен. 14, 2014 02:17:02

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Работа со строками

py.user.next
Нигде не сказано, что одинаковые константы должны указывать на один объект.
Вообще-то сказано. Про числа например от -4 до 255, хе хе. И про короткие строки.

Но тут всё честно.

>>> a = 'ф'.decode('latin1')
>>> b = 'ф'.decode('latin1')
>>> id(a)
3065670568L
>>> id(b)
3065669464L

Конкретно в таком случае нечестно.
>>> 'ф'.decode('latin1') is 'ф'.decode('latin1')
False

Потому что id один
>>> id('ф'.decode('latin1')) == id('ф'.decode('latin1'))
True



Отредактировано Budulianin (Сен. 14, 2014 02:55:20)

Офлайн

#7 Сен. 14, 2014 02:18:40

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Работа со строками

py.user.next
Но они говорят, что там вообще должно быть только множество.
py.user.next
must be str or a tuple of str



Офлайн

#8 Сен. 14, 2014 03:27:10

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

Работа со строками

Не, в смысле я у них спрашивал, почему такая несостыковка.

Budulianin
Конкретно в таком случае нечестно.
Budulianin
Потому что id один
Так это разные случаи просто. Там, где id один, они и по is совпадают. А там, где по is не совпадают, там и id разные.

Budulianin
Вообще-то сказано. Про числа например от -4 до 255, хе хе. И про короткие строки.
Да, типа может быть, а может не быть. Где-то что-то.



Отредактировано py.user.next (Сен. 14, 2014 03:34:37)

Офлайн

#9 Сен. 14, 2014 13:01:38

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Работа со строками

py.user.next
Там, где id один, они и по is совпадают.
Почему разные-то ?
>>> id('ф'.decode('latin1')) == id('ф'.decode('latin1'))
True
>>> 'ф'.decode('latin1') is 'ф'.decode('latin1')
False



Офлайн

#10 Сен. 14, 2014 21:45:54

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

Работа со строками

Ну, очевидно же, что питон по-разному обрабатывает эти строки. В первом случае он создаёт один объект, а во втором - два.
То, что они одинаково обрабатываются, - это твоё предположение.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version