На сегодняшний день Python наиболее часто используемый язык в мире программирования. (Убедитесь сами в рейтинге TIOBE Index)
Простой синтаксис, большое количество библиотек, возможность быстрого входа для начала работы и обучения — по душе как новичкам, так и опытным разработчикам. С помощью Python они все с удовольствием создают программное обеспечение.
Итак, сегодня мы расскажем вам про 6 уникальных трюков на языке программирования Python, которым не учат на обычных курсах 😃
1 . Выбор случайного элемента из последовательности
Модуль random package из стандартной библиотеки имеет множество весьма полезных функций. Но random.choice(seq)
особенно полезна.
Она позволяет извлекать случайный элемент из индексируемой последовательности, например списков, кортежей или даже строк.
import random as r my_list = [1, 2, 3, "go"] print(r.choice(my_list)) # Random item
Пример
Функция выбора книги. Задача: случайным образом выбрать одну книгу из некоторой совокупности книг. Решение: наша функция возвращает результат выбора в виде строки, и удаляет из списка остальные элементы.
# We import only the function we need from random import choice def book_picker(books): book_choice = choice(books) books.remove(book_choice) return f"You picked {book_choice}" books = ["Harry potter", "Don Quixote", "Learn Python by Daniel Diaz", "Dracula"] print(book_picker(books)) # Random choice print(books) # Remaining books
Внимание, возможные ошибки!
Если вы попытаетесь использовать random.choice(seq)
в неиндексируемой последовательности, dictionaries, sets, numeric types, Python выдаст ошибку.
# With Dictionary import random as r scores = {"Jhon": 4, "Ben": 3, "Diana": 5} print(r.choice(my_scores)) # Key error
Также, если последовательность пуста, интерпретатор Python выдаст ошибку IndexError.
# With an empty sequence import random as r empty_list = [] print(r.choice(empty_list)) # Index error
2. Перебор элементов с *
Предположим, нам нужно создать строку, содержащую элементы массива, разделенные пробелом. Вот, на мой взгляд, самое распространенное решение:
my_list = [1, 2, 3, 5, 7] for i in my_list: print(i, end=" ") # 1 2 3 5 7
Существует и более эффективное решение с использованием префиксного оператора “*”.
my_list = [1, 2, 3, 5, 7] print(*mylist) # 1 2 3 5 7
Как видите, префиксный оператор распаковки в Python всегда устанавливается слева от итерируемого объекта. Вообще операторы *, ** в Python являются загадкой как для начинающих программистов, так и для тех, кто пришёл в Python из других языков.
Следует помнить, что итерация — это любая последовательность, которую мы можем перебирать с помощью цикла for. Проверить, является ли тип данных повторяемым, используйте функцию iter()
. Как видите — легко и просто 🙂
Использование оператора распаковки с переменными
Вероятно, после того, как вы узнали о возможности оператора распаковки, вы захотите использовать его для хранения данных в переменных? Давайте вместе посмотрим, как это сделать.
string = "Let's learn Python" # We want to assign the unpacked result in var1 var1 = [*string] print(var1) # ['L', 'e', 't', "'", 's', ' ', 'l', 'e', 'a', 'r', 'n', ' ', 'P', 'y', 't', 'h', 'o', 'n']
Часть [*iterable]
может показаться запутанной, поэтому более подробно:
Когда мы распаковываем итерируемую python сущность, нужна некоторая структура данных для хранения каждого элемента итерации, поэтому мы создаем список ([])
вне оператора *.
Если попытаться получить тип переменной в результате оператора *, мы получим
another_str = "The * operator" # Using a list outside the unpacking var2 = [*another_str] print(type(var2)) # List # Using a tuple # Tuples ends with a comma var3 = (*another_str,) print(type(var3)) # Tuple
А если попытаться распаковать без внешнего списка или кортежа, Python вернет SyntaxError
Распаковка имеет гораздо больше применений, но это тема для отдельной статьи.
3. Использование set для оптимизации операций
Согласно документации python, класс set(iterable)
создает новый объект с типом set из итерируемой сущности.
Некоторые из вас, возможно, знают, что множество в Python представляет собой неупорядоченную структуру данных (следовательно, элементы множества не индексируемые). Еще одна из его важных характеристик заключается в том, что в множестве не допускаются дублирование элементов.
Пример:
Пример функции, которая удаляет дубликаты и возвращает отсортированный список.
def eliminate_duplicates(lst): """ Returns a sorted list, without duplicates """ new_list = list(set(lst)) new_list.sort() return new_list list1 = [25, 12, 11, 4, 12, 12, 25] print(eliminate_duplicates(list1))
4. Просмотр атрибутов и методов класса, не выходя из редактора
Функция dir()
возвращает отсортированный список строк атрибутов и методов класса. Мы можем использовать данное полезное свойство, для того, чтобы узнать все доступные объекту атрибуты и методы.
-> $ python string = "A string" print(dir(string)) # ['__add__', .....,'upper', 'zfill']
Например, если нужен метод, который преобразует нашу строку в верхний регистр, и нам просто лень открыть документацию, мы просто запускаем функцию dir со строкой в качестве аргумента и ищем правильный метод как в справочнике.
-> $ python string = "A string" print(dir(string))
Пример:
Тот же подход из dir применим и к использованию сторонних пакетов, мы можем получить всю необходимую информацию из класса в том числе, не выходя из терминала.
-> $ python from django.views import View print(dir(View))
5. Операции со срезами
Срез — это не что иное, как способ доступа к определенным частям последовательности. В Python с их помощью можно выполнять и несколько иные трюки.
Реверсивная последовательность либо сортировка в обратном порядке:
# Reversing lists lst = ["Fun", "is", "Programming"] lst = lst[::-1] print(lst) # ['Programming', 'is', 'Fun'] # Reversing strings string = "Dog running on the park" string = string[::-1] print(string) # krap eht no gninnur goD
Пример:
Функция, которая возвращает последовательность до указанного индекса:
def cutoff(seq, index): if not len(seq) > index: return "Sorry the index is bigger than the sequence" return seq[:index] long_string = "This is a long description of a blog post about Python and technology" print(cutoff(long_string, 15)) # This is a long print(cutoff(long_string, 70)) # Sorry the index is bigger than the sequence
6. Вызов отладчика
Функция breakpoint доступна в python 3.6+. Это вызовет сеанс pdb.set_trace()
.
Это невероятно удобный способ вызова дебаггера.
n_odds = 0 for i in range(1, 14, 2): # Check for the value of i in each iteration breakpoint() # Bad condition if i % 2 == 0: n_odds += 1 print(n_odds)