Python

Python — язык программирования без лишнего синтаксиса. Читаемость и простота дизайна — две основные причины его огромной популярности.

Как говорится в дзене Python:

Красивое лучше, чем уродливое.
Явное лучше, чем неявное.

Вот почему стоит помнить некоторые распространенные приемы Python, которые помогают улучшить дизайн кода. Они избавят вас от необходимости просматривать Stack Overflow каждый раз, когда вам что-то нужно. 

Эти приемы пригодятся в вашей ежедневной практике. 

1. Переворачивание строки 

Фрагмент ниже переворачивает строку, используя операцию среза. 

# Переворачивает строку, используя срез 

my_string = "ABCDE"
reversed_string = my_string[::-1]

print(reversed_string)

# Вывод
# EDCBA

2. Заглавные буквы 

Следующий фрагмент используется для преобразования строки в регистр с заглавными буквами с применением метода title() класса string.

my_string = "my name is chaitanya baweja"

# использование функции title()
new_string = my_string.title()

print(new_string)

# вывод
# My Name Is Chaitanya Baweja

3. Поиск уникальных элементов в строке 

Этот фрагмент можно использовать для поиска уникальных элементов в строке с помощью свойства, что все элементы в наборе уникальны. 

my_string = "aavvccccddddeee"

# преобразование строки в набор
temp_set = set(my_string)

# сшивание набора в строку с помощью join
new_string = ''.join(temp_set)

print(new_string)

4. Вывод строки или списка n раз

Можно использовать умножение (*) со строками или списками; умножать их можно любое количество раз. 

n = 3 # число повторений

my_string = "abcd"
my_list = [1,2,3]

print(my_string*n)
# abcdabcdabcd

print(my_list*n)
# [1,2,3,1,2,3,1,2,3]

Интересным вариантом может быть определение списка с постоянным значением, скажем, ноль. 

n = 4
my_list = [0]*n # n обозначает длину списка 
# [0, 0, 0, 0]

5. Генератор списков

Генератор списков предоставляет элегантный способ создания списков на базе других списков. 

Следующий фрагмент создает новый список, умножая каждый элемент предыдущего списка на два. 

# Умножение каждого элемента списка на 2

original_list = [1,2,3,4]

new_list = [2*x for x in original_list]

print(new_list)
# [2,4,6,8]

6. Обмен значениями между двумя переменными 

Python упрощает обмен значениями между двумя переменными без использования другой переменной. 

a = 1
b = 2

a, b = b, a

print(a) # 2
print(b) # 1

7. Разбиение строки на список подстрок 

Мы можем разбить строку на список подстрок, используя метод split() класса string. В качестве аргумента также можно передать разделитель, которым вы разбиваете строку. 

string_1 = "My name is Chaitanya Baweja"
string_2 = "sample/ string 2"

# разделитель по умолчанию ' '
print(string_1.split())
# ['My', 'name', 'is', 'Chaitanya', 'Baweja']

# заданный разделитель '/'
print(string_2.split('/'))
# ['sample', ' string 2']

8. Объединение списка строк в одну строку 

Метод join() объединяет список строк, заданный как аргумент, в одну строку. В нашем случае мы объединили их, используя в качестве разделителя запятую. 

list_of_strings = ['My', 'name', 'is', 'Chaitanya', 'Baweja']

# Использование join с разделителем ","
print(','.join(list_of_strings))

# Вывод
# My,name,is,Chaitanya,Baweja

9. Проверка строки на палиндром

Мы уже рассмотрели, как перевернуть строку. Таким образом палиндромы становятся простейшей программой в Python.

my_string = "abcba"

if my_string == my_string[::-1]:
    print("palindrome")
else:
    print("not palindrome")

# Вывод
# palindrome

10. Подсчет частотности элементов в списке

Мой любимый способ посчитать частотность элемента в списке — это использование класса Counter.

Счетчик Python отслеживает частотность каждого элемента в контейнере. Counter() возвращает словарь с элементами в качестве ключей и частотностью в качестве значений. 

Мы также используем функцию most_common() , чтобы получить most_frequent element в списке.

# находим частотность каждого элемента в списке 
from collections import Counter

my_list = ['a','a','b','b','b','c','d','d','d','d','d']
count = Counter(my_list) # определяем объект для расчета

print(count) # всех элементов
# Counter({'d': 5, 'b': 3, 'a': 2, 'c': 1})

print(count['b']) # конкретного элемента
# 3

print(count.most_common(1)) # элемента с наибольшей частотностью 
# [('d', 5)]

11. Анаграммы

Интересное применение класса Counter — это поиск анаграмм. Анаграмма — это слово или фраза, сформированные перестановкой букв другого слова или фразы. 

