Таня Шлюссер - Автостопом по Python
- Название:Автостопом по Python
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03023-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Таня Шлюссер - Автостопом по Python краткое содержание
и содержит наработки многочисленных профессионалов и энтузиастов, знающих, что такое Python, и чего вы от него хотите. Проверенные методы и новейшие приемы, собранные в этой книге, помогут вам стать профессиональным Python-программистом и во всеоружии встретить наступающую эпоху Python 3.
Автостопом по Python - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Это не значит, что ни одно свойство не считается закрытым и что в Python нельзя реализовать инкапсуляцию. Наоборот, вместо того чтобы возводить бетонные стены между своим и чужим кодом, сообщество Python предпочитает полагаться на набор соглашений, которые указывают, к каким элементам нельзя получить доступ напрямую.
Основным соглашением для закрытых свойств и деталей реализации является добавление к именам всех подобных элементов нижнего подчеркивания (например, sys._getframe). Если клиентский код нарушает это правило и получает доступ к отмеченным элементам, будет считаться, что любое неверное поведение или проблемы вызваны именно клиентским кодом.
Использование этой концепции всеми одобряется: имя любого метода или свойства, к которым клиентский код не должен получить доступ, должно начинаться с нижнего подчеркивания. Это гарантирует более качественное разделение обязанностей и упрощает внесение изменений в код. Всегда можно сделать закрытое свойство открытым, обратное же действие выполнить гораздо сложнее.
Когда сложность функции увеличивается, зачастую вы можете встретить несколько выражений 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: |
# или явно проверяем на значение None |
····print 'attr is None!' |
if attr is None: |
····print 'attr is None!' |
Используйте синтаксис x in d вместо метода dict.has_key или передавайте аргумент по умолчанию в метод dict.get().
Плохой код | Хороший код |
---|---|
>>> d = {'hello': 'world'} |
>>> d = {'hello': 'world'} |
>>> |
>>> |
>>> if d.has_key('hello'): |
>>> print d.get('hello', 'default_value') |
… ····print(d['hello']) |
world |
# prints 'world' |
>>> print d.get('howdy', 'default_value') |
… else: |
default_value |
… ····print('default_value') |
>>> |
… |
>>> # или: |
world |
… 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] |
a = [3, 4, 5] |
b = [] |
b = [i for i in a if i > 4] |
for i in a: |
# Или: |
····if i > 4: |
b = filter(lambda x: x > 4, a) |
········b.append(i) |
|
# Добавим 3 к каждому элементу списка |
# Здесь также прозрачнее |
a = [3, 4, 5] |
a = [3, 4, 5] |
for i in range(len(a)): |
a = [i + 3 for i in a] |
····a[i] += 3 |
# Или: |
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] В соответствии с PEP 8 это значение равно 80 символам. Согласно другим источникам — 100, а в вашем случае это значение зависит от того, что говорит ваш начальник. Ха! Честно говоря, любой, кто использовал консоль для отладки кода в полевых условиях, быстро оценит ограничение в 80 символов (при котором строка в консоли не переносится) и на деле будет использовать 75–77, чтобы можно было увидеть нумерацию строк в Vi.
, нужно разбить строку на несколько физических строк. Интерпретатор Python объединит следующие друг за другом строки, если последний символ строки — обратный слэш. В некоторых случаях это может оказаться полезным, но такого подхода следует избегать, потому что знак пробела, добавленный в конце строки, разрушит код и может привести к неожиданным последствиям.
Интервал:
Закладка: