Стандартный цикл |
Списковое включение |
# Отфильтруем все элементы, |
# Списковое включение выглядит |
# чье значение превышает 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 объединит следующие друг за другом строки, если последний символ строки — обратный слэш. В некоторых случаях это может оказаться полезным, но такого подхода следует избегать, потому что знак пробела, добавленный в конце строки, разрушит код и может привести к неожиданным последствиям.
Лучшее решение — заключить элементы в круглые скобки. Если интерпретатор 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 |
|
) |
Однако зачастую необходимость разбивать длинные логические строки указывает на то, что вы пытаетесь выполнить слишком много действий за раз, что может навредить читаемости.
Несмотря на то что обычно существует всего один очевидный способ решить задачу, код Python, написанный с помощью идиом ( питонский код), может поначалу казаться неочевидным для новичков (если только они не голландцы [39] Обратитесь к 14-му пункту «Дзена Питона». Гвидо, наш BDFL, — голландец.
). Поэтому вам необходимо освоить хорошие идиомы.
Распаковка
Если вы знаете длину списка или кортежа, можете присвоить имена их элементам с помощью распаковки. Поскольку вы можете указать количество разбиений строки для функций 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
Игнорирование значения
Если вам необходимо присвоить какое-то значение во время распаковки, но сама переменная не нужна, воспользуйтесь двойным подчеркиванием (__):
Читать дальше