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