Иногда приходится писать код с несколькими контекстными менеджерами, что выглядит не особо лаконично:
Начиная с 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
В этот раз мы с вами поговорим о декораторах, которые используются повсеместно практически во всех Python приложениях
Декораторы #урок 18
Декораторы #урок 18
Telegraph
Декораторы
Декоратор - это функция, которая принимает функцию и возвращает функцию. Звучит странно, но лучше запомните именно такое определение, это достаточно важно для понимания. А вообще, декораторы по сути являются некими модификаторами к нашим функциям. Первый…
В Python блок else может быть представлен не только после if, но и после for и while. Код внутри else выполняется, только если цикл не был прерван с помощью break.
Типичный пример - поиск чего-либо в цикле с использованием break при нахождении:
Типичный пример - поиск чего-либо в цикле с использованием break при нахождении:
for х in [2, 3, 4, 5]:
if x % 2 == 1:
print (x)
break
else:
print('Нет нечётных элементов в списке')
# Output: 3
for х in [2, 4, 6]:
if x % 2 == 1:
print(x)
break
else:
print('Нет нечётных элементов в списке')
# Output: Нет нечётных элементов в списке
В Python имя переменной может состоять из одного подчеркивания: _. Хотя обычно такие имена не достаточно описательны и не должны использоваться, есть по крайней мере три случая, когда _ имеет общепринятый смысл.
Во-первых, интерактивные интерпретаторы Python используют _ для хранения результата последнего выполненного выражения:
Во-вторых, руководство модуля gettext рекомендует псевдоним его функции gettext() для _(), чтобы минимизировать загромождение вашего кода.
В-третьих, _ используется, когда вам нужно придумать имена для значений, которые вам не нужны:
Во-первых, интерактивные интерпретаторы Python используют _ для хранения результата последнего выполненного выражения:
>>> 2 + 2
4
>>> _
4
Во-вторых, руководство модуля gettext рекомендует псевдоним его функции gettext() для _(), чтобы минимизировать загромождение вашего кода.
В-третьих, _ используется, когда вам нужно придумать имена для значений, которые вам не нужны:
for _ in range(10):
print('Hello!')
В этой статье мы разбираем основы работы с изображениями на Python и в частности смотрим на достаточно удобный модуль Pillow
Обработка изображений с помощью Pillow
Обработка изображений с помощью Pillow
Telegraph
Обработка изображений с помощью Pillow
Pillow - крайне полезный и простой инструмент для работы с изображениями на Python. Для того, чтобы установить модуль pillow достаточно просто ввести в терминал pip install pillow. Открытие и вывод изображения Для начала мы откроем картинку и выведем ее на…
Если dict запоминает порядок элементов в Python3.6 +, то тогда зачем может понадобится collection.OrderedDict? Вот зачем:
>>> OrderedDict(a=1, b=2) == OrderedDict(b=2, a=1)
False
>>> dict(a=1, b=2) == dict(b=2, a=1)
True
Начиная с Python 3.5, есть возможность использовать распаковку со словарями и списками.
Для словарей эта форма даже более мощная, чем функция dict, поскольку она позволяет переопределять значения:
In: {**{'a': 1}, 'b': 2, **{'c': 3}}
Out: {'a': 1, 'b': 2, 'c': 3}
In: [1, 2, *[3, 4]]
Out: [1, 2, 3, 4]Для словарей эта форма даже более мощная, чем функция dict, поскольку она позволяет переопределять значения:
In: {**{'a': 1, 'b': 1}, 'a': 2, **{'b': 3}}
Out: {'a': 2, 'b': 3}Статья рекомендуется всем тем, кто проводит много времени сидя на компьютером, да и не только, потому что поддерживать своё состояние необходимо всем
Здоровье программиста
Здоровье программиста
Telegraph
Здоровье программиста
Думаю, абсолютно все программисты и не только сталкиваются с проблемами, связанными со здоровьем, в связи с работой перед монитором. В этой статье мы разберем самые частые ошибки и приведем рекомендации, как поддерживать своё здоровье даже с сидячим образом…
Часто бывает очень удобно использовать namedtuple. Например, у вас есть словарь по типу "имя": "оценка", и вы хотите сортировать по "оценке".
Сортировка с наименьшей оценкой сначала:
Сортировка по наивысшему рангу:
Теперь вы можете получить имя и оценку следующим образом:
import collections
Player = collections.namedtuple('Player', 'score name')
d = {'John': 5, 'Alex' : 10, 'Richard': 7}
Сортировка с наименьшей оценкой сначала:
worst = sorted(Player(v ,k) for (k, v) in d.items())
Сортировка по наивысшему рангу:
best = sorted([Player(v, k) for (k, v) in d.items()], reverse=True)
Теперь вы можете получить имя и оценку следующим образом:
player = best[1]
player.name
# Out: 'Richard'
player.score
# Out: 7
Counter из модуля collections - вид словаря, который позволяет считать количество неизменяемых объектов (в большинстве случаев, строк). Например, можно проверить, составлены ли разные слова из одного и того же набора букв.
from collections import Counter
def check(str1, str2):
return Counter(str1) == Counter(str2)
print(check('abc', 'cba'))
# True
print(check('sdf', 'asd'))
# False
Начинаем новую серию уроков, где будем создавать приложения с пользовательским интерфейсом с помощью модуля Tkinter
Tkinter: часть 1
Tkinter: часть 1
Teletype
Tkinter: часть 1
Создаем свои первые приложения с пользовательским интерфейсом.
В отличие от некоторых языков программирования типы данных Python преобразуются в False, если они пусты, и в True, если нет. Это означает, что вам не нужно проверять, например, что длина строки, кортежа, списка или словаря равна 0. Достаточно просто проверить "правдивость" объекта.
Как и следовало ожидать, нулевое число ложно, в то время как все остальные числа истинны.
Например, следующие выражения эквивалентны. Здесь my_object - это строка, но это может быть другой тип Python (с соответствующими изменениями в тесте на равенство)
Как и следовало ожидать, нулевое число ложно, в то время как все остальные числа истинны.
Например, следующие выражения эквивалентны. Здесь my_object - это строка, но это может быть другой тип Python (с соответствующими изменениями в тесте на равенство)
my_object = 'Test' # True example
# my_object = '' # False example
if len(my_object) > 0:
print('my_object is not empty')
if len(my_object):
print('my_object is not empty')
# 0 will evaluate to False
if my_object != '':
print('my_object is not empty')
if my_object:
print('my_object is not empty')
# an empty string will evaluate to False
Enumerate - встроенная функция Python. Ее полезность не может быть сведена в одну строку. Тем не менее, большинство новичков и даже некоторые опытные программисты не знают об этом. Это позволяет нам итерировать что-либо в цикле и иметь автоматический счетчик. Вот пример:
И это еще не все, enumerate также принимает необязательный аргумент, который делает функцию еще более полезной.
Необязательный аргумент позволяет нам указать перечислить, откуда начинать индекс. Вы также можете создавать кортежи, содержащие индекс и элемент списка, используя список. Вот пример:
for counter, value in enumerate(some_list):
print(counter, value)И это еще не все, enumerate также принимает необязательный аргумент, который делает функцию еще более полезной.
my_list = ['apple', 'banana', 'grapes', 'pear']
for c, value in enumerate(my_list, 1):
print(c, value)
# Output:
# 1 apple
# 2 banana
# 3 grapes
# 4 pearНеобязательный аргумент позволяет нам указать перечислить, откуда начинать индекс. Вы также можете создавать кортежи, содержащие индекс и элемент списка, используя список. Вот пример:
my_list = ['apple', 'banana', 'grapes', 'pear']
counter_list = list(enumerate(my_list, 1))
print(counter_list)
# Output: [(1, 'apple'), (2, 'banana'), (3, 'grapes'), (4, 'pear')]Продолжаем осваивать модуль Tkinter, в этот раз учимся использовать Canvas и сразу же применяем его на практике
Tkinter: часть 2
Tkinter: часть 2
Teletype
Tkinter: часть 2
Продолжим изучение модуля Tkinter, сделав приложение, которые покажет график синусоиды.
Константы модуля string
Так как это встроенный модуль, то мы должны импортировать его перед использованием любых его констант и классов. А теперь давайте посмотрим на те самые константы, определенные в этом модуле.
Так как это встроенный модуль, то мы должны импортировать его перед использованием любых его констант и классов. А теперь давайте посмотрим на те самые константы, определенные в этом модуле.
>>> import string
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.ascii_lowercase
'abcdefghijklmnopqrstuvwxyz'
>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.hexdigits
'0123456789abcdefABCDEF'
>>> string.whitespace
' \t\n\r\x0b\x0c'
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_{|}~'Контекстные менеджеры
Контекстные менеджеры — это специальные конструкции, которые представляют из себя блоки кода, заключенные в инструкцию
Простейшей функцией, использующей данный протокол является функция
Чтобы каждый раз не вызывать метод
Здесь нам не нужно каждый раз вызывать метод
Контекстные менеджеры — это специальные конструкции, которые представляют из себя блоки кода, заключенные в инструкцию
with. Инструкция with создает блок, используя протокол, контекстного менеджера. Простейшей функцией, использующей данный протокол является функция
open(). Каждый раз, когда мы открываем файл, нам необходимо его закрыть, чтобы вытолкнуть выходные данные на диск (на самом деле Python вызывает метод close() автоматически, но явное его использование является хорошим тоном). Например:file = open("file.txt", "w")
file.write("Hello, World")
file.close()Чтобы каждый раз не вызывать метод
close() мы можем воспользоваться контекстным менеджером функции open(), который автоматически закроет файл после выхода из блока:with open("file.txt", "w") as file:
file.write("Hello, World")Здесь нам не нужно каждый раз вызывать метод
close, чтобы вытолкнуть данные в файл. Из этого следует, что контекстный менеджер используется для выполнения каких-либо действий до входа в блок и после выхода из него. Но функциональность контекстных менеджеров на этом не заканчивается.Реализация класса контекстного менеджера
Начнем с того, что в контекстном менеджере должны быть определены методы
Просто определив методы
Наш метод
# 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
В прошлых уроках мы научились рисовать графики и добавлять кнопки, в этом уроке мы с вами научимся располагать виджеты по нашему усмотрению
Tkinter: часть 3
Tkinter: часть 3
Teletype
Tkinter: часть 3
В этом уроке мы с вами научимся располагать виджеты по нашему усмотрению.
Кэширование функций
Кэширование может сэкономить время, когда связанная с вводом или выводом функция периодически вызывается с одинаковыми аргументами. До Python 3.2 мы должны были написать собственную реализацию. В Python 3.2+ есть декоратор
Давайте реализуем калькулятор чисел Фибоначчи с использованием кэша.
Советую попробовать запустить любую рекурсивную функцию с кэшированием и без него, прирост в скорости замечается сразу.
Кэширование может сэкономить время, когда связанная с вводом или выводом функция периодически вызывается с одинаковыми аргументами. До Python 3.2 мы должны были написать собственную реализацию. В Python 3.2+ есть декоратор
lru_cache, который позволяет нам быстро кэшировать и вскрывать возвращаемые значения функции.Давайте реализуем калькулятор чисел Фибоначчи с использованием кэша.
from functools import lru_cache@lru_cache(maxsize=32)def fib(n): if n < 2: return n return fib(n - 1) + fib(n - 2)>>> print([fib(n) for n in range(10)])# Output: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]Советую попробовать запустить любую рекурсивную функцию с кэшированием и без него, прирост в скорости замечается сразу.
Forwarded from Hello World
“is” vs “==“
Два списка указывают на один и тот же объект:
Результат:
Пробуем создать абсолютно новый объект:
Результат:
📎 is возвратит True, если обе переменные ссылаются на один объект
📎 == возвратит True, если сравниваемые объекты идентичны
#tips
Два списка указывают на один и тот же объект:
>>> a = [1, 2, 3]
>>> b = a
Результат:
>>> a is b
True
>>> a == b
True
Пробуем создать абсолютно новый объект:
>>> c = a[:]
Результат:
>>> a == c
True
>>> a is c
False
📎 is возвратит True, если обе переменные ссылаются на один объект
📎 == возвратит True, если сравниваемые объекты идентичны
#tips
Учимся работать с полями для пользовательского ввода и вывода данных, а также практикуемся в использовании кнопок
Tkinter: часть 4
Tkinter: часть 4
Teletype
Tkinter: часть 4
В этом уроке я решил разобрать тему работы с такими новыми штуками, как Label, Entry и Focus.