Выделить:

  • В этой статье мы рассмотрим ключевые элементы языка Python. Это условия (управление потоком) и функции.

С Python Core Day 1 мы закончили нашу первую небольшую программу, которая создает параграф с рекомендациями по акциям. Надеюсь, вам все это понравилось. В Python Core Day 2 мы улучшим нашу небольшую программу, добавив еще два ключевых элемента:

  1. Условия (управление потоком): другими словами «если… то…».
  2. Функции: точнее определяемые пользователем функции. Сэкономьте наше время в будущем и не повторяйте подобный код.

Совет перед началом

В большинстве случаев мы не сможем написать окончательный сценарий за один раз. Кодирование - это итеративный процесс. Обычно мы следуем своему чутью, чтобы спроектировать первую рабочую версию, а затем итеративно ее улучшать. Например, найдите повторяющиеся шаблоны и замените их пользовательскими функциями. Этот шаг называется «рефакторинг», и даже профессиональные инженеры делают то же самое.

ВАЖНОЕ ОБНОВЛЕНИЕ

Поскольку Microsoft Azure Notebooks перешла на GitHub, это может быть сложной задачей для новичка. Я поместил весь материал в Google Colab. Это очень похожая среда Jupyter Notebook, и вы можете проверить ее, щелкнув здесь.

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

Сравнение

Мы можем дать ему причудливые имена, такие как «Логическая переменная» и «Логическая операция». Но по сути сравнение - это наш здравый смысл. Мы сравниваем значения и получаем истину или ложь.

Большинство операторов сравнения нам уже знакомы, например следующие.

Сложность могут заключаться в специальных операторах или поведении в Python. Давайте посмотрим на следующие примеры.

Пять вещей, которые мы можем узнать из этого небольшого примера:

  1. Для сравнения, если значения равны, мы используем «==». В большинстве языков программирования, чтобы различать «=» для присвоения значения переменной, мы используем «==» для сравнения.
  2. Для сравнения, если значения НЕ равны, мы используем «! =».
  3. Результат сравнения можно сохранить в переменной (Логическая переменная), которая будет либо Истина, либо Ложь.
  4. Функция «печать» может принимать множество входных данных и распечатывать в одной строке.
  5. В Python логическими значениями являются Истина и Ложь. Заглавные «T» и «F» важны, потому что Python очень чувствителен к регистру, поэтому строчные / прописные буквы имеют значение.

Еще одна хитрость - сравнение строк из-за чувствительности к регистру. Хороший способ проиллюстрировать это следующим примером.

Если две строки равны, это означает, что каждый отдельный символ в строках является sam e, то есть нижний регистр, верхний регистр, пустое пространство и т. д. В нашей повседневной работе мы не предполагаем, что получаемые данные идеальны, особенно тексты. Вот несколько строковых функций Python, которые могут нам помочь.

.lower (): все символы в строке будут строчными.

.upper (): все символы в строке будут переведены в верхний регистр.

.strip (): удаляет все пробелы до и после строки. Обратите внимание, что пробелы между словами не удаляются.

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

Обратите внимание, что мы можем связать функции, например «.strip (). Lower ()».

Логические операции

Как и в Excel (у нас есть И, ИЛИ, НЕ), мы можем делать то же самое в Python. Эти логические операторы помогают нам объединять сравнения. Я нашел его более читаемым с использованием синтаксиса Python, чем Excel. Мы можем быстро взглянуть на следующий пример. Должно быть довольно просто увидеть, как это работает.

Как видим, он больше похож на человеческий язык.

Условия

Наконец, мы подошли к контролю потока, условиям. Мы узнаем, как его использовать, постоянно улучшая нашу маленькую программу. Помните, у нас была строка шаблона и мы использовали функцию «.format ()», которая динамически генерирует абзац с переданными значениями? Мы жестко запрограммировали значение заполнителя «рекомендация» и сказали, что будем использовать условия, чтобы сделать его более динамичным. Теперь будем делать это шаг за шагом.

Допустим, мы принимаем во внимание два фактора при принятии решения о рекомендации: коэффициент чистой прибыли и маржа чистой прибыли. Если маржа чистой прибыли высока, например более 30%, мы считаем, что это хороший товар. Затем это зависит от коэффициента PE, чтобы проверить, достаточно ли дешевы для покупки акции. Если коэффициент PE ниже 15, мы думаем, что это хорошая покупка. Если коэффициент PE составляет от 15 до 25, мы думаем, что мы все еще можем удержать, в противном случае мы должны продать его.

