Forwarded from Python Lounge: работа и стажировки для программистов
Начинаем новую серию уроков, где будем создавать приложения с пользовательским интерфейсом с помощью модуля Tkinter
Tkinter: часть 1
Tkinter: часть 1
Teletype
Tkinter: часть 1
Создаем свои первые приложения с пользовательским интерфейсом.
Forwarded from Python Lounge: работа и стажировки для программистов
Продолжаем осваивать модуль Tkinter, в этот раз учимся использовать Canvas и сразу же применяем его на практике
Tkinter: часть 2
Tkinter: часть 2
Teletype
Tkinter: часть 2
Продолжим изучение модуля Tkinter, сделав приложение, которые покажет график синусоиды.
Forwarded from Python Lounge: работа и стажировки для программистов
В прошлых уроках мы научились рисовать графики и добавлять кнопки, в этом уроке мы с вами научимся располагать виджеты по нашему усмотрению
Tkinter: часть 3
Tkinter: часть 3
Teletype
Tkinter: часть 3
В этом уроке мы с вами научимся располагать виджеты по нашему усмотрению.
Forwarded from Python Lounge: работа и стажировки для программистов
Учимся работать с полями для пользовательского ввода и вывода данных, а также практикуемся в использовании кнопок
Tkinter: часть 4
Tkinter: часть 4
Teletype
Tkinter: часть 4
В этом уроке я решил разобрать тему работы с такими новыми штуками, как Label, Entry и Focus.
Использование списков в качестве стеков
Стек — абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»).
Методы встроенного списка в Python позволяют очень легко использовать список в виде стека. Чтобы добавить элемент на вершину стека, используйте
Стек — абстрактный тип данных, представляющий собой список элементов, организованных по принципу 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
Forwarded from Python Lounge: работа и стажировки для программистов
Создаем свой простенький локер - вирус, блокирующий компьютер; а также используем новый интересный модуль
Tkinter: часть 5
Tkinter: часть 5
Teletype
Tkinter: часть 5
Создаем свой простенький локер - вирус, блокирующий компьютер.
Switch-конструкция с помощью словаря
К сожалению, в Python не существует switch-конструкций, в отличие от большинства других языков программирования, и поэтому приходится строить башни из условных операторов в своём коде.
Однако есть одно хитрое решение — использовать словарь, где значениями будут функции. Например, напишем словарь, который будет использован для математических операторов.
В этом примере были использованы lambda-функции для простоты, но вместо них можете подставить любые другие. Для тех, кто не знает: lambda - объявление анонимной функции (можно косвенно сравнить с def); x, y - принимаемые аргументы; x + y - то, что функция возвращает.
Примерно вот так мы можем пользоваться подобной штукой. Думаю, что многие найдут полезное применение подобному использованию словарей.
К сожалению, в 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. Кажется, это должно быть нечто, вроде:
Пока что не обращая внимания на февраль, нам нужно, чтобы +1 в делимом «активировалось» только при достижении аргументом значений, больших 8. При этом значения аргумента не могут превосходить 12. Значит, нам идеально подойдет целочисленное деление аргумента на 8:
Все правильно, кроме февраля. Как неожиданно. В самой последней версии нашей формулы февралю достались целых 30 дней. А потому нам нужно отсечь у него пару дней. Естественно, от этого пострадают и еще какие-то месяцы, поэтому нам придется пожертвовать именно январем, затем подправив формулу и для него. Отсечь дни для первого и второго месяцев можно с помощью выражения 2 % x. Тогда наша формула принимает уже следующий вид:
Остался последний шаг — подлатать январь. Это сделать не так сложно: просто добавим 2 дня только к нему, т.е. к такому месяцу, чей номер меньше либо равен единице. Как вам идея использовать для этой цели
Превосходно, 12 из 12. Подобная функция на языке Python может быть записана следующим образом:
Попробуем написать функцию 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. На вход первым аргументом метод принимает сам класс, а возвращать должен уже экземпляр (даже можно экземпляр и другого класса).
То есть при вызове конструктора класса 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. Во время онлайн-трансляции новоиспеченные бакалавры и магистры получили напутствия от менеджеров Сбербанка и представителей университетов, прошли тест на уровень развития эмоционального интеллекта и разились за годовую подписку в онлайн-кинотеатре Окко в «Квиз, плиз».
Помимо дипломов выпускники получили именные сертификаты, подписанные Президентом, Председателем Правления Сбербанка Германом Грефом. Многие из выпускников уже получили предложение стать сотрудниками Сбербанка.
Совместные образовательные программы Сбербанка реализованы в 12 вузах страны от Москвы до Владивостока. Направления подготовки разные — от «Экономики» до «Software Engineering». Обучение доступно как для магистров, так и для бакалавров на конкурсной и коммерческой основе. Узнать подробнее о сроках приемной кампании и образовательных программах можно на онлайн-платформе SberGraduate.
Какие совместные образовательные программы есть?
Национальный исследовательский ядерный университет «МИФИ»: программа дополнительного образования «Информационные технологии в социальных системах»
Московский физико-технический университет: бакалаврская программа «Software Engineering»
Российская академия народного хозяйства и государственной службы при Президенте Российской Федерации: магистерская программа «Финансы и технологии»
Национальный исследовательский университет «Высшая школа экономики»: магистерская программа «Финансовые технологии и анализ данных»
Балтийский федеральный университет им. Канта: магистерская программа «Банковские информационные технологии»
Факультет вычислительной математики и кибернетики МГУ им. М.В. Ломоносова: магистерская программа «Программное обеспечение вычислительных сетей»
Университет ИТМО: магистерские программы «Цифровые технологии умного города», «Информационная безопасность», «Финансовые технологии больших данных», «Робототехника»
Дальневосточный федеральный университет: бакалаврская программа «Экономика» и магистерская программа «Искусственный интеллект и большие данные»
Южный Федеральный Университет: бакалаврская программа «Специализированный курс по обучению Java разработке»
Самарский НИУ академика С.П.Королева: магистерская программа «Data Science»
Уральский федеральный университет: программа дополнительного образования «Сбертех Start» и магистерская программа «Прикладной анализ данных»
Рязанский государственный радиотехнический университет: совместный учебный курс «Business Intelligence», «Архитектура промышленных автоматизированных систем» и «Промышленное программирование на Java»
Digital-выпускной SberGraduate 2020
В конце июля состоялся первый в истории digital-выпускной образовательных программ Сбербанка SberGraduate. Во время онлайн-трансляции новоиспеченные бакалавры и магистры получили напутствия от менеджеров Сбербанка и представителей университетов, прошли тест на уровень развития эмоционального интеллекта и разились за годовую подписку в онлайн-кинотеатре Окко в «Квиз, плиз».
Помимо дипломов выпускники получили именные сертификаты, подписанные Президентом, Председателем Правления Сбербанка Германом Грефом. Многие из выпускников уже получили предложение стать сотрудниками Сбербанка.
Изменение списка во время итерации по нему
Предположим, что требуется удалить все нечетные числа из списка. Проблема со следующим кодом должна быть довольно очевидной:
Удаление элемента из списка во время его итерации – это проблема, которая хорошо известна любому опытному разработчику.
К счастью, Python включает в себя ряд элегантных парадигм программирования, которые при правильном использовании могут привести к значительному упрощению и оптимизации кода. Одна из таких парадигм – list comprehensions. Генераторы списков часто используют именно для решения подобных проблем, что и показывает реализация кода ниже:
Предположим, что требуется удалить все нечетные числа из списка. Проблема со следующим кодом должна быть довольно очевидной:
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 – язык с динамической типизацией. Аннотации типов нужны для того, чтобы повысить информативность исходного кода, но они никак не влияют на поведение программы.
Для примера потребуется импортировать типы
Типы данных указывается через двоеточие после именно переменной после её создания. Создадим словарь с числами и сразу же список, состоящий из значений этого словаря:
Потом создадим функцию, возвращающую сумму переданных значений. В аргументах точно так же можно указывать их типы, а также через стрелочку можно указать типа возвращаемого значения:
Теперь используем эту функцию, передав туда распакованный список:
Однако помните, что аннотации типов не влияют на ход исполнения программы, поэтому в ранее написаную функцию мы с таким же успехом можем передать и строки, хотя указывали целочисленный типа данных:
Всем известно, что 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. Давайте создадим наш собственный менеджер контекста для открытия файлов и поймем суть его работы.
Просто определив методы enter и exit, мы можем использовать наш новый класс с оператором
Наш метод exit принимает три аргумента. Они требуются для каждого метода exit, который является частью класса.
# test
Начнем с того, что в контекстном менеджере должны быть определены методы 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
Иногда приходится писать код с несколькими контекстными менеджерами, что выглядит не особо лаконично:
Начиная с Python 2.7 и 3.1, вы можете использовать всего один with:
До этого вы могли бы использовать функцию nested из contextlib:
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
В стол или в релиз? Проверь, какой из тебя стартапер: https://sc.link/zX7
В Python имя переменной может состоять из одного подчеркивания: _. Хотя обычно такие имена не достаточно описательны и не должны использоваться, есть по крайней мере три случая, когда _ имеет общепринятый смысл.
Во-первых, интерактивные интерпретаторы Python используют _ для хранения результата последнего выполненного выражения:
В-третьих, _ используется, когда вам нужно придумать имена для значений, которые вам не нужны:
Во-первых, интерактивные интерпретаторы Python используют _ для хранения результата последнего выполненного выражения:
>>> 2 + 2Во-вторых, руководство модуля gettext рекомендует псевдоним его функции gettext() для _(), чтобы минимизировать загромождение вашего кода.
4
>>> _
4
В-третьих, _ используется, когда вам нужно придумать имена для значений, которые вам не нужны:
for _ in range(10):
print('Hello!')
"Быстрый" контейнер deque
Deque может быть реализован на Python с помощью модуля collections. Deque предпочтительнее, чем обычный список, в тех случаях, когда нам нужны более быстрые операции добавления и вытягивания элементо из обоих концов контейнера, поскольку deque обеспечивает линейную сложность O(1) для операций добавления и выталкивания по сравнению со списком, у которого сложность по времени для тех операций составляет O(n). Вот пример основных методов:
Также для deque есть возможность использовать стандартные функции по типу sum, min, max и тому подобные.
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
Tkinter: часть 5
Teletype
Tkinter: часть 5
Создаем свой простенький локер - вирус, блокирующий компьютер.