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

В программировании способ объяснить, что вы хотите, чтобы компьютер сделал, как если бы вы объясняли это младенцу, только что начавшему жизнь, заключается в освоении условий и циклов. Функции — это способ использовать один и тот же код без необходимости писать его снова и снова. Тот, кто сможет правильно совместить эти две части, теоретически может написать любую программу и изменить мир! В этой статье я сначала расскажу об условиях и циклах. Следующий пост будет о функциях.

Я думаю, что один из лучших способов держать тему в уме — рассказывать истории. Я постараюсь передать условия и циклы с помощью истории, чтобы визуализировать ее. Например, давайте представим, что мы торговый представитель. Давайте подумаем об образе продавца в американских фильмах. Давайте также вернемся в прошлое, до 2000-х или даже 90-х. То, что мы продаем, зависит от вашего воображения.

Если мы думаем о старых американских фильмах, мы, вероятно, думаем о домах рядом друг с другом и друг напротив друга, то есть в пригородах. Утром проснулись и поехали в пригород. В этом районе 50 домов, и мы будем посещать каждый дом один за другим, пока не продадим хотя бы 10 единиц нашего товара или пока не завершим посещение района (т.е. посетим все 50 домов). В каких-то из 50 домов в это время никого не будет, в каких-то люди даже не захотят нас слушать, в других послушают и откажутся. Мы не знаем, сколько продаж мы сделаем.

Прежде чем сделать нашу историю понятной программой, давайте обрисуем ее в общих чертах, используя логические рассуждения:

1- Посетите 50 домов один за другим

2-Если нас примет хозяин, войдите в дом

3- Если арендодатель убежден, сделайте продажу.

4-Если мы сделали 10 продаж, мы достигли цели, не нужно посещать все дома, выполнить программу.

5-Если мы посетим все 50 домов до того, как совершим 10 продаж, то петля завершится, к сожалению, мы не достигнем нашей цели.

Среди этих логических аргументов первый аргумент является аргументом цикла. Мы видим, что количество циклов равно 50. 2-й, 3-й, 4-й и 5-й аргументы выражают условия. Условие в последних двух аргументах является завершающим условием для нашего цикла.

Минимум за сколько раундов можно завершить описанный выше цикл? Как вы можете догадаться, ответ равен 10. Если ваше предположение неверно, не беспокойтесь слишком сильно. Поскольку мы можем продать 10 товаров, зайдя как минимум в 10 домов (мы предполагаем, что можем совершить максимум 1 продажу в каждом доме), наш цикл может быть завершен как минимум за 10 и не более 50 раундов (поскольку в каждом доме 50 домов). пригороды).

Мы можем выразить приведенную выше логическую структуру в Python с помощью двух разных типов циклов. Первый — это тип цикла, который мы вызываем, а второй — это тип цикла, который мы вызываем. Цикл for имеет начало и конец. Очевидно, что цикл for закончится. В некоторых случаях мы можем прервать цикл раньше, чем следовало бы. Другой, цикл while, завершение нашего цикла зависит от условия. Если это условие не выполняется, цикл продолжается бесконечно. Конечно, поскольку Python налагает ограничение цикла для таких случаев, мы на самом деле не достигаем бесконечности (как мы можем достичь ее в любом случае?), но теоретически программа будет продолжать цикл до тех пор, пока это условие не будет выполнено.

Если бы мы написали эту историю с помощью цикла for, она выглядела бы так:

import random
total_house = 50
max_sell = 10
houses_visited = 0
products_sold = 0
for house in range(total_house):
    houses_visited += 1
    permit = True if random.randint(1, 10) <= 5 else False  # %50 chance that the landlord permits us to enter his/her house
    if permit == True:
        sell = True if random.randint(1, 10) <= 4 else False  # %40 chance for us to make sell.
        if sell == True:
            products_sold += 1
            if products_sold == max_sell:
                print(f"Congrats! You reach the target with only {houses_visited} houses visited.")
                break
        else:
            continue
if products_sold < max_sell:
    print(f"Oops. You only sell {products_sold} products!")

Начиная сверху, я вызвал в свою программу модуль Python с именем random. Эта часть не очень важна, я использовал этот модуль внутри цикла, но он не имеет отношения к теме циклов, так что можете не волноваться. В следующих 4-х строках я создал подходящие для нашей истории переменные и присвоил им начальные значения. Для тех, кто не знает, позвольте мне кратко объяснить;

