Spam python что это
Перейти к содержимому

Spam python что это

Почему язык Python, а большинство примеров spam

Язык Python назван в честь английской комик-группы Монти Пайтона (Monty Python).

В большинстве книжек по языку Python, в примерах очень часто используется слово spam.

До тех пор пока не прочитал книгу Марка Лутца «Изучаем Python», не мог понять почему так часто используется именно spam.

Оказывается у комик-группы Монти-Пайтона есть пародия, где герои сериала пытаются заказать блюдо в кафетерии, а их заглушает хор викингов, поющих песню о консервах с ветчиной (spam).

Лутц в книжке не мог вставить эту пародию в свою книгу, поэтому восполняем этот пробел )))

Советы Google по кодированию на языке Python. Часть вторая: советы по форматированию исходного кода


Доброго времени суток. Вот и пришло время для публикации второй части так понравившегося многим хабровчанам перевода стайл гайда для языка Python от компании Google, (первая часть бережно хранится хабром). Теперь мы коснемся напрямую форматирования исходного кода на языке программирования Python. Как известно, чистота — залог здоровья, а чистота программного кода — залог уважения коллег и (в идеале) поощрения от кого-нибудь свыше. Вообще, Python сам по себе является хорошо читаемым языком, и даже синтаксис данного языка призывает к порядку в коде (и, как следствие — в голове). Но каждый из нас сам себе документатор и сам себе творец оформления. А как уже говорилось однажды — ко мнению авторитетных товарищей нельзя не прислушиваться. Итак, вторая часть Google Python Style Guide — Python Style Rules ждет Вас под катом. И pdf тут как тут.

Python Style Rules
Точки с запятой
Длина строки
Исключения
  • Длинные строки импорта
  • URL в комментариях

Когда Ваш текст не помещается в одну строку, используйте скобки для явного объединения строк.

Что касается комментариев, располагайте длинный URL, если это необходимо, на одной строке.

Обратите внимание на отступ элемента в строке выше (смотрите раздел про отступы, чтобы получить разъяснения).

Скобки

Не используйте их (скобки) с выражением return или с условной конструкцией, если не требуется организовать перенос строки. (Смотрите выше). Однако скобки хорошо использовать для создания кортежей.

Отступы

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

Пустые строки
Пробелы

Никаких пробелов внутри каких-либо скобок.
Хорошо: spam(ham[1], , [])
Плохо: spam( ham[ 1 ], < eggs: 2 >, [ ] )

Никаких пробелов перед запятой, точкой с запятой, либо точкой. Используйте пробел после запятой, точки с запятой или точкой, исключая тот случай, когда они находятся в конце строки.

Никаких пробелов перед открывающей скобкой, которая начинает список аргументов, индекс или срез.
Хорошо: spam(1)
Плохо: spam (1)
Хорошо: dict[‘key’] = list[index]
Плохо: dict [‘key’] = list [index]
Окружайте бинарные операторы одиночными пробелами с каждой стороны, это касается присваивания (=), операторов сравнения (==, <, >, !=, <>, <=, >=, in, not in, is, is not), и булевых операторов (and, or, not). Используйте как вам покажется правильно окружение
пробелами по отношению к арифметическим операторам, но всегда расстановка пробелов по обоим сторонам бинарного оператора будет придавать целостность Вашему коду.
Хорошо: x == 1
Плохо: x<1
Не используйте пробелы по сторонам знака » python»>def complex(real, imag=0.0): return magic(r=real, i=imag)