Убедитесь, что мы запускаем все ячейки (ноутбук перестанет работать после длительного бездействия или после выхода из системы), поэтому все переменные готовы к использованию. Мы можем нажать «Ячейка» в меню, а затем «Выполнить все».

Затем, в конце, мы создаем еще одну ячейку ниже. Помните, что мы можем нажать ESC в режиме редактирования ячеек, а затем нажать «B», чтобы добавить одну ячейку ниже. Затем мы вводим следующий код.

Сначала мы создаем новую переменную «net_profit_margin» и присваиваем ей значение. Опять же, я использовал Google Finance, но вы можете просто скопировать номер или ввести любой номер, который у вас есть. Также обратите внимание, что переменная «pe» была создана с помощью нашего предыдущего кода. Мы прогнали все ячейки, поэтому переменная «pe» готова к использованию.

Переходя к части условия, основной синтаксис - [ключевое слово] [условия] [:], где ключевое слово может быть « if »,« elif »(короткое слово для else if) и« else », условия могут быть любыми сравнениями или логическими операциями, тогда мы завершаем с «:» в конце. Следует выделить две вещи.

У нас не может быть «elif» или МНОГИЕ «elif». Когда у нас есть дополнительные условия для проверки, мы всегда можем добавить еще «elif».

У нас не может быть никакого «else» или только ОДНО «другое». Это имеет смысл, потому что будет только один случай.

Также обратите внимание, что отступы в Python ВАЖНЫ. Любое действие, которое нужно выполнить при определенных условиях, нам нужно, чтобы код запускался с отступа с новой строки. Не забудьте использовать TAB для отступа (SHIFT + TAB чтобы убрать отступ) .

Один общий вопрос по второму условию: почему мы не говорим pe ›15 и pe‹ 25? Это потому, что весь код выполняется в последовательном порядке (сверху вниз). Если первое условие pe ‹15 не выполняется, это уже означает, что pe больше 15.

Разместите условия

Теперь мы перевели то, что хотим, в код Python, но, возможно, мы захотим сделать логику еще лучше. Коэффициент PE - вещь особенная. Технологические компании обычно имеют более высокий коэффициент PE по сравнению с другими. Итак, мы можем применить другие правила для технологической компании. Например, если в описании компании встречается ключевое слово «технология», мы думаем, что это технологическая компания. Тогда, если коэффициент PE ниже 25, мы говорим, что это покупка. Если коэффициент PE составляет от 25 до 35, мы говорим, что это удержание, в противном случае - продажа.

Теперь у нас есть условия по условиям. Решение состоит в том, чтобы РАЗМЕСТИТЬ их. Давайте добавим еще одну ячейку ниже и рассмотрим следующий пример.

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

Еще одна уловка, которую нужно изучить, - это как проверить, находится ли ключевое слово в другой строке (т.е. является ли строка подстрокой другой). Для этого мы используем «in». Это интуитивно понятно, если мы его прочитаем. Также помните, что обе строки должны быть строчными, чтобы мы ничего не пропустили из-за чувствительности к регистру в Python.

Пример выше работает хорошо, но мы все еще можем его улучшить. Думать об этом. Что, если в будущем мы захотим изменить уровни PE для рекомендации? Мы могли бы изменить значения напрямую, но обычно через некоторое время мы забываем, что означают эти числа. Итак, один хороший совет при кодировании - избегать магических чисел / строк. Создайте переменные и используйте вместо них переменные.

Пример выше - это улучшенная версия. В основном мы используем такие переменные, как «good_net_profit_margin», «pe_buy» и «pe_sell».

В то же время есть еще один трюк, который нужно изучить. Рекомендуется сначала установить значения по умолчанию, а затем обновлять значения в соответствии с условиями. Таким образом, наш код должен быть чище.

На самом внешнем уровне у нас есть рекомендация по умолчанию «Продавать». Затем нам нужно только рассмотреть условия, при которых рекомендация будет отличаться. В нашем примере базовым случаем является размер чистой прибыли, превышающий заданный уровень.

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

Проверьте отрасль и определите пороговые значения PE.

Проверьте пороги PE и выберите рекомендацию.