total_house = 50
max_sell = 10
houses_visited = 0
products_sold = 0

На изображении выше выражения в левой части равенства демонстрируют переменную, а в правой части показано значение, присвоенное этой переменной. Переменной можно присвоить любой из типов данных, которые я описал в предыдущем посте. То есть одной переменной можно присвоить целое число, как указано выше, другой переменной можно присвоить двоичный тип данных (bool), а еще одной переменной можно присвоить словарь. То, что мы называем переменной, так сказать, это то, что может принимать разные значения в разных частях программы. Вы можете понять, зачем нам это нужно, изучив пример выше. Мне не нужно здесь долго объяснять, так что давайте вернемся к нашей теме.

Цикл for начинается со следующей строки, давайте рассмотрим ее подробнее:

for house in range(total_house):

Часть «дом», которая пишется после for, относится к переменной, которая позволяет нам продолжить цикл for. Python понимает необходимую информацию через метод диапазона и его аргументы. Это информация о том, с чего начать, где закончить и о количестве шагов. Эти выражения являются выражениями, разделенными запятыми. В нашем коде объявлена ​​только переменная total_house, но Python слишком умен, чтобы понять, что имеется в виду. Начальная точка по умолчанию — 0, а размер шага по умолчанию — 1. Таким образом, для нашего примера 0 — это начальная точка, 50 — конечная точка, а 1 — количество шагов. Если вы спросите, почему здесь взят начальный ноль, я могу сказать, что это привычка, вызванная индексной нумерацией в Python. Если здесь 50 конечных точек, то может возникнуть вопрос, а не зацикливаемся ли мы всего 51 раз? Ответ — нет, мы зациклимся 50 раз, потому что это Python! Это связано с тем, что учитываются числа до конечной точки. Таким образом, мы, по сути, ходим по кругу от 0 до 50, не беря 50, что равняется кругам от 1 до 50 включительно. Братан, ну что ты нас беспокоишь, можно с начала сказать range(1,51,1). Я делаю это по привычке, вы можете продолжить со вторым вариантом, который кажется более логичным, но уверяю вас, что в Python вы бы предпочли начинать с нуля.

На мой взгляд, одна из лучших особенностей Python заключается в том, что вы можете без особых усилий перенести в программу то, что задумали. Это позволяет мне кодировать очень похоже на логическую структуру, о которой я упоминал выше. Например, давайте вместе интерпретируем цикл for:

for house in range(total_house):
    houses_visited += 1
    permit = True if random.randint(1, 10) <= 5 else False  # %50 chance that the landlord permits us to enter his/her house
    if permit == True:
        sell = True if random.randint(1, 10) <= 4 else False  # %40 chance for us to make sell.
        if sell == True:
            products_sold += 1
            if products_sold == max_sell:
                print(f"Congrats! You reach the target with only {houses_visited} houses visited.")
                break
        else:
            continue

Первая строка: Цикл для каждого дома, так как у нас 50 домов, в общей сложности посетите 50 домов один за другим.

Вторая строка: Увеличить количество домов, которые посетил один

Третья строка: посмотрите, разрешит ли домовладелец нам войти внутрь (на данном этапе нет необходимости переваривать это, на самом деле я здесь присваиваю вероятностный тип переменной типа bool, True или False).

Четвертая строка: если разрешено войти в дом, перейдите к следующему шагу (перейдите к строке 5, если разрешено), в противном случае перейдите к строке 11.

Пятая строка: посмотреть, смогу ли я продать (переменной Sell присваивается вероятностное значение логического типа с той же логикой в ​​​​третьей строке)

Шестая строка: если дано разрешение на продажу, перейти к следующей строке (7-я строка), если нет, перейти к следующему дому.

Седьмая строка: Когда шестая строка Истина, то есть когда мы совершаем продажу, мы увеличиваем количество продаж на единицу, так как доходим до этой строки.

Восьмая строка: если количество продаж равно 10, перейти к следующей строке, если количество продаж не равно 10, перейти к следующему дому.

Девятая строка: Поскольку мы видим эту строку, когда у нас есть 10 продаж, это позволяет нам увидеть, сколько домов мы достигли с помощью распечатки перед завершением программы и сколько домов мы достигли этого количества продаж.