Не используйте пробелы для вертикального выравнивания кусков последовательных строк, так как такие выравнивания оказываются обременительными. (Относится и к :,#,=, и т.д.):

Строка #! (хэш-бэнг)
Комментарии

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

Строки документации.

Python имеет уникальный стиль комментирования — строки документации. Строка документации это строка, которая является первой конструкцией в пакете, модуле, классе или функции. Такие строки могут быть экспортированы автоматически с помощью атрибута объекта __doc__ и используются pydoc-ом. (Попробуйте запустить pydoc на своем модуле, чтобы увидеть как это выглядит.) Наше соглашение по строкам документации велит использовать три двойные кавычки для обрамления такой строки. Строки документации должны быть организованы как суммарная строка (одна физическая строка), сносящаяся по кол-ву символов, знаку вопроса или восклицательному знаку, следующим за пустой строкой, а затем остальные строки документации с позиции курсора в качестве первой кавычки первой строки. Ниже описано еще больше информации по оформлению строк документирования.

Модули

Каждый файл должен содержать в себе шаблон лицензии. Выберите подходящий шаблон лицензии для вашего проекта.(Например, Apache 2.0, BSD, LGPL, GPL).

Функции и методы
  • Не видима снаружи модуля
  • Очень короткая
  • Очевидная (легко читаемая)
Классы

Классы должны иметь строку документации ниже своего объявления. Если Ваш класс имеет публичные атрибуты, они должны быть документированы тут же в разделе Attributes и следовать тому же стилю форматирования, что и раздел Args.

Блоки и инлайновые комментарии

Последнее место, которое должны иметь комментарии — это хитрые места в коде. Если Вы хотите пояснить их в Вашем следующем код-ревью, то вы должны прокомментировать их сейчас. Сложные операции, занимающие несколько строк документации перед ее выполнением. Неявные части должны иметь комментарий в конце строки.

Чтобы улучшить читаемость, такие комменарии должны находиться на расстоянии по меньшей мере 2-х пробелов от кода. С другой стороны, лучше вообще не описывайте код. Преположите, что человек, читающий данный код, знает Python (а не то, что вы пытались делать) лучше, чем Вы.

Классы

Это также касается вложенных классов.

Наследование от класса object необходимо, чтобы позволить свойствам работать правильно, и защитит Ваш код от возможной несовместимости с Python 3000. В нем так же определяются специальные методы, которые реализуют стандартную семантику объекта, например: __new__, __init__, __delattr__, __getattribute__, __setattr__, __hash__, __repr__, и __str__.

Строки

Используйте оператор % для форматирования строк, даже если все параметры являются строками. Тщательно взвесте использование оператора + взамен оператора %.

Избегайте использования операторов + и +=, чтобы сконкатенировать строку при помощи цикла, т.к. строки — это неизменяемый тип данных, такой подход создает ненужные объекты и увеличивает время работы по квадратичному, а не линейному закону. Вместо этого просто добавьте каждую подстроку в список и используйте метод join после того, как цикл завершится ( или записывайте каждую подстроку в буфер cStringIO.StringIO)

Используйте “”” для многострочных строк вместо “”. Заметьте, однако, что всегда лучше использовать явное объединение строк, т.к. многострочные строки не продолжаются до конца программы с таким же отступом.

Файлы и сокеты
  • Они могут потреблять ограниченные системные ресурсы, такие как файловые дескрипторы. Код, который связан со множеством объектов, может приводить к истощению тех ресурсов без пользы, если они не будут возвращены системе после использования.
  • Содержание файлов в открытом виде может препятствовать другим действиям быть произведенными над ними, таким как, например, перемещение или удаление.
  • Файлы и сокеты, которые общедоступны через код, могут быть ненароком прочитаны или записаны после того, как они были логически «закрыты».
  • Нет гарантий, что во время выполнения программы будет вызван декструкор объекта. Разные реализации Python используют разные подходы к управлению памятью, такие как отложенная сборка мусора, которая может существенно продлить жизнь «удаленного» объекта.
  • Неожиданные ссылки на файл могут заставить его «жить» дольше, чем мы этого ожидаем (например, стек исключений, глобальные объекты и т.д.)
  • Приоритетный способ управлять файлами — это использование конструкции with.

Подобные циклу for объекты, которые не поддерживают конструкцию with и используют contextlib.closing()

Старый код, написанный под Python 2.5, может подключить возможность использования конструкции with при помощи импорта «from __future__ import with_statement«.

Комментарий TODO

Комментарии-TODO должны включать в себя строку TODO в начале каждого комментария, следующую за имменем, электронным адресом или другим идентификатором того, что лучше сможет обеспечить решение проблемы, указанной в скобках. Точка необязательна. Комментарий, объясняющий что там должно происходить, не требуется. Главная цель — это общий формат для TODO, который позволит быстро найти определенного челвоека, который сможет обеспечить более детальное описание проблемы. TODO не является залогом того, что человек решит данную проблему. Таким образом, когда Вы создаете TODO, он почти всегда содержит только Ваше имя.

Оформление импортов
  • Импорты из стандартной библиотеки
  • Сторонние импорты
  • Импорты из библиотек Вашего приложения
Конструкции

Однако вы можете расположить результат текста на той же строке, на которой у Вас рапологается условие. Но это можно сделать только в том случае, когда все выражение помещается на одной строке. В частности, Вы никогда не сможете это сделать с конструкцией try/except, т.к. try и except не могут находиться в одной строке, и Вам доступно помещение в одну строку только с конструкцией if БЕЗ else.
Хорошо:

Контроль доступа
Именование

module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_CONSTANT_NAME, global_var_name, instance_var_name, function_parameter_name, local_var_name.

  • Односимвольные имена, исключая счетчики, либо итераторы
  • Минусы в именах модулей и пакетов.
  • Двойные подчеркивания (в начале и конце имен) — зарезервированы для языка.
  • «Внутренний» — означает внутренний для модуля, защищенный или приватный класс.
  • Подстановка ведущего подчеркивания (_) поддерживается для защищенных переменных модуля и функций (которые не импортируются при import * from)
  • Подстановка двойного ведущего подчеркивания (__) к имени переменной или метода эффективно делает их приватными для данного класса (использует добавление к имени). Помещение связанных классов и уровней верхнего уровня вместе в модуле. В отличие от Java, не нужно ограничивать себя в создании одного класса в одном модуле.
  • Используйте верблюжью нотацию для именования классов, а нотацию с прописными буквами и подчеркиваниями для имен модулей. Хотя существует много модулей использующих для именования верблюжью нотацию, но так не рекомендуется делать, ведь это может вводить в заблуждение, т.к. модуль называется в честь класса. (погодите, не писал ли я import StringIO или from StringIO import StringIO?)

Стили основаны на рекоммендациях Гвидо:

Тип Внешний Внутренний
Пакеты lower_with_under
Модули lower_with_under _lower_with_under
Классы CapWords _CapWords
Исключения CapWords
Функции lower_with_under() _lower_with_under()
Глобальные/Внутриклассовые константы CAPS_WITH_UNDER _CAPS_WITH_UNDER
Глобальные/Внутриклассовые переменные lower_with_under _lower_with_under
Переменные экземпляра класса lower_with_under _lower_with_under (protected) or __lower_with_under (private)
Имена методов lower_with_under() _lower_with_under() (protected) or __lower_with_under() (private)
Аргументы функций/методов lower_with_under
Локальные переменные lower_with_under

Даже когда файл создавался для того, чтобы быть импортированным, обычный импорт не должен иметь побочных эффектов в виде исполнения функциональной части скрипта. Основная функциональность должна быть заложена в функции main().
В Python, pychecker, pydoc и юнит тестах требуются импортируемые модули. Ваш код должен всегда проверять if __name__ == ‘__main__’ перед исполнением, что означает, что Ваш модуль не будет полностью исполнен при импортировании его в другую программу.

Весь код верхнего уровня будет исполнен, когда модуль будет импортирован. Будьте осторожны и не вызывайте функции, не создавайте объекта и не проводите другого вида операции, которые не должны будут выполняться, когда файл подвергнется проверке с помощью pychecker или будет собираться документация при помощи pydoc.

Заключительные слова
От переводчика
  • PDF-версия перевода в скором времени будет выложена ссылкой в обоих статьях, так что не промахнетесь:)
  • Нет, я не перевожу комментарии. Я считаю (лично мое мнение), что комментарии в коде должны быть на английском.
