Порядковый номер числа питон

Порядковый номер целых чисел в Python

Я работаю над программой, где храню некоторые данные в целых числах и обрабатываю их поразрядным образом. Например, я могу получить число 48, которое я буду обрабатывать поэтапно. В целом, конечность целых чисел зависит от машинного представления целых чисел, но делает ли Python что-либо, чтобы гарантировать, что ints всегда будет мало-endian? Или мне нужно проверить соответствие, как я бы на C, а затем написать отдельный код для двух случаев? Я спрашиваю, потому что мой код работает на машине Sun, и, хотя тот, на котором он работает, теперь использует процессоры Intel, мне, возможно, придется переключиться на машину с процессорами Sun в будущем, и я знаю, что это big-endian.

4 ответа

Python int имеет ту же конечность, что и процессор, над которым он работает. Модуль struct позволяет конвертировать байтовые капли в ints (и наоборот, и некоторые другие типы данных тоже) как в native, little-endian, или big-endian способами, в зависимости от строка формата, которую вы выбираете: запустите формат с помощью @ или нет символа энтитичности, чтобы использовать встроенную endianness (и собственные размеры — все остальное использует стандартные размеры), ‘~’ для native, ‘ ‘ или ‘!’ для больших стран. Это байтовое число, а не побитовое; не уверен точно, что вы подразумеваете под побитовой обработкой в ​​этом контексте, но я предполагаю, что он может быть размещен аналогичным образом. Для быстрой «массовой» обработки в простых случаях рассмотрите также модуль array — методы fromstring и tostring может работать на большом количестве байтов быстро, а метод byteswap может получить вас «другой» endianness (родной для не-native или наоборот), снова быстро и для большого количества элементов (весь массив).

Похоже, что Python всегда с прямым порядком байтов даже в системе с прямым порядком байтов. Пример: печать 0x0001 будет печатать 1

@David天宇Wong 天宇 Вонг, вы выводите совершенно необоснованные выводы из своего наблюдения — 0x0001 — это просто странно избыточная шестнадцатеричная запись для целого числа 1 , не имеющая ничего общего с внутренним представлением!

Если вам нужно обработать ваши данные «поразмерно», вам может помочь bitstring . Он также может иметь дело с контентом между платформами (по крайней мере, по последнему строчку сборки), которые будут выпущены в ближайшие несколько дней.

>>> from struct import * >>> pack('hhl', 1, 2, 3) '\x00\x01\x00\x02\x00\x00\x00\x03' >>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03') (1, 2, 3) 

Чтобы программно определить консистенцию платформы, вы можете использовать

который либо вернет «big» , либо «little» .

Я видел много такого рода объяснений (также слава для sys.byteorder, не знал этого), но я должен спросить. Допустим, у меня есть какой-то неизвестный файл, который я хочу прочитать. Как я могу узнать, являются ли некоторые константные символы короткими или длинными и / или большими и мало-порядковыми?

Читайте также:  Python ловим все ошибки

@Danilo: Данило: В общем, вы не можете сказать. Чтобы выполнить обратный инжиниринг неизвестного формата файла, вы можете посмотреть на данные и угадать, какой размер / порядковый номер имеет больше смысла. Для иллюстрации, если вы распакуете мой пример с неправильным порядком байтов, вы получите (256, 512, 50331648) вместо (1, 2, 3), что является разумной подсказкой, что вы ошиблись .

При выполнении побитовых операций int in будет иметь такую ​​же endianess, что и введенные вами int. Вам не нужно это проверять. Вам нужно только об этом заботиться при преобразовании в/из последовательностей байтов на обоих языках, afaik.

В Python для этого используется структурный модуль, чаще всего struct.pack() и struct.unpack().

