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

Одна из ключевых трудностей в обучении функциям на языке программирования связана с пониманием области видимости переменных и пониманием того, что в чистой функции вся информация, поступающая в функцию, поступает через параметры и выходит через возвращаемые значения. И что переменные, используемые для параметров и внутри функции, отличаются от переменных, используемых в аргументах и ​​других частях программы.

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

TL/DR — Именованные параметры в помощь

Вкратце, обучая использованию функций на вводном курсе Python, я прошу студентов использовать функцию именованных параметров Python при вызове функций. Использование именованных параметров имеет несколько преимуществ:

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

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

Итак, почему?

На вводном курсе я часто сталкивался с двумя конкурирующими потребностями. Прежде всего, я бы хотел, чтобы студенты научились мыслить определенным образом. Обучение кодированию имеет огромное количество дополнительных преимуществ даже для людей, которые никогда в жизни не станут разработчиками программного обеспечения. Есть что-то прекрасное в том, чтобы научиться брать некоторые аспекты нашего реального мира и каким-то образом моделировать их с помощью компьютерной программы. Для этого ваше понимание проблемы, которую вы пытаетесь решить, должно быть настолько кристально ясным, чтобы вы могли разбить проблему на ее компоненты на мелкозернистом уровне.

Большинство проблем слишком сложны, чтобы их можно было решить управляемым способом, не разбивая проблему на части, которыми вы можете управлять (а также тестировать и осмысливать) независимо друг от друга. Ключевыми инструментами здесь являются функциональная декомпозиция и объектно-ориентированное мышление!

Но давайте не будем говорить об объектно-ориентированной части в этом посте!

Было бы здорово, если бы я мог говорить о функциях в начале урока? Я пробовал это в прошлом, и (до сих пор) это не сработало. Почему нет? Кажется, около половины моих студентов часто не понимают всей концепции того, что происходит, когда запускается компьютерная программа. Они кивают головами, когда практикуют переменные и задания. Выражения: Понятно. Типы классные, и те тоже! Но собрать части воедино становится проблематичным для многих студентов. (Это потому, что людям трудно мыслить аналитически, особенно без практики, и мы все можем обойтись менее аналитическим решением проблем почти во всем, что мы делаем.)

Одним из огромных препятствий для представления функций как концепции программирования на раннем этапе был масштаб. Проиллюстрировать, что такое глобальные переменные, легко, но когда у вас есть такая переменная, как x в вашей программе, которая находится в двух разных функциях, понимание того, что это совершенно разные переменные, для многих является сложной задачей. Не поймите меня неправильно: учащиеся должны понимать область действия (локальную, модульную и глобальную) и пространства имен. Но не в первую неделю занятий по программированию. Из-за этого концепция функции часто отодвигается на некоторое количество недель во вводном курсе.

Я думаю, это ошибка.

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

Использование именованных параметров и Python

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

Именованные параметры устраняют большую часть путаницы при использовании функций для новых учащихся.

Простой пример

Хотя в приведенном выше примере нет ничего плохого, совпадение имен переменных очень сбивает с толку новых студентов.

Студенты часто:

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

Вместо этого я предлагаю студентам принять некоторые правила при написании функций:

  • Все имена в функции должны быть уникальными для этой функции.
  • Для параметра полезно добавить небольшой префикс к имени параметра, который может быть инициалом имени функции.
  • При вызове функции используйте именованные параметры, чтобы показать, что при вызове функции происходит присвоение.

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

Я надеюсь, что эта идея побудит писателей начать корректировать свои учебники, потому что с помощью описанной выше техники я довольно рано учу студентов тому, как использовать функции, и было бы здорово, если бы эта концепция была представлена ​​в тексте раньше, чем в главе 13. Сохраните главу 13 для изменчивости, передачи списков в функции, область действия и ссылки!

Некоторые из моих студентов могут долго не смотреть на компьютерную программу после окончания вводного курса. Таким образом, чем больше практики они будут размышлять и чем меньше времени они будут тратить на борьбу с понятиями, которые не являются ключевыми для обучения мышлению, тем большее влияние на них окажет класс, когда мы закончим!

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

Спасибо за чтение.

Больше контента на plainenglish.io