Благодарности

Огромное спасибо squaii за ревью и поиск ошибок.

Заключение

Пожалуйста, заклинаю я Вас — пишите порядочный код, господа! Заботьтесь о тех, кто будет поддерживать Ваши труды. Пожалейте их глаза, сэкономьте их силы, подарите им радость жизни, свободной от постоянно больной головы и кругов под глазами. Как известно Вы написавший только что код и Вы через месяц вернувшийся к его поддержке — уже составляете командную разработку, так что не ленитесь писать прозрачно даже тогда, когда Вы один предполагаете поддерживать написанный код. Искореняйте зло, насилие и содомию в среде IT-специалистов (и не только). Всем добра!

Синтаксис

Списки определяются в квадратных скобках []. Всё, что в квадратных скобках, называется индексами.

Извлечение индекса из списка

Списки внутри списка

В списке могут находиться другие списки. Каждый внутренний список становится индексом.

Отрицательные индексы


Индексы и срезы (slices)

Если два индекса разделены двоеточием, то это срез.

В срезе первое значение — это индекс, с которого начинается срез. Второе значение — это индекс, на котором заканчивается срез.

Можно пропустить один или оба индекса между срезом.

Изменение индексов в списке

Конкатенация и репликация списков

Несколько списков можно объединять в один с помощью оператора присваивания +.

