Преобразование в кортежи и списки
Чтобы преобразовать данные в кортеж или список, используйте методы tuple() и list() соответственно. В Python:
- Список – это изменяемая упорядоченная последовательность элементов, взятая в квадратные скобки ().
- Кортеж – неизменяемая упорядоченная последовательность элементов, взятая в круглые скобки.
Преобразование списка в кортеж
Преобразовывая список в кортеж, вы можете оптимизировать программу. Для преобразования в кортеж используется метод tuple().
Выведенные на экран данные являются кортежем, а не списком, поскольку они взяты в круглые скобки.
Попробуйте использовать tuple() с переменной:
В кортеж можно преобразовать любой итерируемый тип, включая строки:
Конвертируя в кортеж числовой тип данных, вы получите ошибку:
Преобразование в списки
Вы можете преобразовать кортеж в список, чтобы сделать его изменяемым.
Обратите внимание: при этом в методах list() и print() используется две пары круглых скобок. Одни принадлежать собственно методу, а другие – кортежу
Если данные, которые вывел метод print, заключены в квадратные скобки, значит, кортеж преобразовался в список.
Чтобы избежать путаницы с круглыми скобками, можно создать переменную:
Строки тоже можно преобразовывать в списки:
Маски
Бинарные последовательности можно поставить в соответствие подмножествам какого-то фиксированного множества: если на $i$-той позиции стоит единица, то значит $i$-тый элемент входит множество, а иначе не входит.
Битовые операции таким образом часто используются операций над множествами, представляемыми битовыми мазками — например, в задачах на полный перебор или динамическое программирование.
Выделить i-й бит числа
или . Во втором случае результат будет либо 0, либо $2^i$.
Это часто используется для проверки, принадлежит ли $i$-тый элемент множеству:
Напомним, что нумерация идет с младших бит и начинается с нуля.
Знаковые числа
Целочисленные переменные делятся на два типа — знаковые (signed) и беззнаковые (unsigned).
Если сложить две переменные, сумма которых превосходит $2^{32}$, произойдет переполнение: сумму нельзя будет представить точно, и поэтому вместо неё результатом будут только нижние 32 бит. Все операции с беззнаковыми числами как бы проходят по модулю какой-то степени двойки.
Знаковые же типы нужны для хранения значений, которые могут быть и отрицательными. Для этого нужно выделить один бит для хранение знака — отрицательное ли число или нет — немного пожертвовав верхней границей представимых чисел: теперь самое большое представимое число это $2^{31}-1$, а не $2^{32}-1$.
Инженеры, которые работают над процессорами, ещё более ленивые, чем программисты — это мотивировано не только стремлением к упрощению, но и экономией транзисторов. Поэтому когда в типах происходит переполнение, результат в битовом представлении считается так же, как и в случае с числами. Если мы хотим ничего не менять в плане того, как работают числа, представление отрицательных чисел должно быть таким, что число $-x$ как бы вычитается из большой степени двойки:
Несколько следствий:
- Все неотрицательные числа записываются в точности как раньше.
- У всех отрицательных чисел самый большой бит будет единичным.
- Если прибавить к $2^{31}-1$ единицу, то результатом будет $-2^{31}$, представляемое как (в целях изложения мы будем записывать 8 бит, хотя в их 32).
- Зная двоичную запись положительного числа , запись можно получить как .
- записывается как .
- записывается как .
- После идет .
Упражнение. Каких чисел больше: положительных или отрицательных?
Осторожно. В стандарте C/C++ прописано, что переполнение знаковых переменных приводит к undefined behavior, поэтому полагаться на описанную логику переполнения нельзя, хотя равно это скорее всего и произойдет
128-битные числа
Общих регистров размера больше 64 в процессорах нет, однако умножение и несколько смежных инструкций могут использовать два последовательных регистра как один большой. Это позволяет быстро перемножать два 64-битных числа и получать 128-битный результат, разделенный на нижние биты и верхние.
Это весьма специфичная операция, и поэтому в языках программирования нет полноценной поддержки 128-битных переменных. В C++ однако есть «костыль» — тип — который фактически просто оборачивает пару из двух 64-битных регистров и поддерживает арифметические операции с ними.
Базовые арифметические операции с ним чуть медленнее, его нельзя напрямую печатать, и деление и прочие сложные операции будут вызывать отдельную библиотеку и поэтому работать очень долго, однако в некоторых ситуациях он оказывается очень полезен.
Символьные литералы
Для представления символов типа char в Java используется кодировка в Unicode, определяющая полный набор международных символов на всех известных языках мира.
Символьные литералы могут быть представлены в виде символа заключенного в одинарные кавычки:
Существует также механизм для непосредственного ввода значения символа в восьмеричной или шестнадцатеричной форме. Для ввода значений в восьмеричной форме служит символ обратной косой черты, за которым следует трехзначное число. Например:
Есть возможность присвоения числового литерала символьному типу. Числовой литерал должен находиться в диапазоне от 0 до 65535. Например:
Символ обратной косой черты может быть использован для обозначения символов не имеющих точного написания, например символ перевода строки, табуляции, backspace, двойные и одинарные кавычки:
Преобразование строк
Строка – это последовательность из одного или больше символов (цифр, букв и других символов). Строки – очень распространённый тип данных в программировании. Существует много способов преобразования строк.
Преобразование чисел в строки
Чтобы конвертировать число в строку, используйте метод str(). Поместите число или переменную в круглые скобки.
Попробуйте преобразовать целое число, например:
Запустив метод str(12) в интерактивной оболочке Python (с помощью команды python), вы получите вывод:
Кавычки означают, что теперь 12 является строкой, а не числом.
Особенно полезно преобразовывать числа в строки, используя переменные. К примеру, можно отследить, сколько строк кода в день пишет тот или иной пользователь. Если пользователь пишет больше 50 строк, программа отправит ему поощрительное сообщение.
Запустив этот код, вы получите ошибку:
Python не может склеивать строки с числами, потому нужно преобразовать значение lines в строку.
Теперь, запустив код, вы увидите:
Метод str() может преобразовать в строку и число с плавающей точкой. Поместите в круглые скобки число или переменную:
Попробуйте выполнить конкатенацию строки и преобразованного в строку числа:
Преобразование строк в числа
Строки можно преобразовать в числа с помощью методов int() и float()
Если в строке нет десятичных знаков, лучше преобразовать её в целое число. Для этого используется int().
Попробуйте расширить предыдущий пример кода, который отслеживает количество написанных строк. Пусть программа отслеживает, сколько строк пишет пользователь каждый день.
При запуске возникла ошибка, поскольку Python не может выполнить сложение строк. Преобразуйте строки в числа и попробуйте снова запустить программу:
Значение переменной lines_more – это число, в данном случае это 58.
Также можно преобразовать числа в предыдущем примере в числа с плавающей точкой. Для этого используйте метод float() вместо int().
К примеру, очки начисляются в десятичных значениях.
В данном случае оператор + склеивает две строки, а не складывает числа. Потому в результате получилось довольно странное значение.
Конвертируйте эти строки в числа с плавающей точкой, а затем выполните сложение.
Как видите, теперь программа возвращает ожидаемый результат.
Если вы попробуете преобразовать строку с десятичными значениями в целое число, вы получите ошибку:
Битовые операции
Помимо арифметических операций, с числами можно делать и битовые, которые интерпретируют их просто как последовательность битов.
Сдвиги
Битовую запись числа можно «сдвигать» влево () или вправо (), что эквивалентно умножению или делению на степень двойки с округлением вниз.
Обычное умножение и деление — не самые быстрые операции, однако все битовые сдвиги всегда работают ровно за один такт. Как следствие, умножение и деление на какую-то фиксированную степень двойки всегда работает быстро — даже если вы не используете сдвиги явно, компилятор скорее всего будет проводить подобную оптимизацию.
Побитовые операции
Помимо , и , существуют их побитовые версии, которые применяют соответствующую логическую операцию к целым последовательностям битов: , , .
Также помимо них есть ещё операция исключающего «или» (XOR), которая записывается как .
Например:
- $13$ & $7$ = $1101_2$ & $0111_2$ = $0101_2$ = $5$
- $17$ | $10$ = $10001_2$ | $01010_2$ = $11011_2$ = $27$
- $17$ ^ $9$ = $10001_2$ ^ $01001_2$ = $11000_2$ = $24$
Все побитовые операции тоже работают за один такт, вне зависимости от типа данных. Для больших не вмещающихся в один регистр битовых последовательностей существует битсет.
JDK 7
Раньше Android не поддерживал JDK 7. Сейчас поддержка имеется и стали доступны новые возможности.
В JDK 7 можно использовать целочисленные литералы в двоичной системе. Для этого нужно использовать префикс 0b или 0B:
Кроме того, в JDK 7 можно вставлять символы подчёркивания для облегчения чтения больших числовых литералов:
Символы подчёркивания будут проигнорированы компилятором. Учтите, что можно использовать несколько подряд символов подчёркивания, но нельзя использовать символы подчёркивания в начале или в конце литерала.
Подобная запись удобна при записи вручную программистом номеров телефонов и тому подобных вещей, чтобы визуально лучше анализировать значения. А умная железка сама разберётся, что к чему и не будет удивляться символам подчёркивания в числах.
литералы:
Если вы вводите исходный код или интерпретатор, Python выполнит преобразование за вас:
Это не сработает с потому что Python будет думать, что вы вместо этого пытаетесь написать законное имя Python:
Номера Python начинаются с цифрового символа, а имена Python не могут начинаться с цифрового символа.
Стоит повторить: «Разрешить int выводить. Если вы передадите 0 в качестве базы, int будет выводить базу из префикса в строке». Как преобразовать из шестнадцатеричного или десятичного (или двоичного) числа в целое число, как это делает интерпретатор Python.
Для любой данной строки s:
Добавление к ответу Дэна выше: если вы предоставите функцию int () шестнадцатеричной строкой, вам нужно будет указать базу как 16, иначе она не подумает, что вы дали ей допустимое значение. Для шестнадцатеричных чисел, не содержащихся в строках, указывать основание 16 не нужно.
Худший способ:
Пожалуйста, не делай этого!
Использование eval в Python — плохая практика?
- 3 Стоит отметить, что к тому же абсурдно медленный, помимо всех других проблем с ним.
- 5 Если это плохая идея, то какой смысл ее поднимать?
- 4 Хорошее замечание. Отчасти потому, что мне это кажется забавным, а отчасти потому, что я видел это в производственном коде.
- Я, наверное, должен отметить, что делал это после того, как испытывал проблемы с возвращает неправильные значения, вызывая некоторые серьезные проблемы с моей средой выполнения (). строка, предоставленная был безопасным, и возвращенное значение было правильным.
- 1 я нашел это забавным и поучительным, я рад, что это было опубликовано
Или же (это безопасно, в отличие от ):
Демо:
Параметр форматирования «% x»%, кажется, также работает для меня в операторах присваивания. (Предполагая Python 3.0 и новее)
пример
Комментарии неверны. выведет не и выведет не
Также обратите внимание, что это строка, но не так, что ваш ответ фактически преобразует int в строку, а не наоборот (вот о чем вопрос). Спасибо за ваш вклад, я согласен, что мой ответ неправильный, и теперь я исправил его
Однако я понимаю, что часть ответа является избыточной, как указано выше, то есть с использованием int (string, base), но все же остальная часть ответа, я полагаю, добавляет больше параметров в сообщение. Согласен ? Не имеет значения; речь идет о преобразовании из базы 16 в базу 10, а не наоборот
Обрабатывает шестнадцатеричный, восьмеричный, двоичный, int и float
Используя стандартные префиксы (например, 0x, 0b, 0 и 0o), эта функция преобразует любую подходящую строку в число. Я ответил на это здесь: https://stackoverflow.com/a/58997070/2464381, но вот необходимая функция.
1 @SergeyVoronezhskiy, 3.8.2 и 3.9 все еще не распознают ‘010’ как восьмеричное (десятичное 8). Кажется, что им все еще требуется 0o приставка. Я уверен, что это сделано для того, чтобы не интерпретировать числа с дополнением 0 как очень необычное восьмеричное. Итак, на самом деле ничего не изменилось с тех пор, как я опубликовал этот ответ в 2019 году.
Если вы используете интерпретатор python, вы можете просто ввести 0x (ваше шестнадцатеричное значение), и интерпретатор автоматически преобразует его для вас.
В Python 2.7 похоже, не работает.
Для меня работает следующее:
6 Как это отвечает на вопрос?
с префиксом ‘0x’ вы также можете использовать функцию eval
Например
- 16 Убедитесь, что проверка ввода выполнена правильно, если используется eval. На самом деле, вероятно, есть способ получше. Не используйте eval.
- 7 На самом наименее ты должен использовать .
- 2 Тоже очень медленно. Худший способ когда-либо.
Целочисленные литералы
Целочисленные литералы — самый используемый тип в программах. Любое целочисленное значение является числовым литералом, т.е. значения 1, 5, 9, 42 и т.п. являются числовыми литералами с основанием 10. Также можно использовать восьмеричные и шестнадцатиричные значения.
Восьмиричные значения обозначаются ведущим нулем (обычные десятичные числа не могут иметь ведущий нуль). По этой причине с виду нормальное число 09 вызовет ошибку компиляции, так как выйдет за пределы диапазона от 0 до 7 допустимых восьмеричных значений.
Шестнадцатиричные значения обозначают ведущим нулём и символом x (икс). Можно использовать маленький (0x) и большой (0X) символ в числах. Диапазон допустимых цифр — от 0 до 15, где цифры от 10 до 15 заменяются буквами от A до F (можно также использовать символы от a до f в нижнем регистре).
Целочисленные литералы создают значения типа int. Если вы создали переменную типа byte или long, а значение литерала находится в диапазоне допустимых значений этих типов, то ошибки не возникает. Не возникает проблем и с типом long, у которого диапазон значений всегда больше, чем у int. Но при этом нужно явно указать, что значение литерала имеет тип long при помощи строчной или прописной буквы L. Например, 899888777666555444333L.
Целочисленное значение можно также присвоить типу char, если оно лежит в допустимых пределах.