Читаем Автостопом по Python полностью

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

Возвращайте значения из одной точки

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

Выйти из функции можно в двух случаях: при появлении ошибки или при возвращении значения после того, как функция нормально отработает. Когда функция не может работать корректно, уместно вернуть значение None или False. В этом случае лучше вернуть значение из функции максимально рано после его обнаружения, дабы упростить структуру функции: весь код, который находится после выражения возврата-в-случае-сбоя, будет считать, что все условия соблюдены, и продолжит вычисление основного результата функции. Необходимы несколько подобных выражений return.

Однако везде, где это возможно, имейте только одну точку выхода — сложно выполнять отладку для функций, когда вам сначала нужно определить, какое выражение return ответственно за результат. Наличие единой точки выхода из функции также поможет избавиться от некоторых ветвей кода, поскольку наличие пары точек выхода, возможно, намекает на то, что необходимо провести подобный рефакторинг. Код в следующем примере нельзя назвать плохим, но его можно сделать более чистым (как это показано в комментариях): def select_ad(third_party_ads, user_preferences):

if not third_party_ads:

return None # Лучше сгенерировать исключение

if not user_preferences:

return None # Лучше сгенерировать исключение

# Сложный код, предназначенный для выбора best_ad

# Из доступных вариантов на основе индивидуальных предпочтений...

# Постарайтесь устоять перед искушением вернуть best_ad в случае успеха...

if not best_ad:

# Запасной план определения best_ad

return best_ad # Единая точка выхода, которая поможет обслуживать код

Соглашения

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

Альтернативы при проверке на равенство

Если вам не нужно явно сравнивать свое значение со значением True, None или 0, вы можете добавить его к оператору if, как в следующих примерах (см. статью «Проверка значения на правдивость» (http://docs.python.org/library/stdtypes.html#truth-value-testing) — там представлен список значений, которые расцениваются как False).

Плохой код

Хороший код

if attr == True:

print 'True!'

# Просто проверяем значение

if attr:

print 'attr is truthy!'

# или проверяем на противоположное значение

if not attr:

print 'attr is falsey!'

# если вам нужно только значение 'True'

if attr is True:

print 'attr is True'

if attr == None:

print 'attr is None!'

# или явно проверяем на значение None

if attr is None:

print 'attr is None!' Получаем доступ к элементам массива

Используйте синтаксис x in d вместо метода dict.has_key или передавайте аргумент по умолчанию в метод dict.get().

Плохой код

Хороший код

>>> d = {'hello': 'world'}

>>>

>>> if d.has_key('hello'):

... print(d['hello'])

# prints 'world'

... else:

... print('default_value')

...

world

>>> d = {'hello': 'world'}

>>>

>>> print d.get('hello', 'default_value')

world

>>> print d.get('howdy', 'default_value')

default_value

>>>

>>> # или:

... if 'hello' in d:

... print(d['hello'])

...

world Манипуляции со списками

Списковые включения — мощный способ работы со списками (для получения более подробной информации обратитесь к соответствующей статье в руководстве The Python Tutorial по адресу http://docs.python.org/tutorial/datastructures.html#list-comprehensions). Функции map() и filter() могут выполнять операции со списками с помощью другого, более выразительного синтаксиса.

Стандартный цикл

Списковое включение

# Отфильтруем все элементы,

# чье значение превышает 4

a = [3, 4, 5]

b = []

for i in a:

if i > 4:

b.append(i)

# Списковое включение выглядит

# прозрачнее

a = [3, 4, 5]

b = [i for i in a if i > 4]

# Или:

b = filter(lambda x: x > 4, a)

# Добавим 3 к каждому элементу списка

a = [3, 4, 5]

for i in range(len(a)):

a[i] += 3

# Здесь также прозрачнее

a = [3, 4, 5]

a = [i + 3 for i in a]

# Или:

a = map(lambda i: i + 3, a)

Используйте функцию enumerate(), чтобы определить свою позицию в списке. Этот вариант выглядит более читаемым, чем создание счетчика, и лучше оптимизирован для итераторов: >>> a = ["icky", "icky", "icky", "p-tang"]

>>> for i, item in enumerate(a):

Перейти на страницу:

Похожие книги

100 знаменитых харьковчан
100 знаменитых харьковчан

Дмитрий Багалей и Александр Ахиезер, Николай Барабашов и Василий Каразин, Клавдия Шульженко и Ирина Бугримова, Людмила Гурченко и Любовь Малая, Владимир Крайнев и Антон Макаренко… Что объединяет этих людей — столь разных по роду деятельности, живущих в разные годы и в разных городах? Один факт — они так или иначе связаны с Харьковом.Выстраивать героев этой книги по принципу «кто знаменитее» — просто абсурдно. Главное — они любили и любят свой город и прославили его своими делами. Надеемся, что эти сто биографий помогут читателю почувствовать ритм жизни этого города, узнать больше о его истории, просто понять его. Тем более что в книгу вошли и очерки о харьковчанах, имена которых сейчас на слуху у всех горожан, — об Арсене Авакове, Владимире Шумилкине, Александре Фельдмане. Эти люди создают сегодняшнюю историю Харькова.Как знать, возможно, прочитав эту книгу, кто-то испытает чувство гордости за своих знаменитых земляков и посмотрит на Харьков другими глазами.

Владислав Леонидович Карнацевич

Неотсортированное / Энциклопедии / Словари и Энциклопедии