Это важно, потому что я делаю в своем коде что-то вроде этого: if (a >> 2 & 1) . elif (b >> 3 & 1) . но на bigendian я должен написать if (a

@Gordon: Гордон: я не думаю, что это правильно. Есть ли здесь какая-то путаница между байтовым большим и меньшим порядком байтов и немного большим и меньшим порядком байтов? Если a является целым числом, то вам, вероятно, не нужно беспокоиться о его порядке байтов, это только вопрос того, как вы создали его из необработанных байтовых данных.

@Gordon: Гордон: Нет, вы бы не. Big / small-endian не меняет порядок битов, но порядок байтов . Операции сдвига обрабатывают это, как в Python, так и в C (поскольку они фактически используют операции сдвига процессоров).

Следующий фрагмент скажет вам, является ли ваш системный по умолчанию малозначимым (в противном случае это big-endian)

import struct little_endian = (struct.unpack(' 

Обратите внимание, что это не повлияет на поведение побитовых операторов: 1

Ещё вопросы

  • 0 Как передать структуру функции в C ++
  • 1 Вставка в базу данных с помощью LINQ
  • 1 Python - удаление пропорции / процента словарных пар
  • 0 KineticJS - передать элемент DOM в конструктор
  • 1 Как сделать запрос к инвертированному индексу с нефиксированным количеством ключевых слов?
  • 0 JQuery диалог закрывается при переходе на VB код
  • 1 ASP.net MVC параметры маршрутизации
  • 1 Установить кортеж в качестве имени столбца в Pandas
  • 0 Не могу знать поведение клика на отключенном элементе
  • 1 Чтение данных из Hashmap - Android studio, Firebase
  • 1 не удается скрыть бар Лебель на временной шкале Google
  • 1 Эффективная фильтрация больших наборов многоключевых объектов
  • 1 MVC Linq OrderBy не сохраняется в Razor View
  • 1 Параметры DRYing MVC helper
  • 0 PHP время назад (возвращает неверное время)
  • 1 Android-редактирование smali: младшие биты должны быть нулем
  • 0 2 указателя даты в одном поле ввода
  • 0 почему nl2br много
  • 1 Linq обновляет другую таблицу после процесса соединения
  • 1 Независимая ось для каждого участка в pandas boxplot
  • 1 как отключить кнопку на основе результата функции JavaScript
  • 0 Можно ли изменить значение ng-модели из события другого элемента - angularjs
  • 0 Добавление чего-либо в массив
  • 0 MYSQL третье внутреннее объединение не работает
  • 0 PHPStorm «Доступ к членам класса при создании экземпляра» phpDoc
  • 1 Как написать большое количество текста, чтобы написать характеристику
  • 0 как установить изображение в div
  • 1 Получите html пакет аджилити ширины адреса
  • 1 Spring Security Вход в систему
  • 1 Извлечение списка из списка списков и добавление к фрейму данных
  • 1 Выполнение пакетного файла с зависимостью пути в c #
  • 0 fnfilter проблема поиска в datatables
  • 1 Удаление строк из столбца Pandas DataFrame
  • 0 codeigniter получить количество num_rows
  • 1 Удаление одинаковых выбросов в двух временных сериях
  • 1 Android загружает значения из файла строк по умолчанию (strings.xml) после изменения локали во второй раз
  • 0 привязка к объекту iframe или html5
  • 1 Запустите приложение Python Flask с модулем nginx
  • 0 Как обновить набор указателей с ++?
  • 0 Динамический выпадающий список с использованием HTML и PHP
  • 0 Выберите не связывать с моделью
  • 1 Как я могу контролировать android.util.log или переопределить его?
  • 0 Сохранить несколько данных в массиве обслуживания из контроллера?
  • 0 Заполните два списка выбора одной функцией / jQuery
  • 0 Как отследить все клики на странице в ионном приложении?
  • 1 Python - sklearn.MLPClassifier: Как получить выходные данные первого скрытого слоя
  • 1 MsSql server 2008 r2 Синхронизация данных
  • 0 Отрицательные биты не работают как ожидалось PHP
  • 1 ValueError: недопустимый литерал для int () с основанием 10: '' при запросе ввода
  • 1 Объедините несколько строк кода C # для краткости или отдельно для ясности

Источник

Встроенные функции

Язык Python включает много уже определенных, то есть встроенных в него, функций. Программист не видит их определений, они скрыты где-то в "недрах" языка. Достаточно знать, что эти функции принимают и что возвращают, то есть их интерфейс.

Ряд встроенных функций, касающихся ввода-вывода и типов данных, мы уже использовали. Это print() , input() , int() , float() , str() , bool() , type() . Перечень всех встроенных в Python функций можно найти в официальной документации по языку: https://docs.python.org/3/library/functions.html .

В этом уроке рассмотрим следующие встроенные функции, условно разбив их на группы:

  • функции для работы с символами – ord() , chr() , len()
  • математические функции – abs() , round() , divmod() , pow() , max() , min() , sum()

Функция ord() позволяет получить номер символа по таблице Unicode. Соответственно, принимает она в качестве аргумента одиночный символ, заключенный в кавычки:

>>> ord('z') 122 >>> ord('ф') 1092 >>> ord('@') 64

Функция chr() выполняет обратное действие. Она позволяет получить символ по его номеру:

>>> chr(87) 'W' >>> chr(1049) 'Й' >>> chr(10045) '✽'

Чтобы не путать ord() и chr() , помните, что функция – это действие. Ее имя как бы отвечает на вопрос "Что сделать?". Order – это порядок. Значит, мы хотим получить порядковый номер элемента в ряду. А чтобы получить номер, должны передать символ. Character – это символ. Значит, мы хотим получить символ. Поэтому должны передать порядковый номер.

Функция len() в качестве аргумента принимает объект, который состоит из более простых объектов, количество которых она подсчитывает. Числа – это простые объекты, их нельзя передавать в len() . Строки можно:

>>> len('abc') 3 >>> s1 = '------' >>> s2 = '_______' >>> len(s1) > len(s2) False >>> len(s1) 6 >>> len(s2) 7

Кроме строк в len() можно передавать другие, еще не изученные нами, структуры данных.

Функция abs() возвращает абсолютное значение числа:

Если требуется округлить вещественное число до определенного знака после запятой, то следует воспользоваться функцией round() :

>>> a = 10/3 >>> a 3.3333333333333335 >>> round(a, 2) 3.33 >>> round(a) 3

Если второй аргумент не задан, то округление идет до целого числа. Есть одна специфическая особенность этой функции. Второй аргумент может быть отрицательным числом. В этом случае округляться начинают единицы, десятки, сотни и т. д., то есть целая часть:

>>> round(5321, -1) 5320 >>> round(5321, -3) 5000 >>> round(5321, -4) 10000

Функция именно округляет согласно правилу округления из математики, а не отбрасывает. Поэтому 5 тысяч неожиданно округляются до десяти.

>>> round(3.76, 1) 3.8 >>> round(3.72, 1) 3.7 >>> round(3.72) 4 >>> round(3.22) 3

Если нужно просто избавиться от дробной части без округления, следует воспользоваться функцией int() :

Нередко функцию round() используют совместно с функцией print() , избегая форматирования вывода:

>>> a = 3.45673 >>> print("Number: %.2f" % a) Number: 3.46 >>> print("Number:", round(a, 2)) Number: 3.46

В последнем случае код выглядит более ясным.

Функция divmod() выполняет одновременно деление нацело и нахождение остатка от деления:

>>> divmod(10, 3) (3, 1) >>> divmod(20, 7) (2, 6)

Возвращает она кортеж. В некоторых других языках встречаются две отдельные функции: div() и mod() . Первая делит нацело, вторая находит остаток от целочисленного деления (деления по модулю). В Python и многих других языках для этого используются специальные символы-операнды:

Функция pow() возводит в степень. Первое число – основание, второе – показатель:

То же самое можно проделать так:

Однако pow() может принимать третий необязательный аргумент. Это число, на которое делится по модулю результат возведения в степень:

Преимуществом первого способа является его более быстрое выполнение.

Функции max() , min() и sum() находят соответственно максимальный, минимальный элемент и сумму элементов аргумента:

>>> max(10, 12, 3) 12 >>> min(10, 12, 3, 9) 3 >>> a = (10, 12, 3, 10) >>> sum(a) 35

В sum() нельзя передать перечень элементов, должна быть структура данных, например, кортеж. В min() и max() также чаще передают один так называемый итерируемый объект:

Практическая работа

  1. Напишите программу, которая циклично запрашивает у пользователя номера символов по таблице Unicode и выводит соответствующие им символы. Завершает работу при вводе нуля.
  2. Напишите программу, которая измеряет длину введенной строки. Если строка длиннее десяти символов, то выносится предупреждение. Если короче, то к строке добавляется столько символов * , чтобы ее длина составляла десять символов, после чего новая строка должна выводиться на экран.
  3. Напишите программу, которая запрашивает у пользователя шесть вещественных чисел. На экран выводит минимальное и максимальное из них, округленные до двух знаков после запятой. Выполните задание без использования встроенных функций min() и max() .

Примеры решения и дополнительные уроки в pdf-версии курса

Python. Введение в программирование

Источник

Оцените статью