Если объекты Counter двух строк эквивалентны, значит, они являются анаграммами. 

from collections import Counter

str_1, str_2, str_3 = "acbde", "abced", "abcda"
cnt_1, cnt_2, cnt_3  = Counter(str_1), Counter(str_2), Counter(str_3)

if cnt_1 == cnt_2:
    print('1 and 2 anagram')
if cnt_1 == cnt_3:
    print('1 and 3 anagram')

12. Блок try-except-else 

Обработку ошибок в Python легко выполнить, используя блок try/except. Можно добавить к блоку состояние else — оно запускается, когда в блоке try нет исключений. 

Если вам нужно запустить что-то независимо от исключений, используйте finally.

a, b = 1,0

try:
    print(a/b)
    # исключение появляется, когда b равно 0
except ZeroDivisionError:
    print("division by zero")
else:
    print("no exceptions raised")
finally:
    print("Run this always") 

13. Функция enumerate для получения пар индекс-значение

Следующий скрипт использует функцию enumerate для перебора значений в списке вместе с их индексами.

my_list = ['a', 'b', 'c', 'd', 'e']

for index, value in enumerate(my_list):
    print('{0}: {1}'.format(index, value))

# 0: a
# 1: b
# 2: c
# 3: d
# 4: e

14. Проверка использования памяти объектом

Следующий скрипт используется для проверки использования памяти объектом. 

import sys

num = 21

print(sys.getsizeof(num))

# В Python 2, 24
# В Python 3, 28

15. Объединение двух словарей 

В Python 2 для соединения двух словарей мы использовали метод update(). В Python 3.5 процесс еще проще. 

В скрипте ниже объединены два словаря. В случае пересечения используются значения из второго словаря.

dict_1 = {'apple': 9, 'banana': 6}
dict_2 = {'banana': 4, 'orange': 8}

combined_dict = {**dict_1, **dict_2}

print(combined_dict)
# Вывод
# {'apple': 9, 'banana': 4, 'orange': 8}

16. Время, затраченное на выполнение части кода 

Следующий фрагмент использует библиотеку time для расчета времени, затраченного на исполнение части кода. 

import time

start_time = time.time()
# начало проверяемого кода 
a, b = 1,2
c = a+ b
# конец проверяемого кода
end_time = time.time()
time_taken_in_micro = (end_time- start_time)*(10**6)

print(" Time taken in micro_seconds: {0} ms").format(time_taken_in_micro)

17. Сглаживание списка списков

Иногда вы не уверены в глубине вложенности списка, вам просто нужно отобразить все элементы в одном списке. 

Вот как можно это сделать:

from iteration_utilities import deepflatten

# если у вас есть только один nested_list, используйте этот фрагмент 
def flatten(l):
  return [item for sublist in l for item in sublist]

l = [[1,2,3],[3]]
print(flatten(l))
# [1, 2, 3, 3]

# если вы не знаете глубину вложения списка 
l = [[1,2,3],[4,[5],[6,7]],[8,[9,[10]]]]

print(list(deepflatten(l, depth=3)))
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

18. Выборка из списка 

Следующий фрагмент генерирует n случайных выборок из указанного списка, используя библиотеку random.

import random

my_list = ['a', 'b', 'c', 'd', 'e']
num_samples = 2

samples = random.sample(my_list,num_samples)
print(samples)
# [ 'a', 'e'] здесь будет 2 случайных значения 

Мне порекомендовали библиотеку secrets для генерации случайных выборок для криптографии. Следующий фрагмент работает только на Python 3.

import secrets # импортирует защищенный модуль
secure_random = secrets.SystemRandom() # создает защищенный 
# случайный объект 

my_list = ['a','b','c','d','e']
num_samples = 2

samples = secure_random.sample(my_list, num_samples)

print(samples)
# [ 'e', 'd'] здесь будут 2 случайных значения 

19. Список цифр

Следующий фрагмент преобразует целое число в список цифр. 

num = 123456

# использование map
list_of_digits = list(map(int, str(num)))

print(list_of_digits)
# [1, 2, 3, 4, 5, 6]

# использование list comprehension
list_of_digits = [int(x) for x in str(num)]

print(list_of_digits)
# [1, 2, 3, 4, 5, 6]

20. Проверка уникальности

Следующая функция проверит все элементы в списке на уникальность. 

def unique(l):
    if len(l)==len(set(l)):
        print("All elements are unique")
    else:
        print("List has duplicates")

unique([1,2,3,4])
# Все элементы уникальны

unique([1,1,2,3])
# Список содержит дубликаты 

Читайте также:


Перевод статьи Chaitanya Baweja: 20 Python Snippets You Should Learn Today