Пишем 15 интересных скриптов на Python. Практика на Python.
Веб-разработка и научные вычисления, роботы и Data Science — Python повсюду. На нём пишут и масштабные проекты, и короткие программы (скрипты, или сниппеты), полезные в повседневных рабочих и учебных задачах.
Собрали для вас коллекцию таких небольших «заклинаний». Основной принцип: минимум строк кода, в котором можно разобраться максимум за полминуты. Сову из Хогвартса мы не гарантируем, но удивить однокашников, коллег и интервьюеров, уверены, у вас получится. Вперёд!
награммус Ревелио: определение строк-анаграмм
Скрипт проверяет, являются ли две строки анаграммами друг друга. Иными словами, не получена ли одна строка перестановкой символов другой строки.
from collections import Counter def anagram(first, second): return Counter(first) == Counter(second) anagram(«пират», «тапир») >>> True
Используется Counter из библиотеки collections — это разновидность словаря, используемая для подсчёта элементов в итерируемых объектах: списках, кортежах, словарях, строках.
Вычисляем по IP с помощью Python | Как определить местоположение по IP
Мемориа Байтифай: размер объекта в байтах
Этот скрипт используется для измерения количества памяти, потребляемой любым объектом в Python: переменной, функцией, классом
import sys variable = 30 print(sys.getsizeof(variable)) 24
Обратите внимание, что учитывается только та память, которую занимает сам объект, а не те объекты, на которые он, возможно, ссылается. Размер памяти возвращается в байтах.
Лексиа Байтифай: длина строки в байтах
Метод для определения длины строки в байтах. Это не то же самое, что размер объекта из скрипта выше.
def byte_size(string): return(len(string.encode(‘utf-8’))) byte_size(‘Я люблю Python!’) >>> 11 print(sys.getsizeof(‘Я люблю Python!’)) >>> 104 byte_size(») >>> 4
всегда больше байтовой длины строки, поскольку объект-строка содержит и саму строку, и дополнительную информацию о ней — например, ссылки на методы строк.
Албум Диффиндо: нарезка списка
Этот код нарезает список на списки меньшего размера, которые собраны снова в список. Размер надо задать заранее .
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]]
Как видим, последний список получился короче: 4 элемента вместо 7. Проверьте, что будет, если размер нарезаемых списков задать больше, чем составляет длина начального списка.
В статье про списки вы узнаете чуть больше об этом полезном типе данных.
Албум Прессио: сжатие списка
Этот скрипт удаляет «ложные» значения (False, None, 0 и пустую строку ‘ ‘) из списка. Используется встроенная функция filter(): c параметром None на первом месте она удалит из списка lst все значения, которые не вернут True по умолчанию.
Как удивить девушку при помощи Python #shorts
def compact(lst): return list(filter(None, lst)) compact([0, 1, False, None, 2, », 3, ‘a’, ‘s’, 34]) >>> [1, 2, 3, ‘a’, ‘s’, 34]
Проверить вручную какое-либо значение на True/False можно с помощью функции bool(): bool(0) вернёт False, но bool(‘0’) уже будет True, так как это непустая строка.
Примеры использования функции filter () можно найти здесь.
Матрикус Транспозио: транспонирование матрицы
В простейшем случае двумерная матрица может быть задана списком из нескольких списков одинаковой длины, которые представляют собой строки матрицы. Если вам требуется «повернуть на 90 градусов» такую матрицу или превратить строки в столбцы (транспонировать, как говорят математики), то вот короткий код:
array = [[‘a’, ‘b’], [‘c’, ‘d’], [‘e’, ‘f’]] transposed = list(zip(*array)) print(transposed) >>> [(‘a’, ‘c’, ‘e’), (‘b’, ‘d’, ‘f’)]
Обратите внимание, что в итоговом списке элементами (то есть строками новой матрицы) будут кортежи — так работает используемая здесь функция zip ().
Албум Планум: сделать список плоским
Ох уж эти списки, состоящие из списков. Как бы их сделать попроще, выстроить в один ряд? Для этого тоже есть решение.
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]
В третьей строке код проверяет, не является ли элемент списком. Если да, то использует метод extend() для расширения этим элементом итогового списка, если нет — то присоединяет его как одиночный элемент методом append().
Также в этой строке функция вызывает сама себя и, в случае списков, состоящих из списков, «проваливается» в них до тех пор, пока не доберётся до элементов, не являющихся списками. Это называется рекурсией.
Дуплицио Ревелио: проверка на дубликаты
Этот простой скрипт проверяет, содержатся ли в списке повторяющиеся значения (дубликаты). Используется свойство множеств set, которые могут содержать только уникальные элементы. def has_duplicates(lst):
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
Вместо списков могут быть и кортежи, и словари. В последнем случае проверка будет выполняться только среди ключей словаря.
Вокабулари Юнифай: объединить два словаря
Для того чтобы объединить два словаря, есть как минимум два способа: прямой и современный.
# прямой — работает во всех версиях 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)) >>> # современный — работает в версиях 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)) >>>
Обратите внимание на то, что значения итогового словаря будут зависеть от порядка исходных словарей в функциях: если переставить местами словари a и b, значение ключа ‘y’ изменится на 2.
Фрекуэнтиа: самый частый элемент
Этот короткий скрипт вернёт элемент, чаще всего встречающийся в списке.
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
Используются продвинутые параметры встроенной функции max():
- первым аргументом она получает множество из элементов списка (помним, что в множестве все элементы уникальны);
- затем применяет к каждому из них функцию count, подсчитывающую, сколько раз элемент встречается в списке;
- после этого возвращает элемент множества, который имеет больше всего «попаданий».
В качестве аргумента можно использовать списки, кортежи и строки.
Палиндромус Ревелио: проверка строки на палиндром
Простой вариант этого кода проверяет, является ли слово без пробелов и знаков препинания, написанное в одном регистре, палиндромом.
def palindrome(a): return a == a[::-1] palindrome(‘казак’) >>> True
Более сложный вариант, который сможет проверить строку «А роза упала на лапу Азора», предлагаем написать самостоятельно. Общая идея: свести сложную строку к простой, хоть и длинной ‘арозаупаланалапуазора’. Вам пригодятся функции строк .lower(), .join(), а также, возможно, преобразование строки в список.
Албум Миксио: перемешать элементы списка
Этот сниппет поможет вам изменить порядок элементов списка на случайный. Обратите внимание на то, что функция shuffle из библиотеки random меняет исходный список .
from random import shuffle foo = [1, 2, 3, 4] shuffle(foo) print(foo) >>> [3, 1, 2, 4]
Подробнее про библиотеку random и случайные числа в Python читайте в нашей статье.
Албум Датум: список дат из диапазона
Этот код получает две даты (начальную и конечную) и создаёт список из дат между ними, включая начальную и исключая последнюю.
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)]
Для получения дней между начальной и конечной датой используется datetime.timedelta.days.
Нумерум Нумерио: число в список цифр
Превращает целое число в список его цифр.
def digitize(n): return list(map(int, str(n))) digitize(123) >>> [1, 2, 3]
Функция map() принимает желаемый тип выходных данных (в нашем случае это int, целые числа) и итерируемый объект (строку, список или кортеж), элементы которого можно превратить в элементы этого типа. После этого другая функция list() преобразует результат в список.
Нумерум Романио: преобразовать число в римскую запись
Преобразует число в обычной десятичной («арабской») записи в форму римского числа. Работает со значениями от 1 до 3999 включительно, возвращает строку (str).
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’
Сначала создаётся список кортежей вида (число, его римская запись). Далее цикл бежит по нему и с помощью функции divmod() производит целочисленное деление с остатком, меняя входящее число на остаток. Соответствующие результаты деления умножаются на строку римской записи и присоединяются к итоговой строке res.
Акцио Пайтон: Python в каждый дом!
Составление и изучение таких микропрограмм помогает лучше понять типы данных в Python, узнать о свойствах и параметрах функций. На сайте 30 seconds of code есть ещё больше коротких программ как для Python, так и для других языков программирования.
Источником вдохновения для названий этих скриптов послужили, конечно, книги Джоан Роулинг, а полный справочник по магическим заклинаниям мира Гарри Поттера можно посмотреть здесь.
Источник: uproger.com
Шпаргалки по Python — хитрости которые вы не используете!
Многие люди начинают переезжать с версии 2 на 3 из-за Python EOL (Поддержка Python 2.7 прекратиться с 2020 года). К сожалению, часто Python 3 выглядит как Python 2 со скобками. В статье я покажу несколько примеров существующих функций, которыми вы можете пользоваться только в Python 3, с надеждой на то, что это поможет решать ваши текущие и будущие задачи.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат Андрей»
action = «покупка»
log_message = ‘Пользователь <> зашел на сайт и выполнил действие: <>’ . format (
print ( log_message )
# Пользователь Андрей зашел на сайт и выполнил действие: покупка
Наряду с format , Python 3 предоставляет гибкий способ выполнения интерполяции строк через f-строки. Тот же код, что и показанный выше, с использованием f-strings выглядит так:
user = «Юрий»
action = «продажа»
log_message = f ‘Пользователь зашел на сайт и выполнил действие: ‘
print ( log_message )
# Пользователь Юрий зашел на сайт и выполнил действие: продажа
Pathlib (Python 3.4+)
F-строки — это отличное решение, но некоторые строки, такие как пути файлов, имеют свои собственные библиотеки, которые заметно упрощают работу. Python 3 предоставляет pathlib в качестве удобной абстракции для работы с путями файлов.
from pathlib import Path
root = Path ( ‘post_sub_folder’ )
print ( root )
# post_sub_folder
path = root / ‘happy_user’
# Делаем путь абсолютным
print ( path . resolve ( ) )
# /home/weenkus/post_sub_folder/happy_user
Подсказки типов | Ожидание типа | Type hinting (Python 3.5+)
Спор о том, какое типизирование python лучше — статическое или динамическое — не умолкают и по сей день и у каждого есть свое мнение на этот счет. Это личное дело читателя — когда ему нужно вписывать типы, но мне кажется что вы как минимум должны знать о том, что Python 3 поддерживает подсказки типов.
def sentence_has_animal ( sentence : str ) -> bool :
return «animal» in sentence
print ( sentence_has_animal ( «У Ивана есть своя собственная Bitcoin ферма» ) ) # True
Перечисления enum (Python 3.4+)
Python 3 поддерживает простой способ написания перечислений через класс Enum. Этот класс можно назвать удобным способом инкапсуляции списка констант, чтобы они не были разбросаны по всему коду без структуры.
from enum import Enum , auto
class Monster ( Enum ) :
ZOMBIE = auto ( )
WARRIOR = auto ( )
BEAR = auto ( )
print ( Monster . ZOMBIE ) # Monster.ZOMBIE
Перечисление — это набор символических имен (членов), связанных уникальным, постоянным значением. С перечислением, члены можно сравнить по идентичности, а само перечисление может повторяться.
for monster in Monster :
print ( monster )
# Monster.ZOMBIE
# Monster.WARRIOR
# Monster.BEAR
Встроенный LRU кэш (Python 3.2+)
Кэш содержится практически в любом горизонтальном отрезке программного обеспечения, которым мы пользуемся сегодня. Python 3 делает их использование очень простым, предоставляя кэш LRU (Least Recently Used) в качестве декоратора под названием lru_cache .
Внизу показана простая функция Фибоначчи, которая, как мы знаем, выиграет от кэширования, так как выполняет одну и ту же работу несколько раз через рекурсию.
import time
def fib ( number : int ) -> int :
if number == 0 : return 0
if number == 1 : return 1
return fib ( number — 1 ) + fib ( number — 2 )
start = time . time ( )
print ( f ‘Duration: s’ )
# Длительность: 30.684099674224854s
Теперь мы можем использовать lru_cache для оптимизации (эта техника оптимизации называется меморизация). Время выполнения варьирует от секунд до наносекунд.
from functools import lru _ cache
def fib_memoization ( number : int ) -> int :
if number == 0 : return 0
if number == 1 : return 1
return fib_memoization ( number — 1 ) + fib_memoization ( number — 2 )
start = time . time ( )
fib_memoization ( 40 )
print ( f ‘Duration: s’ )
# Длительность: 6.866455078125e-05s
Повторяемая расширенная распаковка (Python 3.0+)
Здесь код будет говорить сам за себя (документация):
head , * body , tail = range ( 5 )
print ( head , body , tail )
py , filename , * cmds = «python3.7 script.py -n 5 -l 15» . split ( )
print ( filename )
print ( cmds )
first , _ , third , * _ = range ( 10 )
print ( first , third )
Классы данных (Python 3.7+)
Python 3 представляет классы данных, которые не имеют большого количества ограничений и могут быть использованы для сокращения стандартного кода, так как декоратор автоматически генерирует специальные методы, такие как __init__() и __repr()__ . Из официального заявления, они описываются как “изменяемые названные кортежи со значениями по умолчанию”.
class Armor :
def __init__ ( self , armor : float , description : str , level : int = 1 ) :
self . armor = armor
self . level = level
self . description = description
def power ( self ) -> float :
return self . armor * self . level
armor = Armor ( 5.2 , «Common armor.» , 2 )
armor . power ( )
print ( armor )
Та же реализация класса Armor при помощи классов данных.
from dataclasses import dataclass
class Armor :
armor : float
description : str
level : int = 1
def power ( self ) -> float :
return self . armor * self . level
armor = Armor ( 5.2 , «Common armor.» , 2 )
armor . power ( )
print ( armor )
# Armor(armor=5.2, description=’Common armor.’, level=2)
Пространства имен (Python 3.3+)
Один из способов структуризации кода Python заключается в пакетах (папки с файлом __init__.py ). Пример ниже предоставлен официальной документацией Python.
sound / Пакет верхнего уровня
_ _ init _ _ . py Инициализировать звукового пакета
formats / Подпакет для преобразования формата файла
_ _ init _ _ . py
wavread . py
wavwrite . py
aiffread . py
aiffwrite . py
auread . py
auwrite . py
effects / Подпакет для звуковых эффектов
_ _ init _ _ . py
surround . py
reverse . py
filters / Подпакет для фильтров
_ _ init _ _ . py
equalizer . py
vocoder . py
karaoke . py
В Python 2, каждая папка выше должна иметь файл __init__.py , который делает папку пакетом Python. В Python 3, с появлением неявных пакетов пространств имен, эти файлы больше не нужны.
sound / Пакет верхнего уровня
__init__ . py Инициализировать звукового пакета
formats / Подпакет для преобразования формата файла
wavread . py
wavwrite . py
aiffread . py
aiffwrite . py
auread . py
auwrite . py
effects / Подпакет для звуковых эффектов
surround . py
reverse . py
filters / Подпакет для фильтров
equalizer . py
vocoder . py
karaoke . py
Впрочем, как многие пользователи заметили, это может быть не так просто, как я указал в этом разделе. Согласно спецификации 420 в PEP — файл __init__.py все еще может понадобиться для обычных пакетов, удаление его из структуры папки превратит его в пакет пространства имен, который включает в себя дополнительные ограничения, официальная документация нативных пакетов пространств имен показывают хорошие примеры тому, а также в них озвучиваются названия всех ограничений.
Подведем итоги
Как и практически любой другой список в интернете, этот нельзя назвать завершенным. Надеюсь в этой статье вы нашли хотя бы одну функцию Python 3, которой вы ранее не пользовались, и это поможет вам писать более чистый и интуитивный код.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»
Источник: python-scripts.com