Циклы и условия

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

Программисты пишут разный код, но состоит он из похожих строчек

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

https://dvmn.org

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

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

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

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

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

test_results = {
    'Петя': 2,
    'Маша': 5,
    'Вася': 4,
}

marks = test_results.values()
marks_sum = 0

# Накапливаем сумму, добавляя по одной оценке за раз
for mark in marks:
    marks_sum = marks_sum + mark

average_result = marks_sum / len(test_results)
print('Средний бал:', average_result)

Какой средний бал набрали ученики класса ?

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

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

Сначала вычислится сумма справа от знака присваивания `=`.
Затем перезапишется старая переменная marks_sum

Оценки учеников в виде списка:

[2, 5, 4]

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

test_results = {
    'Петя': 2,
    'Маша': 5,
    'Вася': 4,
}

marks = test_results.values()

marks_sum = sum(marks)
average_result = marks_sum / len(test_results)
print('Средний бал:', average_result)

То же самое, но короче

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

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

Стандартная функция sum считает сумму элементов

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

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(found_name)
else:
    print("Книгу никто не брал")

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

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

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

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

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

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

def find_book(books, book_to_find):
    for name, book in books.items():
        if book == book_to_find:
            return name

found_name = find_book(who_took_books, "Война и мир")

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

То же самое, но с функцией

Возвращает строку или None

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

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

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

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

books = who_took_books.values()
persons = who_took_books.keys()
book_to_person = dict(zip(books, persons))

found_name = book_to_person["Война и мир"]

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

То же самое, но без цикла

Меняем местами ключи и значения в словаре

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

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

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

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

By voron434

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

Ищем и исправляем ошибки в коде Python

  • 363

More from voron434