Паттерны программирования

Перейдите к следующему слайду, нажав кнопку Вправо

Программисты пишут разный код

Но состоит он из похожих строчек

Подготовлено онлайн-курсом

https://dvmn.org

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

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

Навигация:
продолжение примера -- стрелка вниз
другой пример -- стрелка вправо

Конструкция if

a = int(input('Введите число: '))
if a < 0:
   print("Negative")
elif a == 0:
   print("Zero")
else:
   print("Positive")

Примеры использования по стрелке вниз

Необязательная часть elseif("иначе если")

Необязательная часть else("иначе")

if X:
    A = Y
else:
    A = Z
# Тернарное выражение
A = Y if X else Z

Это выражение(4 строчки)

можно записать через выражение if/else(1 строчка)

Конструкция if

Вместо этого:

...

def check_link(url):
    ...
    return result

check_link_result = check_link(args.link)  
  
if check_link_result == True:
  print('Ссылка рабочая!')
else check_link_result == False:
  print('Ссылка не рабочая!')
...

def check_link(url):
    ...
    return result

check_link_result = check_link(args.link)  
  
if check_link_result:
  print('Ссылка рабочая!')
else:
  print('Ссылка не рабочая!')

Лучше вот так:

Другой пример по стрелке вниз

Конструкция if с циклом for

Вместо этого:

...
list = ['Я', 'люблю', 'программирование']

if len(list) == 0:
  print('Список пуст')
else:
   for letter in list:
      print(letter, end=' ')
# Я люблю программирование'      
  
  
...
list = ['Я', 'люблю', 'программирование']

if list:
  print('Список пуст')
else:
   for letter in list:
      print(letter, end=' ')
# Я люблю программирование'

Лучше вот так:

Поиск в словаре

who_took_books = {
  "Игорь Васильев": "Гарри Поттер",
  "Иван Фролов": "Война и мир",
  "Маргарита Киркина": "Мастер и Маргарита",
}

book_to_find = "Война и мир"

for name, book in who_took_books.items():
  if book == book_to_find:
    print(name)

Кто-то взял книгу "Война и мир". У кого она?

Продолжение по стрелке вниз

Другой пример -->

Поиск в словаре

who_took_books = {
  "Игорь Васильев": "Гарри Поттер",
  "Иван Фролов": "Война и мир",
  "Маргарита Киркина": "Мастер и Маргарита",
}

book_to_find = "Война и мир"

for name, book in who_took_books.items():
  if book == book_to_find:
    break

print(name)

А как "вылезти" из цикла?

Продолжение по стрелке вниз

Цикл перебирает значения name. Когда сработает break - в переменной name останется то значение, которое было перед срабатыванием break

Поиск в словаре

who_took_books = {
  "Игорь Васильев": "Гарри Поттер",
  "Иван Фролов": "Война и мир",
  "Маргарита Киркина": "Мастер и Маргарита",
}

book_to_find = "Война и мир"

for name, book in who_took_books.items():
  if book == book_to_find:
    found_name = name
    break
else:
  found_name = None

if found_name:
  print(name)
else:
  print("Книгу никто не брал")

А если книга не найдётся?

Сработает только если не срабатывал break

Другой пример -->

Наполнение списка в цикле

def get_fruit_price(fruit):
  ...
  return price

  
fruits = [
  "Яблоко",
  "Груша",
  "Банан"
]

for fruit in fruits:
  price = get_fruit_price(fruit)
  print(fruit, price)

Есть функция, которая генерирует строки, хочу применить её много раз

Продолжение по стрелке вниз

Другой пример -->

Наполнение списка в цикле

def get_fruit_price(fruit):
  ...
  return price


fruits = [
  "Яблоко",
  "Груша",
  "Банан"
]

for fruit in fruits:
  price = get_fruit_price(fruit)
  print(f"Фрукт {fruit} стоит {price}")

Теперь хочу красивый вывод

Продолжение по стрелке вниз

Это не опечатка, это f-строка

Наполнение списка в цикле

def get_fruit_price(fruit):
  ...
  return price

  
fruits = [
  "Яблоко",
  "Груша",
  "Банан"
]

fruit_prices = {}

for fruit in fruits:
  fruit_prices[fruit] = get_fruit_price(fruit)

Теперь хочу "запомнить" значения в словарь

Продолжение по стрелке вниз

Наполнение списка в цикле

def get_fruit_price(fruit):
  ...
  return price

  
fruits = [
  "Яблоко",
  "Груша",
  "Банан"
]

fruit_prices = []

for fruit in fruits:
  price = get_fruit_price(fruit)
  fruit_prices.append(price)

Хочу не словарь, а список

Другой пример -->

Пользовательский интерфейс

correct_url = False
while not correct_url:
    url = input()
    if url.is_correct():
        correct_url = url
    else:
        print("Не та ссылка!!!")
print("Если вы это читаете, вы ввели верную ссылку")

Хочу требовать от пользователя ссылки, пока не введёт правильную

Продолжение по стрелке вниз

Другой пример -->

Но вообще, так делать плохо. Лучше закрыть программу с сообщением "Не та ссылка", чем вечно требовать от юзера ссылки. А что, если у него нет "правильной ссылки"? Как ему теперь закрыть программу? Это не забота о юзере, это неудобно.

Пользовательский интерфейс

def get_url():
  url = input("Введите ссылку: ")
  if not url.is_correct():
    print("Не та ссылка!!!")
    get_url()

    
correct_url = get_url()
print("Если вы это читаете, вы ввели верную ссылку")

Ни в коем случае не делайте так

Другой пример -->

Python будет вызывать функцию get_url раз за разом, и если пользователь будет достаточно настойчив (очень настойчив), то код упадёт с ошибкой StackOverflow, т.к. у него переполнится стек вызовов.

Проще говоря, у него записано, что get_url вызвал get_url, а его вызвал get_url, а его вызвал get_url... и вот "Насколько глубоко можно вызывать" у Python ограничено.

Создано для онлайн-курса https://dvmn.org