Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Python: вещи, которых вы могли не знать

Anna | 15.06.2014 | нет комментариев

Python — прекрасный и местами таинственный язык. И даже зная его крайне хорошо, рано либо поздно находишь для себя кое-что такое, что прежде не применял. Данный пост отражает некоторые детали языка, на которые многие не обращают внимание. Сразу скажу: многие примеры являются непрактичными, но, оттого, не менее увлекательными. Так же, многие примеры показывают unpythonic жанр, но я и не претендую на новые эталоны — я легко хочу показать, что дозволено делать вот так.

1. Безмерно вложенный список

>>> a = [1, 2, 3, 4]
>>> a.append(a)
>>> a
[1, 2, 3, 4, [...]]
>>> a[4]
[1, 2, 3, 4, [...]]
>>> a[4][4][4][4][4][4][4][4][4][4] == a
True

То же самое со словарями:

>>> a = {}
>>> b = {}
>>> a['b'] = b
>>> b['a'] = a
>>> print a
{'b': {'a': {...}}}

2. Форматирование списка

>>> l = [[1, 2, 3], [4, 5], [6], [7, 8, 9]]
>>> sum(l, [])
[1, 2, 3, 4, 5, 6, 7, 8, 9]

3. Генератор словарей

Многие знают про генератор списков, а как насчет генераторов словарей?

>>> {a:a**2 for a in range(1, 10)}
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

4. Одноразовая функция в классе

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

class foo:
    def normal_call(self):
        print("normal_call")
    def call(self):
        print("first_call")
        self.call = self.normal_call

 

>>> y = foo()
>>> y.call()
first_call
>>> y.call()
normal_call
>>> y.call()
normal_call

5. Приобретение аттрибутов класса

class GetAttr(object):
	def __getattribute__(self, name):
		f = lambda: "Hello {}".format(name)
		return f

 

>>> g = GetAttr()
>>> g.Mark()
'Hello Mark'

6. Операции над множествами

Set — это способ перевоплощения списка в контейнер с неповторяющимися элементами:

>>> a = set([1,2,3,4])
>>> b = set([3,4,5,6])
>>> a | b # Объединение
{1, 2, 3, 4, 5, 6}
>>> a & b # Пересечение
{3, 4}
>>> a < b # Подмножества
False
>>> a - b # Разница
{1, 2}
>>> a ^ b # Симметрическая разность
{1, 2, 5, 6}

Значимо понимать, что без способа set эти операции трудиться не будут.

7. Операторы сопоставления

>>> x = 5
>>> 1 < x < 10
True
>>> 10 < x < 20 
False
>>> x < 10 < x*10 < 100
True
>>> 10 > x <= 9
True
>>> 5 == x > 4
True

8. Динамичное создание новых классов

>>> NewType = type("NewType", (object,), {"x": "hello"})
>>> n = NewType()
>>> n.x
'hello'

Данный же вариант в обыкновенном виде:

>>> class NewType(object):
>>>     x = "hello"
>>> n = NewType()
>>> n.x
"hello"

9. Подавление исключения «KeyError» в словарях

В словарях существует способ .get(). В обыкновенном случае, если вы вызываете несуществующий ключname_dict['key'], вы получите исключение KeyError. Впрочем, если вызвать ключ через способ d.get(‘key’), то исключения не будет и, если ключа нет, то словарь возвратит None. Если вы хотите назначить переменную взамен отсутствующего ключа, то дозволено назначить 2-й параметр: d.get(‘key’, 0).

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

sum[value] = sum.get(value, 0)   1

10. Добавление в список, находящийся в словаре

Если вам нужно беречь несколько значений ключей, то вы можете беречь их в списке:

>>> d = {}
>>> t = 1
>>> a, b = 4, 5
>>> d.setdefault(t, list()).append(a)
>>> d
{1: [4]}
>>> d.setdefault(t, list()).append(b)
>>> d
{1: [4, 5]}

11. Предназначение переменных по условию

x = 1 if (y == 10) else 2 # X равно 1, при условии, что Y равен 10. Если это не так - X равен 2
x = 3 if (y == 1) else 2 if (y == -1) else 1  # Больше длинное условие. Не используйте тут elif

12. Распаковка значений на переменные

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

>>> first,second,*rest = (1,2,3,4,5,6,7,8)
>>> first # Первое значение
1
>>> second # Второе значение
2
>>> rest # Все остальные значения
[3, 4, 5, 6, 7, 8]

 

>>> first,*rest,last = (1,2,3,4,5,6,7,8)
>>> first
1
>>> rest
[2, 3, 4, 5, 6, 7]
>>> last
8

13. Нумерация элементов списка

>>> l = ["spam", "ham", "eggs"]
>>> list(enumerate(l)) 
>>> [(0, "spam"), (1, "ham"), (2, "eggs")]
>>> list(enumerate(l, 1)) # Дозволено указать предисловие нумерации в качестве довода
>>> [(1, "spam"), (2, "ham"), (3, "eggs")]

14. Применение else в исключениях

try: 
  function()
except Error:
  # Если не сработал try и объявлена оплошность Error
else:
  # Если не сработал try и нет ошибки Error

15. Создание копии списка

При создании копии обыкновенным способом произойдет следующее:

>>> x = [1, 2, 3]
>>> y = x
>>> y[2] = 5
>>> y
[1, 2, 5]
>>> x
[1, 2, 5]

Верный вариант:

>>> x = [1,2,3]
>>> y = x[:]
>>> y.pop()
3
>>> y
[1, 2]
>>> x
[1, 2, 3]

16. Нумерация в for

Для нумерации элементов при итоге через цикл for используйте способ enumerate

>>> l = ['a', 'b', 'c', 'd', 'e']
>>> for i, value_list in enumerate(l, 1): # Аттрибут 1 - предисловие сортировки
>>>     print(i, value_list)
...     
1 a
2 b
3 c
4 d
5 e

17. Значения функции по умолчанию

При назначении функцияermark!Открывает вкладку с указанным адресом в браузере по умолчанию.

import webbrowser
webbrowser.open_new_tab('http://habrahabr.ru/') # Вернет True и откроет вкладку

27. zip. Объединение списков

a = [(1,2), (3,4), (5,6)]
zip(*a)
# [(1, 3, 5), (2, 4, 6)]

Слияние 2-х списков в словарь:

>>> t1 = (1, 2, 3)
>>> t2 = (4, 5, 6)
>>> dict (zip(t1,t2))
{1: 4, 2: 5, 3: 6}

28. Срезы в списках и работа с ними

>>> a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[:5] = [42] # Все символы до 5 заменяются элементом "42"
>>> a
[42, 5, 6, 7, 8, 9]
>>> a[:1] = range(5) 
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del a[::2] # Удаление всякого второго элемента
>>> a
[1, 3, 5, 7, 9]
>>> a[::2] = a[::-2] # Альтернатива reserved
>>> a
[9, 3, 5, 7, 1]

29. Хранение нескольких элементов в ключе словаря

Если на ключ необходимо назначить огромнее одного элемента, отменнее беречь их в списке:

>>> m = {}
>>> m.setdefault('foo', []).append(1)
>>> m
{'foo': [1]}
>>> m.setdefault('foo', []).append(2)
>>> m
{'foo': [1, 2]}
30. Последнее и самое основное

Ради каждого неведомого, читайте ДОКУМЕНТАЦИЮ! Не собирайте следующий велосипед — допустимо ваш код еще кому-то читать. Ни одна книга не сумеет отразить полноту документации, а документация у python’а чудесная.
Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB