PythonBoost - сообщество питонистов
12.4K subscribers
292 photos
6 videos
542 links
Лучший Python телеграм канал для новичков.

Цель: подготовка студентов, начинающих питонистов к нахождению первой работы.

@anothertechrock

РКН: https://kurl.ru/Jhcwp
加入频道
Трюк дня. Как соединить два словаря

В Python 3.5+:

>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 3, 'c': 4}

>>> z = {**x, **y}

>>> z
{'c': 4, 'a': 1, 'b': 3}

В Python 2.x :

>>> z = dict(x, **y)
>>> z
{'a': 1, 'c': 4, 'b': 3}

В этих примерах Python мержит ключи словарей в порядке, указанном в выражении. При этом дубликаты перезаписываются слева направо.

#tips
Трюк дня. Символы Unicode в именах переменных

Python 3 позволяет использовать символы Unicode в именах переменных:

>>> π = math.pi
>>> class Spin̈alTap: pass
>>> Spin̈alTap()
<Spin̈alTap object at 0x10e58d908>

Но допускаются только буквенные символы:

>>> 🍺 = "beer"
SyntaxError:
"invalid character in identifier"

Это точно не стоит использовать в продакшене, но для личных экспериментов может быть интересно.

#tips
Трюк дня. Получение имени класса и функции

Имя класса объекта можно получить в виде строки:

>>> class MyClass: pass

>>> obj = MyClass()
>>> obj.class.name
'MyClass'

Аналогично с функциями:

>>> def myfunc(): pass

>>> myfunc.name
'myfunc'

#tips
Трюк дня. Встроенный метод issubclass()

При помощи встроенного метода "issubclass()" можно проверить отношения наследования для класса:

>>> class BaseClass: pass
>>> class SubClass(BaseClass): pass

>>> issubclass(SubClass, BaseClass)
True
>>> issubclass(SubClass, object)
True
>>> issubclass(BaseClass, SubClass)
False

#tips
Трюк дня. Использование нескольких **kwargs

Python 3.5+ позволяет передавать в функцию несколько наборов именованных аргументов ("kwargs") в рамках одного вызова с использованием синтаксиса **:

>>> def process_data(a, b, c, d):
>>> print(a, b, c, d)

>>> x = {'a': 1, 'b': 2}
>>> y = {'c': 3, 'd': 4}

>>> process_data(**x, **y)
1 2 3 4

>>> process_data(**x, c=23, d=42)
1 2 23 42

#tips
Трюк дня. Проверка элементов списка на равенство

"Питоничные" способы проверить, все ли элементы в списке равны между собой:

>>> lst = ['a', 'a', 'a']

>>> len(set(lst)) == 1
True

>>> all(x == lst[0] for x in lst)
True

>>> lst.count(lst[0]) == len(lst)
True

Решения расположены в порядке от наиболее до наименее "питоничных" и одновременно от наименее до наиболее эффективных.

Например, решение len(set()) - идиоматично, однако использование множества менее эффективно по части памяти и скорости работы.

#tips
Трюк дня. Модуль ipaddress: работа с IP-адресами

В стандартной библиотеке Python 3 есть специальный модуль для работы с IP-адресами:

>>> import ipaddress

>>> ipaddress.ip_address('192.168.1.2')
IPv4Address('192.168.1.2')

>>> ipaddress.ip_address('2001:af3::')
IPv6Address('2001:af3::')

Узнать больше можно в документации: на английском, на русском.

#tips
Трюк дня. contextlib.suppress()

В Python 3.4+ можно использовать contextlib.suppress() для выборочного игнорирования отдельных исключений:

import contextlib

with contextlib.suppress(FileNotFoundError):
os.remove('somefile.tmp')

Это эквивалентно следующему коду:

try:
os.remove('somefile.tmp')
except FileNotFoundError:
pass

#tips
Трюк дня. Звездочка в списке параметров функции

В Python 3 можно использовать звездочку "*" в списке параметров функции, чтобы следующие за ней параметры считались обязательными именованными аргументами:

>>> def f(a, b, *, c='x', d='y', e='z'):
return 'Hello'

Чтобы передать значения для c, d и e, вам придется явно задать их в виде пар "ключ=значение":

>>> f(1, 2, 'p', 'q', 'v')
TypeError:
"f() takes 2 positional arguments but 5 were given"

>>> f(1, 2, c='p', d='q',e='v')
'Hello'

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

>>> def f(a, b, *, c, d, e):
return 'Hello'

>>> f(1, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: f() missing 3 required keyword-only arguments: 'c', 'd', and 'e'

#tips
Трюк дня. Подсчет элементов в итерируемом объекте

collections.Counter позволяет находить наиболее часто встречающиеся элементы в итерируемом объекте:

>>> import collections
>>> c = collections.Counter('helloworld')

>>> c
Counter({'l': 3, 'o': 2, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1})

>>> c.most_common(3)
[('l', 3), ('o', 2), ('e', 1)]

#tips
Трюк дня. Блок else в циклах for и while

В Python циклы for и while могут содержать блок else, который выполнится, только если цикл завершится без применения break.

#tips