Стандартный циклСписковое включение
# Отфильтруем все элементы,# Списковое включение выглядит
# чье значение превышает 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], нужно разбить строку на несколько физических строк. Интерпретатор Python объединит следующие друг за другом строки, если последний символ строки — обратный слэш. В некоторых случаях это может оказаться полезным, но такого подхода следует избегать, потому что знак пробела, добавленный в конце строки, разрушит код и может привести к неожиданным последствиям.

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

Плохой кодХороший код
french_insult = \french_insult = (
"Your mother was a hamster, and \····"Your mother was a hamster, and "
your father smelt of elderberries!"····"your father smelt of elderberries!"
 )
from some.deep.module.in.a.module \from some.deep.module.in.a.module import (
····import a_nice_function, \····a_nice_function,
········another_nice_function, \····another_nice_function,
········yet_another_nice_function····yet_another_nice_function
 )

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

<p>Идиомы</p>

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

Распаковка

Если вы знаете длину списка или кортежа, можете присвоить имена их элементам с помощью распаковки. Поскольку вы можете указать количество разбиений строки для функций split() и rsplit(), правую сторону выражения присваивания можно разбить только один раз (например, на имя файла и расширение), а левая сторона может содержать оба места назначения одновременно, в правильном порядке. Например, так:

>>> filename, ext = "my_photo.orig.png".rsplit(".", 1)

>>> print(filename, "is a", ext, "file.")

my_photo.orig is a png file.

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

a, b = b, a

Вложенная распаковка также работает:

a, (b, c) = 1, (2, 3)

В Python 3 в PEP 3132 (https://www.python.org/dev/peps/pep-3132/) был представлен новый метод расширенной распаковки:

a, *rest = [1, 2, 3]

# a = 1, rest = [2, 3]

a, *middle, c = [1, 2, 3, 4]

# a = 1, middle = [2, 3], c = 4

Игнорирование значения

Если вам необходимо присвоить какое-то значение во время распаковки, но сама переменная не нужна, воспользуйтесь двойным подчеркиванием (__):

filename = 'foobar.txt'

basename, __, ext = filename.rpartition('.')

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

Все книги серии Бестселлеры O'Reilly

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