Можно реплицировать список с помощью оператора умножения *.

Удаление индекса из списка

Удалить определенный индекс можно с помощью оператора del.

Оператор del также может использоваться для удаления простой переменной. Но если вы попытаетесь использовать переменную после ее удаления, вы получите ошибку NameError, поскольку переменная больше не существует.

На практике почти никогда не нужно удалять простые переменные. Оператор del в основном используется для удаления индексов из списка.

Использование range(len(supplies)) в цикле for удобно, потому что код в цикле может получить доступ к индексу (как переменная i) и значению этого индекса (как supplies[i] ). range(len(supplies)) будет перебирать все индексы supplies, независимо от того, сколько элементов в них содержится.

Операторы in и not in

С помощью in и not in в ы можете определить, находится ли значение в списке или нет.

Как и другие операторы, выражения in и not in используются в выражениях и соединяют два значения: значение, которое нужно искать в списке, и список, в котором его можно найти. Эти выражения приведут к логическому значению.


Есть ли в списке этот питомец?

С ледующая программа позволяет пользователю вводить имя питомца, а затем проверяет, есть ли имя в списке питомцев.

Множественное присваивание

М ножественное присваивание — это ярлык, который позволяет назначать несколько переменных со значениями в списке в одной строке кода.

Поэтому вместо того, чтобы делать так:

Можно сделать так:

Расширенные операторы присваивания

При присваивании значения переменной вы часто будете использовать саму переменную. Например, после присвоения 42 переменной spam, вы можете увеличить значение в spam на 1 с помощью следующего кода:

В качестве ярлыка вы можете использовать оператор расширенного присваивания +=, чтобы сделать то же самое:

Таблица расширенных операторов присваивания

Расширенный оператор Эвивалент этого оператора
spam += 1 spam = spam + 1
spam -= 1 spam = spam — 1
spam *= 1 spam = spam * 1
spam /= 1 spam = spam / 1
spam %= 1 spam = spam % 1

+= также может выполнять конкатенацию строк и списков, а *= может выполнять репликацию строк и списков.

Методы и функции списков

Метод — это то же самое, что и функция, за исключением того, что он «вызывается» для значения.

Например, если значение списка было сохранено в spam, вы бы вызвали метод списка index() (который я объясню далее) в этом списке следующим образом: spam.index(‘hello’) . Часть метода идет после значения, разделенного точкой.

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

Поиск значения в списке с помощью метода index ()

У значений списка есть метод index(), которому можно передать значение, и, если это значение существует в списке, возвращается индекс значения. Если значение отсутствует в списке, то Python выдаст ошибку ValueError.

При наличии дубликатов значения в списке возвращается индекс его первого появления. Обратите внимание, что index() возвращает 1, а не 3.

