Python Lounge: работа и стажировки для программистов – Telegram
Python Lounge: работа и стажировки для программистов
3.91K subscribers
93 photos
1.17K links
Здесь можно найти интересующую вас работу и стажировки для программистов, а так же полезные статьи про Python.

Размещение вакансии только - @perezvonyubot

Ссылка на канал: @python_lounge

Мы входим в сеть promopoisk.com

Реклама: @adtgassetsbot
Download Telegram
Использование списков в качестве стеков

Стек — абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»).

Методы встроенного списка в Python позволяют очень легко использовать список в виде стека. Чтобы добавить элемент на вершину стека, используйте append(). Чтобы извлечь элемент из верхней части стека, используйте pop() без явного индекса. Пример:

>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack
[3, 4, 5]
>>> stack.pop()
5
Switch-конструкция с помощью словаря

К сожалению, в Python не существует switch-конструкций, в отличие от большинства других языков программирования, и поэтому приходится строить башни из условных операторов в своём коде.

Однако есть одно хитрое решение — использовать словарь, где значениями будут функции. Например, напишем словарь, который будет использован для математических операторов.

switch = {
'+': lambda x, y: x + y,
'-': lambda x, y: x - y,
'*': lambda x, y: x * y,
'/': lambda x, y: x / y
}

В этом примере были использованы lambda-функции для простоты, но вместо них можете подставить любые другие. Для тех, кто не знает: lambda - объявление анонимной функции (можно косвенно сравнить с def); x, y - принимаемые аргументы; x + y - то, что функция возвращает.

result = switch['*'](4, 5)
print(result)
# Output: 20

Примерно вот так мы можем пользоваться подобной штукой. Думаю, что многие найдут полезное применение подобному использованию словарей.
​​Как одной математической формулой по номеру месяца посчитать количество дней в нем?

Попробуем написать функцию f(x), которая бы давала следующий список значений (таблица №1), то есть количество дней в месяцах. Помимо стандартных арифметических операций, мы будем использовать целочисленное деление и взятие остатка по модулю.

Обычно количество дней в месяце колеблется между 30 и 31. При этом, можно заметить зависимость этого числа от четности месяца — значит, воспользуемся операцией взятия остатка по модулю 2. Кажется, это должно быть нечто, вроде:

f₁(x) = 30 + x % 2
# таблица №2

Пока что не обращая внимания на февраль, нам нужно, чтобы +1 в делимом «активировалось» только при достижении аргументом значений, больших 8. При этом значения аргумента не могут превосходить 12. Значит, нам идеально подойдет целочисленное деление аргумента на 8:

f₃(x) = 30 + (x + x // 8) % 2
# таблица №3

Все правильно, кроме февраля. Как неожиданно. В самой последней версии нашей формулы февралю достались целых 30 дней. А потому нам нужно отсечь у него пару дней. Естественно, от этого пострадают и еще какие-то месяцы, поэтому нам придется пожертвовать именно январем, затем подправив формулу и для него. Отсечь дни для первого и второго месяцев можно с помощью выражения 2 % x. Тогда наша формула принимает уже следующий вид:

f₄(x) = 28 + (x + x // 8) % 2 + 2 % x
# таблица №4

Остался последний шаг — подлатать январь. Это сделать не так сложно: просто добавим 2 дня только к нему, т.е. к такому месяцу, чей номер меньше либо равен единице. Как вам идея использовать для этой цели 1 // x? Проверяем:

f₅(x) = 28 + (x + x // 8) % 2 + 2 % x + 1 // x * 2
# таблица №5

Превосходно, 12 из 12. Подобная функция на языке Python может быть записана следующим образом:

f = lambda x: 28 + (x + x // 8) % 2 + 2 % x + 1 // x * 2
print(f'В июне {f(6)} дней')
# Out: В июне 30 дней
Паттерн проектирования Singleton

Одиночка или же синглтон
– это паттерн проектирования, описывающий объект, у которого имеется один единственный экземпляр.

Итак, нам требуется такой класс, который будет при вызове возвращать один и тот же экземпляр, поэтому нам придется переопределить магический метод new.

new__(cls, *args, **kwargs) –– вызывается для создания экземпляра класса, перед вызовом __init. На вход первым аргументом метод принимает сам класс, а возвращать должен уже экземпляр (даже можно экземпляр и другого класса).

class Singleton:
instance = None

def __new__(cls):
if cls.instance is None:
cls.instance = super().__new__(cls)

return cls.instance

Здесь мы проверяем, есть ли значение у атрибута instance. Если нет, то присваиваем атрибуту экземпляр этого же класса. А если уже экземпляр создан, то просто его возвращаем.

То есть при вызове конструктора класса Singleton, будет возвращаться один и тот же объект из памяти.

a = Singleton()
b = Singleton()

Создали два экземпляра, теперь убедимся, что они содержат одинаковый объект.

print(a is b) # True
​​Набор учащихся на совместные образовательные программы Сбербанка

Совместные образовательные программы Сбербанка реализованы в 12 вузах страны от Москвы до Владивостока. Направления подготовки разные — от «Экономики» до «Software Engineering». Обучение доступно как для магистров, так и для бакалавров на конкурсной и коммерческой основе. Узнать подробнее о сроках приемной кампании и образовательных программах можно на онлайн-платформе SberGraduate.

Какие совместные образовательные программы есть?

Национальный исследовательский ядерный университет «МИФИ»: программа дополнительного образования «Информационные технологии в социальных системах»

Московский физико-технический университет: бакалаврская программа «Software Engineering»

Российская академия народного хозяйства и государственной службы при Президенте Российской Федерации: магистерская программа «Финансы и технологии»

Национальный исследовательский университет «Высшая школа экономики»: магистерская программа «Финансовые технологии и анализ данных»

Балтийский федеральный университет им. Канта: магистерская программа «Банковские информационные технологии»

Факультет вычислительной математики и кибернетики МГУ им. М.В. Ломоносова: магистерская программа «Программное обеспечение вычислительных сетей»

Университет ИТМО: магистерские программы «Цифровые технологии умного города», «Информационная безопасность», «Финансовые технологии больших данных», «Робототехника»

Дальневосточный федеральный университет: бакалаврская программа «Экономика» и магистерская программа «Искусственный интеллект и большие данные»

Южный Федеральный Университет: бакалаврская программа «Специализированный курс по обучению Java разработке»

Самарский НИУ академика С.П.Королева: магистерская программа «Data Science»

Уральский федеральный университет: программа дополнительного образования «Сбертех Start» и магистерская программа «Прикладной анализ данных»

Рязанский государственный радиотехнический университет: совместный учебный курс «Business Intelligence», «Архитектура промышленных автоматизированных систем» и «Промышленное программирование на Java»

Digital-выпускной SberGraduate 2020

В конце июля состоялся первый в истории digital-выпускной образовательных программ Сбербанка SberGraduate. Во время онлайн-трансляции новоиспеченные бакалавры и магистры получили напутствия от менеджеров Сбербанка и представителей университетов, прошли тест на уровень развития эмоционального интеллекта и разились за годовую подписку в онлайн-кинотеатре Окко в «Квиз, плиз».

Помимо дипломов выпускники получили именные сертификаты, подписанные Президентом, Председателем Правления Сбербанка Германом Грефом. Многие из выпускников уже получили предложение стать сотрудниками Сбербанка.
Изменение списка во время итерации по нему

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

odd = lambda x: bool(x % 2) # функция проверки числа на нечетность

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for i in range(10):
  if odd(numbers[i]):
    del numbers[i] # удаление элемента из списка во время итерации по нему

# Output:
Traceback (most recent call last):
if odd(numbers[i]):
IndexError: list index out of range

Удаление элемента из списка во время его итерации – это проблема, которая хорошо известна любому опытному разработчику.

К счастью, Python включает в себя ряд элегантных парадигм программирования, которые при правильном использовании могут привести к значительному упрощению и оптимизации кода. Одна из таких парадигм – list comprehensions. Генераторы списков часто используют именно для решения подобных проблем, что и показывает реализация кода ниже:

odd = lambda x: bool(x % 2) # функция проверки числа на нечетность
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

numbers = [n for n in numbers if not odd(n)] # генератор нового списка
print(numbers)

# Output:
[2, 4, 6, 8, 10]
Аннотации типов

Всем известно, что Python – язык с динамической типизацией. Аннотации типов нужны для того, чтобы повысить информативность исходного кода, но они никак не влияют на поведение программы.

Для примера потребуется импортировать типы List (список) и Dict (словарь) из модуля typing:

from typing import List, Dict

Типы данных указывается через двоеточие после именно переменной после её создания. Создадим словарь с числами и сразу же список, состоящий из значений этого словаря:

numbers: Dict[str, int] = {'one': 1, 'two': 2}
values: List[int] = numbers.values()

Потом создадим функцию, возвращающую сумму переданных значений. В аргументах точно так же можно указывать их типы, а также через стрелочку можно указать типа возвращаемого значения:

def sum(a: int, b: int) -> int:
return a + b

Теперь используем эту функцию, передав туда распакованный список:

sum(*values)
# Output: 3

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

sum('Python ', 'Lounge')
# Output: 'Python Lounge'
Функция exit создана для удобства работы в интерактивном режиме, однако не рекомендуется использовать её внутри скриптов. Она просто поднимает исключение, и при попытке вызова без скобок пишет подсказку о правильном способе выхода из интерпретатора:

>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>> exit()
nameless@pycoders:~$

Использовать sys.exit стоит потому, что эта функция лежит в стандартном модуле и будет всегда там доступна. Также это довольно явный способ выразить своё желание завершить программу.

import sys

try:
# code
except:
sys.exit()
Реализация класса контекстного менеджера

Начнем с того, что в контекстном менеджере должны быть определены методы enter и exit. Давайте создадим наш собственный менеджер контекста для открытия файлов и поймем суть его работы.

class NewOpen(object):
   def __init__(self, file_name, mode):
       self.file = open(file_name, mode)
   def __enter__(self):
       return self.file
   def __exit__(self, type, value, traceback):
       self.file.close()


Просто определив методы enter и exit, мы можем использовать наш новый класс с оператором with. Давайте попробуем:

with NewOpen('test.txt', 'w') as file:
   file.write('Hello, world!')

Наш метод exit принимает три аргумента. Они требуются для каждого метода exit, который является частью класса.

# test
Где будет быстрее поиск? При условии 1 млн записей.
Anonymous Poll
34%
dict
32%
set
15%
list
20%
tuple
Иногда приходится писать код с несколькими контекстными менеджерами, что выглядит не особо лаконично:

with open('f') as f:
with open('g') as g:
with open('h') as h:
pass


Начиная с Python 2.7 и 3.1, вы можете использовать всего один with:

o = open
with o('f') as f, o('g') as g, o('h') as h:
pass


До этого вы могли бы использовать функцию nested из contextlib:

from contextlib import nested
with nested(o('f'), o('g'), o('h')) as (f, g, h):
pass
SberCloud запустили довольно забавную небольшую ролевую игру, позволяющую почувствовать себя в шкуре начинающего стартапера и потренироваться в запуске и поддержке первого проекта.

В стол или в релиз? Проверь, какой из тебя стартапер: https://sc.link/zX7
В Python имя переменной может состоять из одного подчеркивания: _. Хотя обычно такие имена не достаточно описательны и не должны использоваться, есть по крайней мере три случая, когда _ имеет общепринятый смысл.

Во-первых, интерактивные интерпретаторы Python используют _ для хранения результата последнего выполненного выражения:

>>> 2 + 2
4
>>> _
4

Во-вторых, руководство модуля gettext рекомендует псевдоним его функции gettext() для _(), чтобы минимизировать загромождение вашего кода.

В-третьих, _ используется, когда вам нужно придумать имена для значений, которые вам не нужны:

for _ in range(10):
print('Hello!')
"Быстрый" контейнер deque

Deque может быть реализован на Python с помощью модуля collections. Deque предпочтительнее, чем обычный список, в тех случаях, когда нам нужны более быстрые операции добавления и вытягивания элементо из обоих концов контейнера, поскольку deque обеспечивает линейную сложность O(1) для операций добавления и выталкивания по сравнению со списком, у которого сложность по времени для тех операций составляет O(n). Вот пример основных методов:

>>> from collections import deque
>>> x = deque([1, 2, 3])
>>> x.append(4)
>>> x.appendleft(0)
>>> x
deque([0, 1, 2, 3, 4])
>>> x.pop()
4
>>> x.popleft()
0
>>> x
deque([1, 2, 3])

Также для deque есть возможность использовать стандартные функции по типу sum, min, max и тому подобные.
Создаем свой простенький локер - вирус, блокирующий компьютер; а также используем новый интересный модуль

Tkinter: часть 5
​​📌Функция sum() в python3
Как бы вы решили задачу получения суммы элементов
списка без обхода элементов в цикле?

Это можно сделать с помощью стандартной функции sum():

Cинтакс функции sum().
sum(iterable, start)

Параметры sum():
iterable - итерируемые типы (list , dict , tuple, и.т.д.)
start - (необезательно) - значение этого параметра прибавляется к уже готовой сумме элементов iterable.По умолчанию значение этого парметра 0.

Возвращаемое значение из sum():
sum() возвращает сумму start и элементов iterable.

Пример:
numbers = [1,5,5]
#парметр start передается со значением по умолчанию(0).
numbers_sum = sum (numbers);
print (numbers_sum)
# парметр start передается со значением 7.
numbers_sum = sum (numbers, 7)
print (numbers_sum)

Результат:
11
18

🔴Примечания:

Если вам нужно использовать sum() с floating-point элементами iterable с правильной точностью после запятой , до использования
sum(iterable , start) , нужно вместе c import math добавить следующую строку. math.fsum(iterable).

Если вам нужно соединить(concatenate) элементы iterable (элементы должны быть string), тогда вы можете использовать метод join()

Пример:
myTuple = ("Python", "Lounge", "is", "the","best")
x = " ".join(myTuple)
print (x)

Результат:
Python Lounge is the best
​​📌ДИНАМИЧЕСКИЕ АТТРИБУТЫ ДЛЯ ОБЪЕКТОВ

Есть возможность контролировать способы получения аттрибутов из объекта , с помощью магического метода __getattr__.

Когда мы вызваем что-то вроде <myobject>.<myattribute>,Python будет искать <myattribute> в библиотеке объекта, вызвав __getattribute__
в нём.
Если ничего не найдено , то объект не имеет аттрибут с именем которую мы ищем, тогда extra метод __getattr__ вызывается , получая имя аттрибута (myattribute) как параметр.
Получая это значение мы можем котролировать значения которые будут возвращены к нашим объектам.
Мы даже можем создать новый аттрибут и вернуть объекту "ненайденный аттрибут".

Ниже показано определение метода __getattr__ .

class DynamicAttributes:
def __init__(self, attribute):
self.attribute = attribute
def __getattr__(self, attr):
if attr.startswith("fallback_"):
name = attr.replace("fallback_", "")
return f"[fallback resolved] {name}"
raise AttributeError(f"{self.__class__.__name__} has no attribute {attr}")

Примечание:
🔴Будьте осторожны при реализации такого динамического метода, как __getattr__,
и используйте его с осторожностью. При реализации __getattr__,
поднять AttributeError.
​​ 📌ГЕТТЕРЫ И СЕТТЕРЫ В python
(Инкапсуляция)
В ЯП python по умолчанию все атрибуты в классах являются общедоступными(public), это значит , что из любого места программы мы можем получить аттрибут объекта и изменть его.
🎯Пример:
class Human:
def __init__(self, name, age): #коструктор класса Human
self.name = name #устанавливаем имя
self.age = age #устанавливаем возраст
def display_info(self):
print ("Имя : ", self.name, "\tВозраст:", self.age)
Me = Human ("python_lounge", 2)
Me.name = "Captain-America!" # изменяем атрибут name
Me.age = 132 # изменяем атрибут age
Me.display_info()
Результат:
Output : "Имя: Человек-паук    Возраст: -129"
В примере выше мы показали что без икапсуляции можно нежелательным образом изменять аттрибуты класса.
Не зря инкапсуляция является несущим звеном в мире ООП.
⚠️
На вопрос что такое инкапсуляция в программировании нужно ответить следующим образом.
Инкапсуляция предотвращает прямой доступ к атрибутам объект из вызывающего кода.
Касательно инкапсуляции непосредственно в языке программирования Python, скрыть атрибуты класса можно сделав их приватными или закрытыми и ограничив доступ к ним через специальные методы, которые еще называются свойствами.
Изменим выше определенный класс, определив в нем свойства:

class Human:
   def __init__(self, name, age): #коструктор класса Human
    self.__name = name #устанавливаем имя
    self.__age = age #устанавливаем возраст

   def set_age(self, age):
    if (age in range(1,100)):
       self.__age = age #
    else :
       print ("Недопустимый возраст")

   def set_name (self, name):
      self.__name = name if name else print ("Недопустимое имя")

   def display_info(self):
      print ("Имя : ", self.__name, "\tВозраст:", self.__age)

   def get_age(self):
      return self.__age

   def get_name(self):
      return self.__name

Me = Human ("python_lounge", 2)
Me.display_info() #Имя:python_lounge Возраст: 2
Me.set_name ("Captain-America!") #изменяем атрибут name
Me.set_age(26) # изменяем атрибут age
Me.display_info() #Имя:Captain-America! Возраст: 26


Для создания приватного атрибута в начале его наименования ставится двойной прочерк: self.__name. К такому атрибуту мы сможем обратиться только из того же класса. Но не сможем обратиться вне этого класса. Например, присвоение значения этому атрибуту ничего не даст:
Me.__age = 43

👉Аннотации свойств
Выше мы рассмотрели, как создавать свойства. Но Python имеет также еще один - более элегантный способ определения свойств. Этот способ предполагает использование аннотаций, которые предваряются символом @.
Для создания свойства-геттера над свойством ставится аннотация @property.
Для создания свойства-сеттера над свойством устанавливается аннотация имя_свойства_геттера.setter.
​​​​📌Библиотека Matplotlib

Библиотека Matplotlib является одним из самых популярных средств
визуализации данных на Python. Она отлично подходит как для создания
статичных изображений,так и анимированных, и интерактивных
решений.

🎯Matplotlib является частью Scientific Python — набора библиотек для
научных вычислений и визуализации данных, куда также входят NumPy 1 ,
SciPy 2 , Pandas 3 , SymPy 4 и ещё ряд других инструментов.

При описании параметров функций будет использоваться следующий
формат:
• имя_аргумента: тип(ы)
◦ описание

Если в описании типа данных есть слово optional, это значит, что
данный параметр имеет значение по умолчанию, и его не обязательно
явно указывать.

Установка:

Установка Matplotlib с помощью менеджера pip
Для установки Matplotlib с помощью менеджера пакетов pip введите в
командной строке вашей операционной системы следующие команды:
python -m pip install -U pip
python -m pip install -U matplotlib
Первая из них обновит ваш pip, вторая установит Matplotlib со всеми
необходимыми зависимостями.

Проверим версию библиотеки, она, скорее всего, будет отличаться от
приведённой ниже:
>>> matplotlib.__version__
'3.0.3'



📖Полезные ссылки:
https://numpy.org/
https://scipy.org/
https://pandas.pydata.org/
https://www.sympy.org/en/index.html
​​📌Основные элементы графика в библиотеке Matplotlib.
Сегодня рассмотрим основные термины и понятия, касающиеся изображения
графика, с которыми вам необходимо будет познакомиться.

Далее мы будем использовать термин "график" для обозначения всего
изображения, которое формирует Matplotlib (см. рисунок под статьей), и линии,
построенной по заданному набору данных.

Корневым элементом, на котором Matplotlib строит изображение,
является фигура (Figure). Всё, что перечислено на рисунке — это
элементы фигуры. Рассмотрим её составляющие более подробно.

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

👉Оси
Вторым по важности элементом фигуры являются оси. Для каждой оси
можно задать метку (подпись), основные (major) и дополнительные
(minor) тики, их подписи, размер, толщину и диапазоны.

👉Сетка и легенда
Сетка и легенда являются элементами фигуры, которые значительно
повышают информативность графика. Сетка может быть основной
(major) и дополнительной (minor). Каждому типу сетки можно задавать
цвет, толщину линии и тип. Для отображения сетки и легенды
используются соответствующие команды.

Ниже представлен код, с помощью которого был построен график,
изображённый на рисунке.

import matplotlib.pyplot as plt
from matplotlib.ticker import (MultipleLocator, FormatStrFormatter,
AutoMinorLocator)
import numpy as np
x = np.linspace(0, 10, 10)
y1 = 4*x
y2 = [i**2 for i in x]
fig, ax = plt.subplots(figsize=(8, 6))
ax.set_noscript('Графики зависимостей: y1=4*x, y2=x^2', fontsize=16)
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('y1, y2', fontsize=14)
ax.grid(which='major', linewidth=1.2)
ax.grid(which='minor', linestyle='--', color='gray', linewidth=0.5)
ax.scatter(x, y1, c='red', label='y1 = 4*x')
ax.plot(x, y2, label='y2 = x^2')
ax.legend()
ax.xaxis.set_minor_locator(AutoMinorLocator())
ax.yaxis.set_minor_locator(AutoMinorLocator())
ax.tick_params(which='major', length=10, width=2)
ax.tick_params(which='minor', length=5, width=1)
plt.show()