Десятая строка: здесь команда break — это оператор, который мы используем, когда не собираемся завершать цикл for. В нашей истории мы заявили, что если мы сделаем 10 продаж, мы перестанем ходить по домам. Мы заканчиваем наш цикл, так как у нас есть 10 продаж.

Одиннадцатая строка: На самом деле нам не нужно добавлять эту строку, но я добавил ее в информационных целях, потому что условные конструкции используют else с if. Условие if можно использовать и само по себе, как вы заметили, я не использую else в других командах if.

Двенадцатая строка: поскольку в качестве примера я использую структуру Else, я ввел «продолжить», чтобы подчеркнуть ее. Если Python увидит эту команду внутри цикла, он перейдет к следующему выпуску цикла. В нашем примере он переместится в следующий дом.

Наш пример на самом деле включает в себя как циклы, так и условия. Эквивалентом условного оператора в Python является оператор if. Обратите внимание, что отступы каждой строки не равны. В Python условие или цикл заканчивается там, где отступ становится на том же уровне, что и условие или цикл. Итак, Python говорит нам, бро, я не знаю, что за условное выражение у тебя в голове, я не провидец. Это условие для меня, чтобы понять условный оператор, в моей программе вы должны следовать этим правилам. То же самое касается петель. Здесь отступ также определяет область действия этого цикла.

Давайте рассмотрим эту ситуацию, взяв раздел из нашего примера выше:

if permit == True:
        sell = True if random.randint(1, 10) <= 4 else False  # %40 chance for us to make sell.
        if sell == True:
            products_sold += 1
            if products_sold == max_sell:
                print(f"Congrats! You reach the target with only {houses_visited} houses visited.")
                break
        else:
            continue

Если наша переменная с именем Permit имеет значение True, программа продолжает работу сразу после этого условия. Если вы заметили, эта строка продолжается с отступом. В зависимости от используемой вами IDE (программ, упрощающих написание кода), когда вы ставите двоеточие после условия и нажимаете клавишу «Enter» на клавиатуре, отступ автоматически смещается вправо. Если условное выражение имеет значение False, то программа пропускает строки дальше, пока не найдет строку с таким же или меньшим (в зависимости от того, что наступит раньше) уровнем отступа (в нашем примере это строка, которая говорит else:). Отступы находятся на расстоянии 4 клавиш пробела (или 1 клавиши Tab) друг от друга. Программа выдаст ошибку, когда будет больше или меньше.

Добавлю немного об условиях. У нас может быть более одного условия. В этом случае вместо структуры if-else используется структура if-elif-else. elif — это сокращение от else if. В условном цикле может иметь место только одно if и одно else, тогда как количество elif может быть многочисленным.

В заключение этой статьи я включаю альтернативу упомянутому нами примеру, написанную с использованием цикла while. Как вы, возможно, помните, циклы while продолжают цикл до тех пор, пока не будет выполнено определенное условие. Вы можете немного подумать об этой альтернативе и узнать, как она работает. Позвольте мне добавить еще одну вещь, чтобы сделать эту альтернативу более понятной. Если переменная, проверяемая в то время, и если структуры сами по себе имеют логический тип, вам не нужно проверять с помощью «==». Если вы изучите строку, начинающуюся с while, вы поймете, что я имею в виду.

Если вы дочитали до этого места, я хотел бы выразить признательность за ваше терпение. Когда я начинал эту статью, я не думал, что она будет такой длинной, я даже думал, что смогу указать функции в этой статье, но на данный момент у меня даже не было возможности объяснить циклы while. Если у вас есть какие-либо вопросы, вы можете связаться со мной здесь или на Linkedin. Увидимся в следующей статье..

Тот же пример с использованием цикла while:

import random
total_house = 50
max_sell = 10
houses_visited = 0
products_sold = 0
keep_continue = True
while keep_continue:
    houses_visited += 1
    permit = True if random.randint(1, 10) <= 5 else False  # %50 chance that the landlord permits us to enter his/her house
    if houses_visited > 50:
        keep_continue = False
        print(f"Oops. You only sell {products_sold} products!")
    elif permit == True:
        sell = True if random.randint(1, 10) <= 4 else False  # %40 chance for us to make sell.
        if sell == True:
            products_sold += 1
            if products_sold == max_sell:
                keep_continue = False
                print(f"Congrats! You reach the target with only {houses_visited} houses visited.")