Добавление значений с помощью методов append() и insert()

Чтобы добавить новые значения в список, используйте методы append() и insert().

М етод append() добавляет аргумент в конец списка. Метод insert() может вставить значение по любому индексу в списке.

Первый аргумент для insert() — это индекс для нового значения, а второй аргумент — это новое значение, которое нужно вставить.

Удаление значений из списка с помощью метода remove ()

Метод remove() передает значение, которое будет удалено из списка, к которому он обращен.

Если значение появляется в списке несколько раз, будет удален только первый экземпляр значения.

Оператор del хорошо использовать, когда вы знаете индекс значения, которое хотите удалить из списка. Метод remove() хорош, когда вы знаете значение, которое хотите удалить из списка.

Сортировка с помощью метода sort()

Списки числовых значений или списки строк могут быть отсортированы с помощью метода sort() .

Можно передать True для обратного ключевого аргумента, чтобы sort () сортировал значения в обратном порядке.

Есть три вещи, которые вы должны знать о методе sort() .

Во-первых, метод sort() сортирует список по месту; поэтому не пытайтесь получить возвращаемое значение, написав такой код, как spam = spam.sort().

Во-вторых, вы не можете сортировать списки, в которых есть как числовые, так и строковые значения, поскольку Python не знает, как сравнивать эти значения.

В-третьих, sort() использует «ASCII порядок», а не фактический алфавитный порядок для сортировки строк. Это означает, что заглавные буквы идут перед строчными. Поэтому строчная буква a сортируется так, чтобы она шла после заглавной буквы Z.

Если вам нужно отсортировать значения в обычном алфавитном порядке, передайте str.lower для ключевого аргумента в вызове метода sort().

Это заставляет функцию sort() обрабатывать все элементы в списке, как если бы они были строчными, без фактического изменения значений в списке.

Строки и кортежи

Списки не являются единственными типами данных, которые представляют упорядоченные последовательности значений.

Например, строки и списки на самом деле похожи, если считать строку «list» однотекстовых символов. Многое из того, что вы можете сделать со списками, также может быть сделано со строками: индексы; срезы ; и используя их с for , с len() и с операторами in и not in .

Изменяемые и неизменяемые типы

Списки и строки важны по-разному. Значение списка является изменяемым типом данных: оно может иметь значения, добавленные, удаленные или измененные. Однако строка является неизменной: ее нельзя изменить. Попытка переназначить один символ в строке приводит к ошибке TypeError.

Правильный способ сделать строку изменяемой — это использовать срез и конкатенацию для построения новой строки путем копирования из частей старой строки.

Мы использовали [0:5] и [12:16] для обозначения символов, которые мы не хотим заменять. Обратите внимание, что исходная строка «Кошку звать Муся» не изменяется , потому что строки являются неизменяемыми.

Хотя значение списка является изменяемым, вторая строка в следующем коде не изменяет список в eggs .

Значение списка в eggs здесь не изменяется; новое и другое значение списка ([4, 5, 6]) перезаписывает старое значение списка ([1, 2, 3]). Если вы хотите изменить исходный список в eggs, чтобы он содержал [4, 5, 6], вам нужно будет сделать что-то вроде этого:

Тип данных Tuple (Кортеж)

Тип данных кортеж практически идентичен типу данных списки, за исключением двух способов. Во-первых, кортежи печатаются с круглыми скобками (и) вместо квадратных скобок [и].

Но основной способ отличия кортежей от списков заключается в том, что кортежи, как и строки, являются неизменяемыми. Кортежам нельзя изменять, добавлять или удалять их значения. Если вы попробуете изменить индекс в кортеже, то получите TypeError.

Если в кортеже есть только одно значение, можно указать это, поместив запятую после значения в скобках. В противном случае Python будет думать, что вы только что ввели значение в обычных скобках. Запятая — это то, что дает Python знать, что это значение кортежа.

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

Преобразование типов с помощью функций list() и tuple()

Так же, как str(42) вернет ’42’, строковое представление целого числа 42, функции list() и tuple() вернут версии списка и кортежа значений, переданных им.

