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 Манипуляции со списками
Списковые включения — мощный способ работы со списками (для получения более подробной информации обратитесь к соответствующей статье в руководстве
Стандартный цикл
Списковое включение
# Отфильтруем все элементы,
# чье значение превышает 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):
... print("{i}: {item}".format(i=i, item=item))
...
0: icky
1: icky
2: icky
3: p-tang
Продолжение длинной строки кода
Когда логическая строка кода длиннее принятого значения38, нужно разбить строку на несколько физических строк. Интерпретатор Python объединит следующие друг за другом строки, если последний символ строки — обратный слэш. В некоторых случаях это может оказаться полезным, но такого подхода следует избегать, потому что знак пробела, добавленный в конце строки, разрушит код и может привести к неожиданным последствиям.
Лучшее решение — заключить элементы в круглые скобки. Если интерпретатор Python встретит незакрытую круглую скобку в одной строке, он будет присоединять к ней следующие строки до тех пор, пока скобка не будет закрыта. То же поведение верно для фигурных и квадратных скобок.
Плохой код
Хороший код
french_insult = \
"Your mother was a hamster, and \
your father smelt of elderberries!"
french_insult = (
"Your mother was a hamster, and "
"your father smelt of elderberries!"