Если 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.
Использование списков в качестве стеков
Стек — абстрактный тип данных, представляющий собой список элементов, организованных по принципу 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
Выражение del
Существует способ удалить элемент из списка по его индексу, а не по значению - с помощью оператора del. Это отличается от метода pop(), который возвращает значение. Оператор del также можно использовать для удаления фрагментов из списка или очистки всего списка. Например:
del также может быть использован для удаления целых переменных:
Обращение к этой переменной в дальнейшем вызовет ошибку (по крайней мере, пока ей не присвоено другое значение).
Существует способ удалить элемент из списка по его индексу, а не по значению - с помощью оператора del. Это отличается от метода pop(), который возвращает значение. Оператор del также можно использовать для удаления фрагментов из списка или очистки всего списка. Например:
>>> a = [1, 2, 3, 4, 5, 6]
>>> del a[0]
>>> a
[2, 3, 4, 5, 6]
>>> del a[2:4]
>>> a
[2, 3, 6]
>>> del a[:]
>>> a
[]
del также может быть использован для удаления целых переменных:
>>> del a
Обращение к этой переменной в дальнейшем вызовет ошибку (по крайней мере, пока ей не присвоено другое значение).
"Быстрый" контейнер 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
Создаем свой простенький локер - вирус, блокирующий компьютер.