Автостопом по Python.
Соглашения.
Соглашения важны для всех, но это не единственный способ решения задачи. Соглашения, приведенные в этом разделе, довольно распространены, и мы рекомендуем придерживаться их, чтобы сделать свой код более читаемым.
Альтернативы при проверке на равенство.
Если вам не нужно явно сравнивать свое значение со значением 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], нужно разбить строку на несколько физических строк. Интерпретатор 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 |
| ) |
Однако зачастую необходимость разбивать длинные логические строки указывает на то, что вы пытаетесь выполнить слишком много действий за раз, что может навредить читаемости.
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
- 184.
- 185.
- 186.
- 187.
- 188.
- 189.
- 190.
- 191.
- 192.
- 193.
- 194.
- 195.
- 196.
- 197.
- 198.
- 199.
- 200.
- 201.
- 202.
- 203.
- 204.
- 205.
- 206.
- 207.
- 208.
- 209.
- 210.
- 211.
- 212.
- 213.
- 214.
- 215.
- 216.
- 217.
- 218.
- 219.
- 220.
- 221.
- 222.
- 223.
- 224.
- 225.
- 226.
- 227.
- 228.
- 229.
- 230.
- 231.
- 232.
- 233.
- 234.
- 235.
- 236.
- 237.
- 238.
- 239.
- 240.
- 241.
- 242.
- 243.
- 244.
- 245.
- 246.
- 247.
- 248.
- 249.
- 250.
- 251.
- 252.
- 253.
- 254.
- 255.
- 256.
- 257.