Skip to content

Latest commit

 

History

History
141 lines (105 loc) · 5.69 KB

File metadata and controls

141 lines (105 loc) · 5.69 KB

Тема: Разница 2 и 3 версии Python


Строки и Юникод

Существует Юникод кодировка, с 2 типами кодирования:

  1. UTF-8 UTF-16 UTF-32
  2. UCS-2 UCS-4

UTF-16 UTF-32 - число указывает количество затрачиваемых битов.

Первоначально при переходе с питона 2 на питон 3 использовалась UTF-16 по этому даже когда мы работаем с символами, что могут умещаться в ASCII то всеравно тратили больше памяти на их хранение, по этому с питон 3.3 все определяется в зависимости от строки.

Если строка умещается в UTF-8, то он и используется, как в случае со строкой hello world, если русские символы то уже используется UTF-16

Рассмотрим пример, функция chr() принимает число и по нему вычисляет по Юникоду какому символу он соответствует, и наоборот функция ord принимает символ и вычисляет его число по Юникоду.

       a = 'hello world'
       print(list(map(ord, a)))
   
       b = 'Привет мир'
       print(list(map(ord, b)))
   
       c = '⏸'
       print(list(map(ord, c)))
   
       print(chr(9208))
       print(chr(127025))

       # Вывод
      # [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
      # [1055, 1088, 1080, 1074, 1077, 1090, 32, 1084, 1080, 1088]
      # [9208]
      # ⏸
      # 🀱

Как можем видеть строка hello world состоит только из латиницы, так что полностью умещается в ASCII в этой таблице символов содержится кодировка 127 символов, так и есть с английского слово полностью умещается в это число, так что для кодировки этой строки используется UTF-8

Вторая строка это русские символы, для них уже используется UTF-16

Третий случай это эмодзи, они тоже есть в таблице Юникода.

Четвертый случай это символ домино, для него уже используется UTF-32

Unicod строки и Байтовые строки в Python

В Питоне есть 2 типа строк, Unicod строки и Байт строки, по дефолту все строки имеют кодировку Unicod. Для обьявления Байт строк перед строкой записываем спец символ b и она участвует в выводе на экран, также они имеют разный тип объектов, str и bytes вот пример:

    str_1 = 'привет мир'
    str_2 = b'hello world'

    print('Unicod строка: ', str_1)
    print('Байтов строка: ', str_2)

    print(f'Тип Unicod роки: {type(str_1)}\nТип Байт строк: {type(str_2)}')

    # Вывод
    # Unicod строка:  привет мир
    # Байтов строка:  b'hello world'
    # Тип Unicod роки: <class 'str'>
    # Тип Байт строк: <class 'bytes'>

Существует кодировка ASCII - которая включает в себя небольшой набор чисел и латиницы, именно по этой кодировке работал питон2

Есть таблица Unicod и ее часть UTF-8 включает в себя всю ASCII и расширяет ее, теперь в Питон3 по дефолту используется именно эта кодировка, и это работает не только на содержимое строк, но и на написание самой программы, теперь в качестве символов имен можно использовать все то что входит в Unicod, так что теперь можно давать русские и не только, названия именам:

    переменна = "Да это работает"
    print(переменна)

    class МойКласс:
        def __init__(self, x, y):
            self.x = x
            self.y = y

    обьект_моего_классса = МойКласс(10, 20)
    print(обьект_моего_классса.__dict__)

    # Вывод
    # Да это работает
    # {'x': 10, 'y': 20}

Модуль __future__

Для того чтобы иметь возможность использовать функции Python3 во второй версии языка, используется спец модуль __future__

    from __future__ import print_function

Функции chr и ord

В системе кодировок есть привязка к целым числам, для получения значения символа от числа или числа от символа, используется 2 метода, все это делается из таблицы имен Unicod.

  1. chr() - по числу возвращает его символ.

  2. ord() - по символу возвращает его число.

    print(chr(65))
    print(ord('A'))

    # Вывод
    # A
    # 65