Каковы менее известные, но полезные функции языка программирования Python?
- Попробуйте ограничить ответы ядром Python.
- Одна особенность за ответ.
- Приведите пример и краткое описание функции, а не просто ссылку на документацию.
- Пометьте объект, используя заголовок в качестве первой строки.
Быстрые ссылки на ответы:
- Аргумент Распаковка
- фигурные скобки
- Операторы сравнения цепочек
- Декораторы
- Аргумент по умолчанию Gotchas / Опасности изменяемых аргументов по умолчанию
- Дескрипторы
.get
Значение по умолчанию для словаря- Документы Тесты
- Синтаксис нарезки многоточия
- перечисление
- Для / другое
- Функция как аргумент iter ()
- Выражения генератора
import this
- Обмен значениями на месте
- Список степпинга
__missing__
Предметы- Многострочный Regex
- Форматирование именованных строк
- Вложенный список / генератор понимания
- Новые типы во время выполнения
.pth
файлы- ROT13 Кодировка
- Отладка регулярных выражений
- Отправка в генераторы
- Завершение вкладки в Интерактивном переводчике
- Троичное выражение
try/except/else
- Распаковка +
print()
функция with
заявление
python
hidden-features
compie
источник
источник
(< 1 x 10)
. Вы даже можете применить их к отдельным аргументам, например(= 10)
: cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/…Получите дерево разбора регулярных выражений Python для отладки регулярных выражений.
Регулярные выражения - отличная особенность python, но их отладка может быть проблемой, и слишком легко сделать неправильное выражение.
К счастью, python может распечатать дерево разбора регулярных выражений, передав недокументированный экспериментальный скрытый флаг
re.DEBUG
(на самом деле 128)re.compile
.Как только вы поймете синтаксис, вы сможете обнаружить свои ошибки. Там мы можем видеть , что я забыл , чтобы избежать
[]
ин[/font]
.Конечно, вы можете комбинировать его с любыми флагами, например, с регулярными выражениями в комментариях:
источник
перечисление
Оберните итерируемое с enumerate, и оно даст элемент вместе с его индексом.
Например:
Ссылки:
enumerate
источник
Создание генераторов объектов
Если ты пишешь
Вы можете получить генератор и назначить его на х. Теперь это означает, что вы можете сделать
Преимущество этого в том, что вам не нужно промежуточное хранилище, которое понадобилось бы, если бы вы сделали
В некоторых случаях это может привести к значительному ускорению.
Вы можете добавить много операторов if в конец генератора, в основном, копируя вложенные циклы:
источник
iter () может принимать вызываемый аргумент
Например:
iter(callable, until_value)
Функция многократно вызываетcallable
и дает свой результат , покаuntil_value
не будет возвращен.источник
lambda
здесь необходимо ключевое слово?Будьте осторожны с изменяемыми аргументами по умолчанию
Вместо этого вы должны использовать значение Sentinel, обозначающее «не дано», и заменить его изменяемым по умолчанию:
источник
foo.func_defaults
. Который, будучи кортежем, неизменен.Отправка значений в функции генератора . Например, имея эту функцию:
Вы можете:
источник
Если вам не нравится использовать пробелы для обозначения областей, вы можете использовать стиль C {}, выполнив:
источник
Шаг аргумента в операторах среза. Например:
Особый случай
x[::-1]
- полезная идиома для «x перевернутый».источник
Декораторы
Декораторы позволяют обернуть функцию или метод в другую функцию, которая может добавить функциональность, изменить аргументы или результаты и т. Д. Декораторы пишутся на одну строку выше определения функции, начиная со знака «at» (@).
Пример показывает
print_args
декоратор, который печатает аргументы декорированной функции перед ее вызовом:источник
Синтаксис for ... else (см. Http://docs.python.org/ref/for.html )
Блок "else" будет обычно выполняться в конце цикла for, если не вызывается break.
Приведенный выше код можно эмулировать следующим образом:
источник
Начиная с 2.5, у dicts есть специальный метод,
__missing__
который вызывается для отсутствующих предметов:Существует также ДИКТ подкласс
collections
называется ,defaultdict
что делает почти то же самое , но вызывает функцию без аргументов для не существующих пунктов:Я рекомендую преобразовывать такие диктовки в обычные, прежде чем передавать их функциям, которые не ожидают таких подклассов. Много кода использует
d[a_key]
и перехватывает KeyErrors, чтобы проверить, существует ли элемент, который добавит новый элемент в dict.источник
m={}; m.setdefault('foo', []).append(1)
.defaultdict
также более мощный, чемsetdefault
метод в других случаях. Например, для счетчика -dd = collections.defaultdict(int) ... dd[k] += 1
противd.setdefault(k, 0) += 1
.Обмен значениями на месте
Правая часть присваивания является выражением, которое создает новый кортеж. Левая часть назначения немедленно распаковывает этот (без ссылок) кортеж с именами
a
иb
.После назначения новый кортеж не имеет ссылок и помечается для сборки мусора, а значения, связанные с
a
иb
были заменены.Как отмечено в разделе учебника Python по структурам данных ,
источник
Читаемые регулярные выражения
В Python вы можете разбить регулярное выражение на несколько строк, назвать свои совпадения и вставить комментарии.
Пример подробного синтаксиса (из Dive в Python ):
Пример совпадения имен (из HOWTO Regular Expression )
Вы также можете подробно написать регулярное выражение без использования
re.VERBOSE
конкатенации строковых литералов.источник
Распаковка аргумента функции
Вы можете распаковать список или словарь в качестве аргументов функции, используя
*
и**
.Например:
Очень полезный ярлык, поскольку списки, кортежи и тексты широко используются в качестве контейнеров.
источник
ROT13 является допустимой кодировкой для исходного кода, когда вы используете правильное объявление кодировки в верхней части файла кода:
источник
cevag h"Uryyb fgnpxbiresybj!"
Создание новых типов в полностью динамичной манере
что точно так же, как
Наверное, не самая полезная вещь, но приятно знать.
Редактировать : Исправлено имя нового типа, должно
NewType
быть точно так же, как сclass
оператором.Редактировать : откорректировать заголовок, чтобы более точно описать функцию.
источник
Менеджеры контекста и оператор "
with
"Представленный в PEP 343 , менеджер контекста - это объект, который действует как контекст времени выполнения для набора операторов.
Поскольку эта функция использует новые ключевые слова, она вводится постепенно: она доступна в Python 2.5 через
__future__
директиву. В Python 2.6 и выше (включая Python 3) он доступен по умолчанию.Я часто использовал выражение «с», потому что я думаю, что это очень полезная конструкция, вот короткая демонстрация:
За кулисами происходит то, что оператор with вызывает special
__enter__
и__exit__
методы для объекта file. Сведения об исключении также передаются__exit__
если какое-либо исключение было вызвано из тела оператора with, что позволяет обрабатывать исключения там.В данном конкретном случае это делает для вас то, что он гарантирует, что файл будет закрыт, когда выполнение выпадает из области действия
with
пакета, независимо от того, происходит ли это нормально или выдается исключение. Это в основном способ абстрагирования общего кода обработки исключений.Другие общие случаи использования для этого включают блокировку с потоками и транзакциями базы данных.
источник
withs
:)with open('filea') as filea and open('fileb') as fileb: ...
with open('filea') as filea, open('fileb') as fileb: ...
В словарях есть метод get ()
В словарях есть метод get (). Если вы делаете d ['key'], а key там нет, вы получите исключение. Если вы делаете d.get («ключ»), вы получите «Нет», если «ключ» не существует. Вы можете добавить второй аргумент, чтобы вернуть этот элемент вместо None, например: d.get ('key', 0).
Это здорово для таких вещей, как сложение чисел:
sum[value] = sum.get(value, 0) + 1
источник
get(key, None)
. Не знал, чтоNone
было предоставлено по умолчанию.Дескрипторы
Они - магия целого ряда основных функций Python.
Когда вы используете точечный доступ для поиска элемента (например, xy), Python сначала ищет элемент в словаре экземпляра. Если он не найден, он ищет его в словаре классов. Если он находит его в словаре классов и объект реализует протокол дескриптора, а не просто возвращает его, Python выполняет его. Дескриптор является любой класс , который реализует
__get__
,__set__
или__delete__
методы.Вот как бы вы реализовали свою собственную (только для чтения) версию свойства, используя дескрипторы:
и вы будете использовать его так же, как встроенное свойство ():
Дескрипторы используются в Python для реализации, среди прочего, свойств, связанных методов, статических методов, методов класса и слотов. Понимание их позволяет легко понять, почему многие вещи, которые ранее выглядели как «причуды» Python, являются такими, какие они есть.
У Раймонда Хеттингера отличный учебник , который намного лучше описывает их, чем я.
источник
foo = property(lambda self: self.__foo)
property
сама реализована с помощью дескрипторов, о чем и шла моя статья .Условное присвоение
Он делает именно то, на что это похоже: «присвойте 3 x, если y равен 1, иначе присвойте 2 x». Обратите внимание, что эти символы не нужны, но они мне нравятся для удобства чтения. Вы также можете связать это, если у вас есть что-то более сложное:
Хотя в определенный момент это заходит слишком далеко.
Обратите внимание, что вы можете использовать if ... else в любом выражении. Например:
Здесь func1 будет вызываться, если y равно 1, а func2 в противном случае. В обоих случаях соответствующая функция будет вызываться с аргументами arg1 и arg2.
Аналогично, действует также следующее:
где class1 и class2 - это два класса.
источник
x = ((y == 1) ? 3 : 2)
имеет больше смысла для меняDoctest : документация и юнит-тестирование одновременно.
Пример извлечен из документации Python:
источник
locals()
затем в вашем doctest dolocals().update(setUp())
= DИменованное форматирование
% -форматирование требует словаря (также применяется проверка% i /% s и т. д.).
И поскольку locals () также является словарем, вы можете просто передать его как dict и иметь% -подстановки из ваших локальных переменных. Я думаю, что это осуждается, но упрощает вещи ..
Новый стиль форматирования
источник
Чтобы добавить больше модулей Python (особенно сторонних), большинство людей, похоже, используют переменные среды PYTHONPATH или добавляют символические ссылки или каталоги в свои каталоги пакетов сайтов. Другой способ, это использовать * .pth файлы. Вот официальное объяснение Python Doc:
источник
Исключение остальное :
Использование предложения else лучше, чем добавление дополнительного кода к предложению try, поскольку оно позволяет избежать случайного перехвата исключения, которое не было вызвано кодом, защищаемым оператором try ... кроме.
См. Http://docs.python.org/tut/node10.html.
источник
Возобновление исключения :
Оператор поднятия без аргументов в обработчике ошибок говорит Python повторно вызвать исключение с исходным неповрежденным отслеживанием , что позволяет вам сказать «о, извините, извините, я не хотел это улавливать, извините, извините. "
Если вы хотите распечатать, сохранить или использовать оригинальную трассировку, вы можете получить ее с помощью sys.exc_info (), и распечатать ее, как это сделал бы Python, с помощью модуля traceback.
источник
raise e
вместо этого, что не сохраняет первоначальную трассировку.exc_info = sys.exc_info(); raise exc_info[0], exc_info[1], exc_info[2]
эквивалентно этому, но вы можете изменить эти значения (например, изменить тип исключения или сообщение)Основные сообщения :)
Дешифрованный :
источник
print s.translate("".join(chr(64<i<91 and 65+(i-52)%26 or 96<i<123 and 97+(i-84)%26 or i) for i in range(256)))
и теперь он выглядит намного лучше !! :-DЗавершение интерактивной вкладки переводчика
Вам также нужно будет установить переменную окружения PYTHONSTARTUP.
источник
easy_install ipdb
тогда вы можете использоватьimport ipdb; ipdb.set_trace()
readline.parse_and_bind ("bind ^I rl_complete")
Вложенные списки и выражения генератора:
Они могут заменить огромные куски кода с вложенными циклами.
источник
for
операторов должен быть написан в том порядке, в котором вы ожидаете, что он будет записан в стандартном цикле for, снаружи внутрь.for
s иif
syield x
внутри. Чтобы преобразовать это в выражение генератора, переместитеx
сначала, удалите все двоеточия (иyield
) и заключите все это в круглые скобки. Вместо этого для понимания списка замените внешние скобки квадратными скобками.Перегрузка оператора для
set
встроенного:Более подробная информация из стандартной библиотеки: Набор типов
источник