Хороший! У нас есть наша рекомендация, которая генерируется динамически.

Пользовательские функции

А теперь перейдем к функциям. Программирование без пользовательских функций (UDF) может стать кошмаром. Представьте, что мы не можем определить наши функции и должны снова и снова копировать и вставлять весь код для аналогичного анализа. Следовательно, на любом языке программирования мы можем определять наши функции. Пользовательские функции помогают нам обобщить анализ и избежать ненужного повторения.

Давайте посмотрим, как мы можем определить функцию.

Это ключевые элементы для определения функции. Начнем с ключевого слова «def». За ним будет содержательное имя функции, затем мы будем использовать «()» для определения всех параметров (у нас может быть много параметров). Наконец, мы заканчиваем «:» в конце. Независимо от того, сколько строк мы будем выполнять вычисления внутри функции, нам всегда нужно возвращать значение. Это делается с помощью ключевого слова «return», за которым следует значение / переменная / выражение. Опять же, отступ - это ключ, и помните, что Python чувствителен к регистру.

Теперь давайте сделаем нашу логику рекомендаций пользовательской функцией.

Функция называется «get_recommedation». Требуется «pe», «net_profit_margin» и «company_description». Затем он возвращает рекомендацию, которая вычисляется с условиями, определенными в последнем разделе.

Один хороший совет. Сначала мы можем ввести объявление функции. Затем скопируйте и вставьте под него код из последнего раздела (условия рекомендации). Отступ будет неправильным, поэтому мы можем использовать мышь, чтобы выделить все строки без отступа, а затем нажать TAB. Теперь все должно иметь правильный отступ. Наконец, измените «печать (рекомендация)» на «вернуть рекомендацию».

Протестируйте нашу функцию

Проверять нашу работу - хорошая привычка. Для инженеров тестирование имеет большое значение. Но для нас, как финансовых аналитиков, базовый тест должен быть достаточно хорош. Чтобы протестировать функцию, мы должны продумать несколько сценариев (различное сочетание входных данных) и ожидаемые результаты. Затем мы запускаем функцию, чтобы увидеть, совпадают ли результаты с ожидаемыми. Сценарии должны охватывать все возможные выходы. Давайте добавим еще одну ячейку ниже и рассмотрим несколько примеров.

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

Следует обратить внимание на последний вызов функции. Это показывает, что в Python, если мы указываем имя параметра, порядок не имеет значения, в противном случае мы должны поддерживать порядок ввода.

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

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

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

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

Это пользовательская функция, которую мы можем назвать «get_recommendation_report». Он должен принять все переменные, которые мы определили ранее, и вернуть абзац. Опять же, добавьте еще одну ячейку ниже (скопируйте и вставьте), чтобы не испортить старый код.

Вот все переменные, которые мы определили, включая новую, которую мы добавили сегодня, «net_profit_margin», которая будет использоваться предыдущей функцией «get_recommendation». Это помогает нам запомнить, какие входные данные нам нужны для функции. Затем мы определяем следующую функцию.

Три важных момента.

  1. В функции мы называем параметр «fx_rate» вместо «cny_usd». Параметр функции рекомендуется называть более общим.
  2. Функция может вызывать другую функцию. Здесь мы вызвали функцию «get_recommendation». Также важно помнить, что вызываемая функция должна быть определена до того, как она вызывается. В противном случае Python будет жаловаться, что мы используем что-то еще не определенное.
  3. Чтобы код было легче читать, мы можем разбить параметры функции на несколько строк. Jupyter должен автоматически создавать отступ для нас.

Удивительный!

Мы сегодня очень много сделали. Мы использовали сравнение и условия, чтобы сделать рекомендацию более динамичной. Мы улучшали наш код несколько раз, шаг за шагом, чтобы сделать его лучше структурированным и более удобным для повторного использования. Как я упоминал в начале, кодирование - это итеративный процесс улучшения, и мы сделали именно это сегодня. Итак, поздравляем, теперь мы становимся настоящими программистами!

Я знаю, что наш блокнот снова может показаться черновиком, потому что мы добавили ячейки, чтобы улучшить нашу программу. Убедившись, что основные функции работают, удалите ненужные ячейки. Вы можете нажать ESC, а затем дважды нажать «D», чтобы удалить ячейку.

В следующий раз мы продолжим улучшать нашу программу, используя список и цикл.