Функции модуля Python используются неожиданным образом - PullRequest
4 голосов
/ 18 сентября 2008

На основе "Разделить строку пробелами в Python" , которая использует shlex.split для умного разделения строки с кавычками, мне было бы интересно услышать о других распространенных задачах решается неочевидными стандартными библиотечными функциями.

Если это превратится в Модуль недели , это тоже хорошо.

Ответы [ 10 ]

6 голосов
/ 18 сентября 2008

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

Этот модуль поддерживает ведение списка в отсортированном порядке без необходимости сортировки списка после каждой вставки.

Использование очень просто:

>>> import bisect
>>> lst = [4, 7, 10, 23, 25, 100, 103, 201, 333]
>>> bisect.bisect_left(lst, 23)
3

Вы должны помнить, что линейный поиск чего-то в списке происходит быстрее за элементом, чем сортировка списка и последующий бинарный поиск. Первый вариант - O (n), второй - O (nlogn).

4 голосов
/ 18 сентября 2008

Не замеченные модули, использование и уловки:

collection.defaultdict (): когда вы хотите, чтобы отсутствующие ключи в dict имели значение по умолчанию.

functools.wraps (): для написания декораторов, которые хорошо играют с самоанализом.

posixpath: модуль os.path для систем POSIX. Вы можете использовать его для управления путями POSIX (включая элементы URI) даже в Windows и других системах, отличных от POSIX.

ntpath: модуль os.path для Windows; используется для манипулирования путями Windows в системах, отличных от Windows.

(также: macpath для MacOS 9 и более ранних версий, os2emxpath для OS / 2 EMX, но я не уверен, что кому-то все равно.)

pprint: более структурированная печать repr () контейнеров значительно упрощает отладку.

imp: все инструменты, необходимые для написания собственной системы плагинов или создания модулей импорта Python из произвольных архивов.

rlcompleter: получение табуляции в обычном интерактивном интерпретаторе. Просто выполните "import readline, rlcompleter; readline.parse_and_bind ('tab: complete')"

переменная среды PYTHONSTARTUP: можно указать путь к файлу, который будет выполняться (в основном пространстве имен) при входе в интерактивный интерпретатор; полезно для вещей, как в рецепте rlcompleter выше.

3 голосов
/ 18 сентября 2008

Я использую itertools (особенно циклические, повторяющиеся, цепочечные), чтобы заставить Python вести себя более как R и в других функциональных / векторных приложениях Часто это позволяет мне избежать накладных расходов и усложнений Numpy.

# in R, shorter iterables are automatically cycled
# and all functions "apply" in a "map"-like way over lists
> 0:10 + 0:2
 [1]  0  2  4  3  5  7  6  8 10  9 11

Python # Нормальный питон В [1]: диапазон (10) + диапазон (3) Out [1]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2]

## this code is terrible, but it demos the idea.
from itertools import cycle
def addR(L1,L2):
    n = max( len(L1), len(L2))
    out = [None,]*n
    gen1,gen2 = cycle(L1), cycle(L2)
    ii = 0
    while ii < n:
        out[ii] = gen1.next() + gen2.next()
        ii += 1
    return out

In [21]: addR(range(10), range(3))
Out[21]: [0, 2, 4, 3, 5, 7, 6, 8, 10, 9]
2 голосов
/ 18 сентября 2008

getpass полезно для определения имени пользователя для текущего пользователя.

grp позволяет вам искать идентификаторы группы Unix по имени, и наоборот.

dircache может быть полезно в ситуациях, когда вы неоднократно опрашиваете содержимое каталога.

glob может найти имена файлов, соответствующие символам подстановки, как это делает оболочка Unix.

shutil полезно, когда вам нужно скопировать, удалить или переименовать файл.

csv может упростить разбор текстовых файлов с разделителями.

optparse обеспечивает надежный способ анализа параметров командной строки.

bz2 пригодится, когда вам нужно манипулировать файлом, сжатым bzip2.

urlparse избавит вас от необходимости разбивать URL на составные части.

2 голосов
/ 18 сентября 2008

Я обнаружил, что struct.unpack - находка для распаковки двоичных форматов данных после того, как я узнал об этом!

1 голос
/ 19 сентября 2008

комплексные числа. (Complexobject.c определяет класс, поэтому технически это не модуль). Отлично подходит для 2D координат, с легким переводом / вращением и т. Д.

например.

TURN_LEFT_90= 1j
TURN_RIGHT_90= -1j

coord= 5+4j # x=5 y=4
print coord*TURN_LEFT_90
1 голос
/ 19 сентября 2008

Модуль pickle очень хорош

1 голос
/ 19 сентября 2008

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

Недостатком является то, что его API немного неуклюже, но это улучшается в Py2.6 / Py3.0.

1 голос
/ 18 сентября 2008

Большинство других примеров просто игнорируются, а не неожиданно используются для модуля.

fnmatch, как и shlex, может применяться неожиданным образом. fnmatch является своего рода RE бедного человека и может использоваться не только для сопоставления файлов, он может сравнивать строки с упрощенными шаблонами шаблонов.

1 голос
/ 18 сентября 2008

Я нашел модуль sched , который будет полезен в cron-подобных действиях. Это сильно упрощает вещи. К сожалению, я нашел это слишком поздно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...