Приведение типов в Python

Мне нужно преобразовать строки в Python в другие типы, такие как беззнаковые и знаковые 8-, 16-, 32- и 64-битные целые, двойные числа, числа с плавающей запятой и строки.

Как я могу это сделать?


person user46646    schedule 22.12.2008    source источник
comment
Возможный дубликат преобразования строки Unicode в python   -  person ian5v    schedule 01.05.2016


Ответы (5)


Вы можете преобразовать строку в 32-битное целое число со знаком с помощью функции int:

str = "1234"
i = int(str)  // i is a 32-bit integer

Если строка не представляет целое число, вы получите исключение ValueError. Обратите внимание, однако, что если строка действительно представляет целое число, но это целое число не помещается в 32-битное целое число со знаком, то вместо этого вы фактически получите объект типа long.

Затем вы можете преобразовать его в другие значения ширины и знака с помощью простой математики:

s8 = (i + 2**7) % 2**8 - 2**7      // convert to signed 8-bit
u8 = i % 2**8                      // convert to unsigned 8-bit
s16 = (i + 2**15) % 2**16 - 2**15  // convert to signed 16-bit
u16 = i % 2**16                    // convert to unsigned 16-bit
s32 = (i + 2**31) % 2**32 - 2**31  // convert to signed 32-bit
u32 = i % 2**32                    // convert to unsigned 32-bit
s64 = (i + 2**63) % 2**64 - 2**63  // convert to signed 64-bit
u64 = i % 2**64                    // convert to unsigned 64-bit

Вы можете преобразовать строки в числа с плавающей запятой с помощью функции float:

f = float("3.14159")

Поплавки Python — это то, что другие языки называют double, то есть они 64-битные. В Python нет 32-битных чисел с плавающей запятой.

person Adam Rosenfield    schedule 22.12.2008
comment
Интересно, насколько разные могут быть приняты ответы на один и тот же вопрос строка юникода в python% 23374335"> stackoverflow.com/questions/374318/ - person jfs; 22.12.2008
comment
Хе. Этим утром я потратил целую вечность на отладку кода, и это был нарушитель: D - person Dominic Bou-Samra; 14.12.2010
comment
@AdamRosenfield Не могли бы вы объяснить математику преобразования в целое число со знаком? Например, для 32-битного целого числа я думаю об этом так: получить беззнаковое 32-битное целое число, а затем взять десятичное значение его двух дополнительных представлений, но я не уверен, как это переводится в (i + 2**31) % 2**32 - 2**31 - person cozos; 06.07.2018

Следующие типы — по большей части — вообще не существуют в Python. В Python строки преобразуются в целые, длинные или числа с плавающей запятой, потому что это все, что есть.

Вы запрашиваете преобразования, которые в первую очередь не имеют отношения к Python. Вот список типов, которые вы просили, и их эквивалент Python.

  • беззнаковое и подписанное целое 8 бит, целое
  • беззнаковое и подписанное целое 16 бит, целое
  • беззнаковое и подписанное целое 32 бита, без знака: long, со знаком int
  • беззнаковое и подписанное целое 64-битное, длинное

  • двойной, с плавающей запятой

  • плавающий, плавающий
  • строка, это то, с чего нужно было начинать

Я не знаю, что такое следующее, поэтому я не знаю эквивалента Python.

  • беззнаковые и подписанные 8 бит,
  • беззнаковые и подписанные 16 бит,
  • беззнаковые и подписанные 32-битные,
  • беззнаковые и подписанные 64-битные.

У вас уже есть все важные конверсии: int(), long() и float().

person S.Lott    schedule 22.12.2008
comment
* беззнаковый и знаковый 8-битный, * беззнаковый и знаковый 16-битный, * беззнаковый и знаковый 32-битный, * беззнаковый и знаковый 64-битный. обратитесь к битовым полям - person user46646; 22.12.2008
comment
Что означает битовое поле? Int имеет 32 бита - мне кажется, это битовое поле. Какие атрибуты и операции этого битового поля отличают его от int? - person S.Lott; 22.12.2008

Python имеет только один тип int. Чтобы преобразовать строку в int, используйте int() следующим образом:

>>> str = '123'
>>> num = int(str)
>>> num
123

Изменить. Также для преобразования в число с плавающей запятой используйте float() точно таким же образом.

person Paige Ruten    schedule 22.12.2008
comment
Я считаю, что то же самое справедливо и для всех других типов python. Мне кажется, что кто-то хочет C, а не Python - person UnkwnTech; 22.12.2008

Я не думаю, что на это обязательно можно ответить хорошо без дополнительной информации. Как уже говорили другие, в python есть только int и long для целых чисел - язык не придерживается архетипов битовой ширины и подписи языков программирования более низкого уровня.

Если вы полностью работаете с Python, то вы, вероятно, задаете неправильный вопрос. Вероятно, есть лучший способ сделать то, что вам нужно.

Если вы взаимодействуете, например, с кодом C или по сети, то есть есть способы сделать это, и похоже, что ответ на ваше предыдущее сообщение довольно подробно освещал этот путь.

person Jorenko    schedule 22.12.2008

У меня только что возникла проблема, когда мне было передано значение в виде 16-битного числа со знаком в дополнении от modbus. Мне нужно было преобразовать это в число со знаком. Я закончил тем, что написал это, что, кажется, работает нормально.

# convert a 32 bit (prob) integer as though it was 
# a 16 bit 2's complement signed one
def conv_s16(i):
    if (i & 0x8000):
        s16 = -(((~i) & 0xFFFF) + 1)
    else:
        s16 = i
    return s16
person user50619    schedule 05.02.2019