Добавить в корзинуПозвонить
Найти в Дзене
Интернет сегодня

python: Самые полезные, но малоизвестные конструкции

Язык программирования python многогранен и удивителен своими простыми и красивыми решениями, которые позволяют сильно сократить количество кода, в угоду простоте и компактности. Сегодня мы поговорим о нескольких очень удобных и полезных средствах языка, которым не учат в курсах и гайдах по этому ЯПу. 1. Конструкция for-else Представим простую задачу - вывести на экран все числа из списка, до числа, являющегося четным, если в списке чётных чисел нет, в конце вывести на экран "Чётных чисел нет". Без конструкции for-else эту задачу можно решить так: numbers = [1, 3, 9, 13, 19, 16, 13, 23, 90, 31]
have_even = False
for i in numbers:
if i % 2:
print(i)
else:
have_even = True
break
if not have_even:
print("Чётных чисел нет") Output: 1
3
9
13
19 Для того, чтобы после цикла понять, что чётных чисел нет и мы вышли из цикла с помощью break, приходится создавать флаг have_even. Вот как выглядит та же программа, с конструкцией for-else: numbers = [1, 3, 9, 13, 1
Оглавление

Язык программирования python многогранен и удивителен своими простыми и красивыми решениями, которые позволяют сильно сократить количество кода, в угоду простоте и компактности. Сегодня мы поговорим о нескольких очень удобных и полезных средствах языка, которым не учат в курсах и гайдах по этому ЯПу.

1. Конструкция for-else

Представим простую задачу - вывести на экран все числа из списка, до числа, являющегося четным, если в списке чётных чисел нет, в конце вывести на экран "Чётных чисел нет". Без конструкции for-else эту задачу можно решить так:

numbers = [1, 3, 9, 13, 19, 16, 13, 23, 90, 31]
have_even = False
for i in numbers:
if i % 2:
print(i)
else:
have_even = True
break
if not have_even:
print("Чётных чисел нет")

Output:

1
3
9
13
19

Для того, чтобы после цикла понять, что чётных чисел нет и мы вышли из цикла с помощью break, приходится создавать флаг have_even. Вот как выглядит та же программа, с конструкцией for-else:

numbers = [1, 3, 9, 13, 19, 16, 13, 23, 90, 31]

for i in numbers:
if i % 2:
print(i)
else:
break
else:
print("Чётных чисел нет")

Выглядит проще, правда? Здесь блок else срабатывает когда из цикла мы выходим не с помощью break, а только когда цикл закончится сам. Точно так же работает и конструкция while-else, блок else сработает если выйти из цикла while не с помощью break:

i = 2

while i <= 100:
if 12439283 % i == 0:
print(f"Число {i} является делителем числа 12439283")
break
i += 1
else:
print("Среди первых ста чисел нет делителей числа 12439283")

Output:

Среди первых ста чисел нет делителей числа 12439283

2. Разделение строки на символы

Пусть у нас есть строка, и в этой строке нужно поменять элемент под номером 4 и элемент под номером 10 местами. Но просто так поменять элементы местами не получится, ведь str - неизменяемый тип данных, придётся использовать срезы. Можно сделать это так:

string = "Hello world!"

string = string[:4] + string[10] + string[5:10] + string[4] + string[11:]
print(string)

Output:

Helld worlo!

Вот как это можно сделать, если использовать разделение строки на символы:

string = "Hello world!"

string = list(string) # Теперь string == ['H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!']
string[4], string[10] = string[10], string[4] # Делаем нужные нам операции
string = ''.join(string) # Собираем список обратно в строку
print(string)

Да, кода мы написали немного больше, но он гораздо понятнее и проще, а также его гораздо легче изменить и дополнить. Работает это так: list(string) преобразовывает строку в список её символов, с которыми уже можно производить операции т.к. список - изменяемый тип данных, а после всех изменений, с помощью метода join, мы просто собираем этот список обратно в строку.

3. Модуль pprint

Один из самых простых и полезных встроенных модулей python, благодаря pprint (или pretty print) можно выводить огромные матрицы, вложенные списки, или словари не в одну строку, а в несколько, чтобы вывод был красивым и удобным. Например:

from pprint import pprint
from random import randrange


matrix = [[randrange(10) for _ in range(10)] for _ in range(10)]
pprint(matrix)

Output:

[[4, 0, 8, 7, 7, 1, 1, 9, 9, 9],
[9, 0, 3, 9, 5, 2, 8, 1, 0, 0],
[5, 3, 8, 5, 4, 1, 6, 2, 6, 4],
[3, 9, 2, 5, 3, 1, 4, 7, 0, 1],
[9, 0, 7, 4, 3, 0, 1, 3, 8, 2],
[6, 8, 5, 2, 3, 3, 7, 5, 6, 6],
[3, 1, 0, 5, 9, 1, 0, 0, 2, 1],
[4, 6, 3, 1, 6, 3, 8, 3, 3, 5],
[5, 0, 3, 2, 1, 6, 4, 0, 8, 6],
[1, 8, 0, 9, 9, 1, 2, 9, 6, 5]]

Если вместо pprint написать просто print, то выведется что-то такое:

[[9, 9, 5, 8, 8, 8, 8, 9, 1, 5], [6, 1, 3, 5, 1, 9, 5, 9, 8, 5], [3, 5, 7, 9, 2, 8, 6, 7, 2, 2], [1, 7, 5, 4, 6, 3, 6, 5, 9, 7], [8, 9, 2, 1, 8, 1, 2, 5, 1, 5], [8, 3, 7, 3, 7, 4, 4, 8, 5, 1], [7, 7, 9, 9, 7, 4, 1, 9, 2, 3], [6, 4, 6, 1, 0, 1, 5, 5, 5, 5], [8, 8, 9, 6, 8, 3, 2, 6, 6, 3], [2, 3, 3, 4, 5, 2, 4, 1, 4, 2]]

Бесформенное и безобразное чудо, в котором разобраться почти невозможно. В общем pprint - полезная штука, пользуйтесь!

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