0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#Руководства</a></p>
1
<p><a>#Руководства</a></p>
2
<ul><li>6 авг 2021</li>
2
<ul><li>6 авг 2021</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Короткие программы на Python - первый шаг к реальной магии кода.</p>
4
</ul><p>Короткие программы на Python - первый шаг к реальной магии кода.</p>
5
<p>Darshan Patel / Unsplash / Pixabay / Pexels / Colowgee для Skillbox Media</p>
5
<p>Darshan Patel / Unsplash / Pixabay / Pexels / Colowgee для Skillbox Media</p>
6
<p>Кандидат философских наук, специалист по математическому моделированию. Пишет про Data Science, AI и программирование на Python.</p>
6
<p>Кандидат философских наук, специалист по математическому моделированию. Пишет про Data Science, AI и программирование на Python.</p>
7
<p>Веб-разработка и научные вычисления, роботы и Data Science - Python повсюду. На нём пишут и масштабные проекты, и короткие программы (скрипты, или сниппеты), полезные в повседневных рабочих и учебных задачах.</p>
7
<p>Веб-разработка и научные вычисления, роботы и Data Science - Python повсюду. На нём пишут и масштабные проекты, и короткие программы (скрипты, или сниппеты), полезные в повседневных рабочих и учебных задачах.</p>
8
<p>Собрали для вас коллекцию таких небольших "заклинаний". Основной принцип: минимум строк кода, в котором можно разобраться максимум за полминуты. Сову из Хогвартса мы не гарантируем, но удивить однокашников, коллег и интервьюеров, уверены, у вас получится. Вперёд!</p>
8
<p>Собрали для вас коллекцию таких небольших "заклинаний". Основной принцип: минимум строк кода, в котором можно разобраться максимум за полминуты. Сову из Хогвартса мы не гарантируем, но удивить однокашников, коллег и интервьюеров, уверены, у вас получится. Вперёд!</p>
9
<p><strong>Внимание:</strong>устное произнесение заклинаний в текущей версии Python не поддерживается. Вам потребуется компьютер, интерпретатор и код.</p>
9
<p><strong>Внимание:</strong>устное произнесение заклинаний в текущей версии Python не поддерживается. Вам потребуется компьютер, интерпретатор и код.</p>
10
Кадр: фильм "Гарри Поттер и философский камень"<p>Скрипт проверяет, являются ли две строки анаграммами друг друга. Иными словами, не получена ли одна строка перестановкой символов другой строки.</p>
10
Кадр: фильм "Гарри Поттер и философский камень"<p>Скрипт проверяет, являются ли две строки анаграммами друг друга. Иными словами, не получена ли одна строка перестановкой символов другой строки.</p>
11
from collections import Counter def anagram(first, second): return Counter(first) == Counter(second) anagram("пират", "тапир") >>> True<p>Используется Counter из библиотеки collections - это разновидность словаря, используемая для подсчёта элементов в итерируемых объектах: списках, кортежах, словарях, строках.</p>
11
from collections import Counter def anagram(first, second): return Counter(first) == Counter(second) anagram("пират", "тапир") >>> True<p>Используется Counter из библиотеки collections - это разновидность словаря, используемая для подсчёта элементов в итерируемых объектах: списках, кортежах, словарях, строках.</p>
12
<p>Подробнее об этой замечательной библиотеке читайте в<a>нашей статье</a>.</p>
12
<p>Подробнее об этой замечательной библиотеке читайте в<a>нашей статье</a>.</p>
13
<p>Этот скрипт используется для измерения количества памяти, потребляемой любым объектом в Python: переменной, функцией, классом.</p>
13
<p>Этот скрипт используется для измерения количества памяти, потребляемой любым объектом в Python: переменной, функцией, классом.</p>
14
import sys variable = 30 print(sys.getsizeof(variable)) >>> 24<p>Обратите внимание, что учитывается только та память, которую занимает сам объект, а не те объекты, на которые он, возможно, ссылается. Размер памяти возвращается в байтах.</p>
14
import sys variable = 30 print(sys.getsizeof(variable)) >>> 24<p>Обратите внимание, что учитывается только та память, которую занимает сам объект, а не те объекты, на которые он, возможно, ссылается. Размер памяти возвращается в байтах.</p>
15
<p>Метод для определения длины строки в байтах. Это не то же самое, что размер объекта из скрипта выше.</p>
15
<p>Метод для определения длины строки в байтах. Это не то же самое, что размер объекта из скрипта выше.</p>
16
def byte_size(string): return(len(string.encode('utf-8'))) byte_size('Я люблю Python!') >>> 11 print(sys.getsizeof('Я люблю Python!')) >>> 104 byte_size('?') >>> 4<p>Байтовый размер объекта-строки в памяти всегда больше байтовой длины строки, поскольку объект-строка содержит и саму строку, и дополнительную информацию о ней - например, ссылки на методы строк.</p>
16
def byte_size(string): return(len(string.encode('utf-8'))) byte_size('Я люблю Python!') >>> 11 print(sys.getsizeof('Я люблю Python!')) >>> 104 byte_size('?') >>> 4<p>Байтовый размер объекта-строки в памяти всегда больше байтовой длины строки, поскольку объект-строка содержит и саму строку, и дополнительную информацию о ней - например, ссылки на методы строк.</p>
17
<p>Этот код нарезает список на списки меньшего размера, которые собраны снова в список. Размер надо задать заранее.</p>
17
<p>Этот код нарезает список на списки меньшего размера, которые собраны снова в список. Размер надо задать заранее.</p>
18
def chunk(list, size): return [list[i:i+size] for i in range(0, len(list), size)] lst = [i for i in range(25)] chunk(lst, 7) >>> [[0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24]]<p>Как видим, последний список получился короче: 4 элемента вместо 7. Проверьте, что будет, если размер нарезаемых списков задать больше, чем составляет длина начального списка.</p>
18
def chunk(list, size): return [list[i:i+size] for i in range(0, len(list), size)] lst = [i for i in range(25)] chunk(lst, 7) >>> [[0, 1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13], [14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24]]<p>Как видим, последний список получился короче: 4 элемента вместо 7. Проверьте, что будет, если размер нарезаемых списков задать больше, чем составляет длина начального списка.</p>
19
<p>Этот скрипт удаляет "ложные" значения (False, None, 0 и пустую строку ' ') из списка. Используется встроенная функция filter(): c параметром None на первом месте она удалит из списка lst все значения, которые не вернут True по умолчанию.</p>
19
<p>Этот скрипт удаляет "ложные" значения (False, None, 0 и пустую строку ' ') из списка. Используется встроенная функция filter(): c параметром None на первом месте она удалит из списка lst все значения, которые не вернут True по умолчанию.</p>
20
def compact(lst): return list(filter(None, lst)) compact([0, 1, False, None, 2, '', 3, 'a', 's', 34]) >>> [1, 2, 3, 'a', 's', 34]<p>Проверить вручную какое-либо значение на True/False можно с помощью функции bool(): bool(0) вернёт False, но bool('0') уже будет True, так как это непустая строка.</p>
20
def compact(lst): return list(filter(None, lst)) compact([0, 1, False, None, 2, '', 3, 'a', 's', 34]) >>> [1, 2, 3, 'a', 's', 34]<p>Проверить вручную какое-либо значение на True/False можно с помощью функции bool(): bool(0) вернёт False, но bool('0') уже будет True, так как это непустая строка.</p>
21
<p>Примеры использования функции filter() можно найти<a>здесь</a>.</p>
21
<p>Примеры использования функции filter() можно найти<a>здесь</a>.</p>
22
<p>В простейшем случае двумерная матрица может быть задана списком из нескольких списков одинаковой длины, которые представляют собой строки матрицы. Если вам требуется "повернуть на 90 градусов" такую матрицу или превратить строки в столбцы (транспонировать, как говорят математики), то вот короткий код:</p>
22
<p>В простейшем случае двумерная матрица может быть задана списком из нескольких списков одинаковой длины, которые представляют собой строки матрицы. Если вам требуется "повернуть на 90 градусов" такую матрицу или превратить строки в столбцы (транспонировать, как говорят математики), то вот короткий код:</p>
23
array = [['a', 'b'], ['c', 'd'], ['e', 'f']] transposed = list(zip(*array)) print(transposed) >>> [('a', 'c', 'e'), ('b', 'd', 'f')]<p>Обратите внимание, что в итоговом списке элементами (то есть строками новой матрицы) будут кортежи - так работает используемая здесь функция zip().</p>
23
array = [['a', 'b'], ['c', 'd'], ['e', 'f']] transposed = list(zip(*array)) print(transposed) >>> [('a', 'c', 'e'), ('b', 'd', 'f')]<p>Обратите внимание, что в итоговом списке элементами (то есть строками новой матрицы) будут кортежи - так работает используемая здесь функция zip().</p>
24
<p>Ох уж эти списки, состоящие из списков. Как бы их сделать попроще, выстроить в один ряд? Для этого тоже есть решение.</p>
24
<p>Ох уж эти списки, состоящие из списков. Как бы их сделать попроще, выстроить в один ряд? Для этого тоже есть решение.</p>
25
def deep_flatten(xs): flat_list = [] [flat_list.extend(deep_flatten(x)) for x in xs] if isinstance(xs, list) else flat_list.append(xs) return flat_list deep_flatten([1, [2], [[3, [1], 4], 5]]) >>> [1, 2, 3, 1, 4, 5]<p>В третьей строке код проверяет, не является ли элемент списком. Если да, то использует метод extend() для расширения этим элементом итогового списка, если нет - то присоединяет его как одиночный элемент методом append().</p>
25
def deep_flatten(xs): flat_list = [] [flat_list.extend(deep_flatten(x)) for x in xs] if isinstance(xs, list) else flat_list.append(xs) return flat_list deep_flatten([1, [2], [[3, [1], 4], 5]]) >>> [1, 2, 3, 1, 4, 5]<p>В третьей строке код проверяет, не является ли элемент списком. Если да, то использует метод extend() для расширения этим элементом итогового списка, если нет - то присоединяет его как одиночный элемент методом append().</p>
26
<p>Также в этой строке функция вызывает сама себя и, в случае списков, состоящих из списков, "проваливается" в них до тех пор, пока не доберётся до элементов, не являющихся списками. Это называется рекурсией.</p>
26
<p>Также в этой строке функция вызывает сама себя и, в случае списков, состоящих из списков, "проваливается" в них до тех пор, пока не доберётся до элементов, не являющихся списками. Это называется рекурсией.</p>
27
<p>Этот простой скрипт проверяет, содержатся ли в списке повторяющиеся значения (дубликаты). Используется свойство множеств set, которые могут содержать только уникальные элементы.</p>
27
<p>Этот простой скрипт проверяет, содержатся ли в списке повторяющиеся значения (дубликаты). Используется свойство множеств set, которые могут содержать только уникальные элементы.</p>
28
def has_duplicates(lst): return len(lst) != len(set(lst)) x = [1,2,3,4,5,5] y = [1,2,3,4,5] has_duplicates(x) >>> True has_duplicates(y) >>> False<p>Вместо списков могут быть и кортежи, и словари. В последнем случае проверка будет выполняться только среди ключей словаря.</p>
28
def has_duplicates(lst): return len(lst) != len(set(lst)) x = [1,2,3,4,5,5] y = [1,2,3,4,5] has_duplicates(x) >>> True has_duplicates(y) >>> False<p>Вместо списков могут быть и кортежи, и словари. В последнем случае проверка будет выполняться только среди ключей словаря.</p>
29
<p>Для того чтобы объединить два словаря, есть как минимум два способа: прямой и современный.</p>
29
<p>Для того чтобы объединить два словаря, есть как минимум два способа: прямой и современный.</p>
30
# прямой -- работает во всех версиях Python 3.* def merge_two_dicts(a, b): c = a.copy() # создаёт копию первого словаря c.update(b) # обновляет копию словаря а словарём b return c a = { 'x': 1, 'y': 2} b = { 'y': 3, 'z': 4} print(merge_two_dicts(a, b)) >>> {'y': 3, 'x': 1, 'z': 4} # современный -- работает в версиях Python 3.5 и выше def merge_dictionaries(a, b): return {**a, **b} a = { 'x': 1, 'y': 2} b = { 'y': 3, 'z': 4} print(merge_dictionaries(a, b)) >>> {'y': 3, 'x': 1, 'z': 4}<p>Обратите внимание на то, что значения итогового словаря будут зависеть от порядка исходных словарей в функциях: если переставить местами словари a и b, значение ключа 'y' изменится на 2.</p>
30
# прямой -- работает во всех версиях Python 3.* def merge_two_dicts(a, b): c = a.copy() # создаёт копию первого словаря c.update(b) # обновляет копию словаря а словарём b return c a = { 'x': 1, 'y': 2} b = { 'y': 3, 'z': 4} print(merge_two_dicts(a, b)) >>> {'y': 3, 'x': 1, 'z': 4} # современный -- работает в версиях Python 3.5 и выше def merge_dictionaries(a, b): return {**a, **b} a = { 'x': 1, 'y': 2} b = { 'y': 3, 'z': 4} print(merge_dictionaries(a, b)) >>> {'y': 3, 'x': 1, 'z': 4}<p>Обратите внимание на то, что значения итогового словаря будут зависеть от порядка исходных словарей в функциях: если переставить местами словари a и b, значение ключа 'y' изменится на 2.</p>
31
<p>Этот короткий скрипт вернёт элемент, чаще всего встречающийся в списке.</p>
31
<p>Этот короткий скрипт вернёт элемент, чаще всего встречающийся в списке.</p>
32
def most_frequent(list): return max(set(list), key = list.count) numbers = [1,2,1,2,3,2,1,4,2] most_frequent(numbers) >>> 2<p>Используются продвинутые параметры встроенной функции max():</p>
32
def most_frequent(list): return max(set(list), key = list.count) numbers = [1,2,1,2,3,2,1,4,2] most_frequent(numbers) >>> 2<p>Используются продвинутые параметры встроенной функции max():</p>
33
<ul><li>первым аргументом она получает множество из элементов списка (помним, что в множестве все элементы уникальны);</li>
33
<ul><li>первым аргументом она получает множество из элементов списка (помним, что в множестве все элементы уникальны);</li>
34
<li>затем применяет к каждому из них функцию count, подсчитывающую, сколько раз элемент встречается в списке;</li>
34
<li>затем применяет к каждому из них функцию count, подсчитывающую, сколько раз элемент встречается в списке;</li>
35
<li>после этого возвращает элемент множества, который имеет больше всего "попаданий".</li>
35
<li>после этого возвращает элемент множества, который имеет больше всего "попаданий".</li>
36
</ul><p>В качестве аргумента можно использовать списки, кортежи и строки.</p>
36
</ul><p>В качестве аргумента можно использовать списки, кортежи и строки.</p>
37
<p>Простой вариант этого кода проверяет, является ли слово без пробелов и знаков препинания, написанное в одном регистре, палиндромом.</p>
37
<p>Простой вариант этого кода проверяет, является ли слово без пробелов и знаков препинания, написанное в одном регистре, палиндромом.</p>
38
def palindrome(a): return a == a[::-1] palindrome('казак') >>> True<p>Более сложный вариант, который сможет проверить строку "А роза упала на лапу Азора", предлагаем написать самостоятельно. Общая идея: свести сложную строку к простой, хоть и длинной 'арозаупаланалапуазора'. Вам пригодятся функции строк .lower(), .join(), а также, возможно, преобразование строки в список.</p>
38
def palindrome(a): return a == a[::-1] palindrome('казак') >>> True<p>Более сложный вариант, который сможет проверить строку "А роза упала на лапу Азора", предлагаем написать самостоятельно. Общая идея: свести сложную строку к простой, хоть и длинной 'арозаупаланалапуазора'. Вам пригодятся функции строк .lower(), .join(), а также, возможно, преобразование строки в список.</p>
39
<p>Этот сниппет поможет вам изменить порядок элементов списка на случайный. Обратите внимание на то, что функция shuffle из библиотеки random меняет исходный список.</p>
39
<p>Этот сниппет поможет вам изменить порядок элементов списка на случайный. Обратите внимание на то, что функция shuffle из библиотеки random меняет исходный список.</p>
40
from random import shuffle foo = [1, 2, 3, 4] shuffle(foo) print(foo) >>> [3, 1, 2, 4]<p>Подробнее про библиотеку random и случайные числа в Python читайте в <a>нашей статье</a>.</p>
40
from random import shuffle foo = [1, 2, 3, 4] shuffle(foo) print(foo) >>> [3, 1, 2, 4]<p>Подробнее про библиотеку random и случайные числа в Python читайте в <a>нашей статье</a>.</p>
41
<p>Этот код получает две даты (начальную и конечную) и создаёт список из дат между ними, включая начальную и исключая последнюю.</p>
41
<p>Этот код получает две даты (начальную и конечную) и создаёт список из дат между ними, включая начальную и исключая последнюю.</p>
42
from datetime import timedelta, date def daterange(start, end): return [start + timedelta(n) for n in range(int((end - start).days))] daterange(date(2020, 10, 1), date(2020, 10, 5)) >>> [datetime.date(2020, 10, 1), datetime.date(2020, 10, 2), datetime.date(2020, 10, 3), datetime.date(2020, 10, 4)]<p>Для получения дней между начальной и конечной датой используется datetime.timedelta.days.</p>
42
from datetime import timedelta, date def daterange(start, end): return [start + timedelta(n) for n in range(int((end - start).days))] daterange(date(2020, 10, 1), date(2020, 10, 5)) >>> [datetime.date(2020, 10, 1), datetime.date(2020, 10, 2), datetime.date(2020, 10, 3), datetime.date(2020, 10, 4)]<p>Для получения дней между начальной и конечной датой используется datetime.timedelta.days.</p>
43
<p>Превращает целое число в список его цифр.</p>
43
<p>Превращает целое число в список его цифр.</p>
44
def digitize(n): return list(map(int, str(n))) digitize(123) >>> [1, 2, 3]<p>Функция map() принимает желаемый тип выходных данных (в нашем случае это int, целые числа) и итерируемый объект (строку, список или кортеж), элементы которого можно превратить в элементы этого типа. После этого другая функция list() преобразует результат в список.</p>
44
def digitize(n): return list(map(int, str(n))) digitize(123) >>> [1, 2, 3]<p>Функция map() принимает желаемый тип выходных данных (в нашем случае это int, целые числа) и итерируемый объект (строку, список или кортеж), элементы которого можно превратить в элементы этого типа. После этого другая функция list() преобразует результат в список.</p>
45
<p>Преобразует число в обычной десятичной ("арабской") записи в форму римского числа. Работает со значениями от 1 до 3999 включительно, возвращает строку (str).</p>
45
<p>Преобразует число в обычной десятичной ("арабской") записи в форму римского числа. Работает со значениями от 1 до 3999 включительно, возвращает строку (str).</p>
46
def to_roman_numeral(num): lookup = [ (1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'), (100, 'C'), (90, 'XC'), (50, 'L'), (40, 'XL'), (10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I'), ] res = '' for (n, roman) in lookup: (d, num) = divmod(num, n) res += roman * d return res to_roman_numeral(3) >>> 'III' to_roman_numeral(11) >>> 'XI' to_roman_numeral(1998) >>> 'MCMXCVIII'<p>Сначала создаётся список кортежей вида (число, его римская запись). Далее цикл бежит по нему и с помощью функции divmod() производит целочисленное деление с остатком, меняя входящее число на остаток. Соответствующие результаты деления умножаются на строку римской записи и присоединяются к итоговой строке res.</p>
46
def to_roman_numeral(num): lookup = [ (1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'), (100, 'C'), (90, 'XC'), (50, 'L'), (40, 'XL'), (10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I'), ] res = '' for (n, roman) in lookup: (d, num) = divmod(num, n) res += roman * d return res to_roman_numeral(3) >>> 'III' to_roman_numeral(11) >>> 'XI' to_roman_numeral(1998) >>> 'MCMXCVIII'<p>Сначала создаётся список кортежей вида (число, его римская запись). Далее цикл бежит по нему и с помощью функции divmod() производит целочисленное деление с остатком, меняя входящее число на остаток. Соответствующие результаты деления умножаются на строку римской записи и присоединяются к итоговой строке res.</p>
47
<p>Составление и изучение таких микропрограмм помогает лучше понять типы данных в Python, узнать о свойствах и параметрах функций. На сайте<a>30 seconds of code</a>есть ещё больше коротких программ как для Python, так и для других языков программирования.</p>
47
<p>Составление и изучение таких микропрограмм помогает лучше понять типы данных в Python, узнать о свойствах и параметрах функций. На сайте<a>30 seconds of code</a>есть ещё больше коротких программ как для Python, так и для других языков программирования.</p>
48
<p>Источником вдохновения для названий этих скриптов послужили, конечно, книги Джоан Роулинг, а полный справочник по магическим заклинаниям мира Гарри Поттера можно посмотреть<a>здесь</a>.</p>
48
<p>Источником вдохновения для названий этих скриптов послужили, конечно, книги Джоан Роулинг, а полный справочник по магическим заклинаниям мира Гарри Поттера можно посмотреть<a>здесь</a>.</p>
49
<p>На курсах "<a>Профессия Python-разработчик</a>" вы узнаете, насколько полезными могут быть такие небольшие программы, сниппеты и скрипты. Вы научитесь не только колдовать красиво решать задачи с их помощью, но и воплощать гораздо более сложные проекты. Приходите!</p>
49
<p>На курсах "<a>Профессия Python-разработчик</a>" вы узнаете, насколько полезными могут быть такие небольшие программы, сниппеты и скрипты. Вы научитесь не только колдовать красиво решать задачи с их помощью, но и воплощать гораздо более сложные проекты. Приходите!</p>
50
<p>Python для всех</p>
50
<p>Python для всех</p>
51
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
51
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
52
<p><a>Пройти бесплатно</a></p>
52
<p><a>Пройти бесплатно</a></p>
53
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>
53
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>