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

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

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

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

Реклама: @adtgassetsbot
Download Telegram
Реализация класса контекстного менеджера

Начнем с того, что в контекстном менеджере должны быть определены методы 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_title('Графики зависимостей: 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()
Какой элемент является корневым в библиотеке Matplotlib для строения изображения.
Anonymous Quiz
67%
Figure(Фигура)
24%
Subplot(Подграфик)
9%
XAxis (Ось Х)
1%
YAxis (Ось Y)
Друзья, вы просили иногда делиться лучшими вакансиями в ИТ.
Вот и она!

Джедай PHP на Laravel (Игровой сектор)

Требования:
- Рассмотрим спеца с коммерческим опытом и хорошим кодом /строгое и полное соблюдение PSR стандартов, углубленные знания SQL
- Умение анализировать и оптимизировать запросы, проектировать структуры таблиц с максимальной производительности
- Написание автоматических тестов
- Понимание REST API и протокола HTTP
- Опыт работы с Git, Composer
- Опыт работы с Jira/Gitlab

Условия:
- Работаем удаленно
- З/П 150 000 - 180 000 рублей

Контакты: @Olga_EORA
Как писать хороший код на python?🤔📄

Умение правильно и хорошо писать код — это важный навык для python-разработчика. Как научится писать хороший код — вы узнаете из сегодняшней статьи. Говоря о „хорошем коде“ имеется в виду большое количество факторов с которыми вам предстоит познакомиться, чтобы писать правильный и "конвейерный" код.

Возможно, самый известный сборник этих факторов Python был написан Тимом Питерсом, давний участник языка и его группы новостей
comp.lang.python.
Этот сборник также известен под названием «The Zen of Python» и в нём изложены следующие факторы „хорошего кода“.

👉🏻 The Zen of Python, by Tim Peters 👈🏻
· Beautiful is better than uglyКрасивое — лучше, чем уродливое
·
Explicit is better than implicitЯвное лучше, чем неявное.
·
Simple is better than complexПростое лучше, чем сложное.
·
Complex is better than complicated - Сложное лучше, чем запутанное.
· Flat is better than nested - Плоский лучше, чем вложенный.
· Sparse is better than dense - Редкое лучше, чем частое.
· Readability counts - Читаемость имеет значение.
· Special cases aren't special enough to break the rules - Особых случаев недостаточно, чтобы нарушать правила.
· Although practicality beats purity - Хотя практичность лучше чистоты.
· Errors should never pass silently - Ошибки никогда не должны замалчиваться.
· Unless explicitly silencedЕсли только они не замалчиваются явно.
· In the face of ambiguity, refuse the temptation to guessПеред лицом двусмысленности откажитесь от соблазна угадать.
· There should be one -- and preferably only one -- obvious way to do it.Должен быть один - и желательно только один - очевидный способ сделать это.
· Although that way may not be obvious at first unless you're DutchХотя поначалу этот способ может быть не очевиден, если вы не голландец.
· Now is better than neverЛучше сейчас, чем никогда.
· Although never is often better than *right* nowХотя никогда не бывает лучше, чем прямо сейчас.
· If the implementation is hard to explain, it's a bad ideaЕсли реализацию сложно объяснить, это плохая идея.
· If the implementation is easy to explain, it may be a good idea Если реализацию легко объяснить, это может быть хорошей идеей.
· Namespaces are one honking great idea -- let's do more of those! Пространства имен - одна отличная идея - давайте сделаем их больше!
Эти факторы можно быстро заполучить просто написав в интерпретаторе
import this
После чего вы получите данный список.
***
Без пониманий этих факторов ваш код будет непригодным для больших, и без того сложных проектов.
***
#подработка
Нужен разработчик Golang для выполнения разовой задачи.

Суть задачи:
— Сделать файловый сервер с разграничением прав доступа к файлам.

— Работа с базой данных PostrgeSQL.
— Отдача файлов на загрузку.
— Проверка доступа по одноразовому токену
— HTTP сервер.

P.S.
Простейший скрипт, не нужно чего-то сложного. Схема и описание задачи готово. По нашим ожиданиям, это займёт у вас не более 3 дней.

Контакты: @Olga_EORA