Ссылки

Как известно, переменные хранят строки и целые значения.

Вы присваиваете 42 переменной spam, а затем копируете значение в spam и присваиваете его переменной cheese. Когда вы позже измените значение в spam на 100, это не повлияет на значение в cheese. Это потому, что spam и cheese — это разные переменные, в которых хранятся разные значения.

Но списки не работают таким образом. Когда вы назначаете список переменной, вы фактически назначаете ссылку на список переменной. Ссылка — это значение, которое указывает на некоторый бит данных, а ссылка на список — это значение, которое указывает на список. Вот код, который облегчит понимание этого различия.

1. Когда вы создаете список, вы присваиваете ему ссылку в переменной spam.

2. Но следующая строка копирует список spam только ссылку на cheese, а не само значение списка. Это означает, что значения, хранящиеся в spam и cheese, теперь относятся к одному и тому же списку. Существует только один базовый список, потому что сам список фактически никогда не копировался.

3. Поэтому, когда вы изменяете первый элемент cheese , вы изменяете тот же список, на который ссылается spam .

Переменные будут содержать ссылки на значения списка, а не сами значения списка. Но для строк и целых значений переменные просто содержат строковое или целое значение. Python использует ссылки всякий раз, когда переменные должны хранить значения изменяемых типов данных, таких как списки или словари. Для значений неизменяемых типов данных, таких как строки, целые числа или кортежи, переменные Python будут хранить само значение.

Хотя переменные Python технически содержат ссылки на значения списка или словаря, люди часто говорят, что переменная содержит список или словарь.

Передача ссылок

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

Обратите внимание, что при вызове eggs () возвращаемое значение не используется для присвоения нового значения в spam. Вместо этого он изменяет список на месте, напрямую. При запуске эта программа выдает следующий вывод:

Хотя spam и someParameter содержат отдельные ссылки, они оба ссылаются на один и тот же список. Вот почему вызов метода append (‘Hello’) внутри функции влияет на список даже после возврата вызова функции. Помните это поведение: забыв, что Python обрабатывает переменные списка и словаря таким образом, может привести к путанице.

Модули copy() и deepcopy()

Передача ссылок часто является наиболее удобным способом работы со списками и словарями, если функция изменяет переданный список или словарь. Но возможно, вы не захотите вносить эти изменения в исходное значение списка или словаря. Для этого Python предоставляет модуль с именем copy, который предоставляет функции copy() и deepcopy(). Первый из них, copy.copy(), может быть использован для создания дублирующейся копии изменяемого значения, такого как список или словарь, а не просто копией ссылки.

Теперь переменные spam и cheese ссылаются на отдельные списки, поэтому при назначении 42 для индекса 7 изменяется только список в cheese. Как видно на рисунке, ссылки на ID больше не совпадают обоими переменными, потому что переменные ссылаются на независимые списки. Если список, который необходимо скопировать, содержит списки, используйте функцию copy.deepcopy() вместо copy.copy(). Функция deepcopy() также скопирует эти внутренние списки.

Списки являются полезными типами данных, поскольку они позволяют вам писать код, который работает с изменяемым числом значений в одной переменной. Списки изменчивы, это означает, что их содержимое может измениться.

Кортежи и строки, хотя в некоторых отношениях похожи на списки, являются неизменяемыми и не могут быть изменены. Переменная, которая содержит кортеж или строковое значение, может быть перезаписана новым кортежем или строковым значением, но это не то же самое, что модификация существующего значения на месте — как это делают, например, методы append() или remove(). Переменные не хранят значения списка напрямую; они хранят ссылки на списки.

Это важное различие при копировании переменных или передачи списков в качестве аргументов в вызовах функций. Поскольку копируемое значение является ссылкой на список, имейте в виду, что любые изменения, внесенные в список, могут повлиять на другую переменную в вашей программе. Вы можете использовать copy() или deepcopy(), если хотите внести изменения в список в одной переменной без изменения исходного списка.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *