6 секретов Python, которым никто (кроме нас) вас не научит

На сегодняшний день 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)

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Scroll to Top