Типирование в Python - PullRequest
       91

Типирование в Python

21 голосов
/ 22 декабря 2008

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

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

Ответы [ 5 ]

38 голосов
/ 22 декабря 2008

Вы можете преобразовать строку в 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-разрядных чисел с плавающей запятой.

3 голосов
/ 22 декабря 2008

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

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

  • без знака и со знаком int 8 битов, int
  • без знака и со знаком int 16 бит, int
  • без знака и со знаком int 32 бита, без знака: длиной , со знаком int
  • без знака и со знаком в 64 битах, длиной

  • double, float

  • float, float
  • строка, это то, с чего вам пришлось начинать

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

  • без знака и со знаком 8 бит,
  • без знака и со знаком 16 бит,
  • без знака и со знаком 32 бита,
  • без знака и со знаком 64 бита.

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

2 голосов
/ 22 декабря 2008

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

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

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

0 голосов
/ 05 февраля 2019

У меня только что возникла проблема, когда мне было передано значение в виде 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
0 голосов
/ 22 декабря 2008

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

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

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

...