Подтвердить что ты не робот

В каком порядке следует понимать концепции Python для абсолютных новичков?

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

  • Например, мой предшественник представил списки перед строками. Я считаю, что наоборот - лучшее решение.
  • Должны ли быть введены определения функций в самом начале или после освоения основных идей структурированного программирования, таких как решения (if) и циклы (while)?
  • Должны ли вводиться множества перед словарями?
  • Лучше ли начинать чтение и запись файлов на раннем этапе курса или использовать вход и печать для большей части курса?

Любые предложения с пояснениями приветствуются.

Изменить: В старшей школе ученики познакомились с компьютерами. Некоторые из них научились программировать. До этого у них был курс, охватывающий слово, excel, powerpoint, html, латекс, вкус Mathematica, но не программирование. 5 лет назад я использовал Mathematica в этом курсе, и в последующем курсе используется C и более поздняя Java. Теперь я преподаю введение в Python, и в последующем курсе мой коллега учит объектно-ориентированному программированию на Python. Позже студент может проводить специальные курсы по структурам данных, алгоритмам, оптимизации и на некоторых факультативных курсах, которые они изучают на своих собственных Mathematica, Matlab и R.

4b9b3361

Ответ 1

После некоторой попытки/кроме учителя, я решил придерживаться чего-то вроде:

(начиная с нуля, приспосабливаясь к их уровню)

  • В скором времени, что такое Python и что вы можете с ним сделать. Пропустите речь о технических материалах и сосредоточьтесь на том, что они хотят делать: музыку, графический интерфейс, веб-сайт, переименование файлов и т.д.
  • Установка Python, запуск интерпретатора. Если вы можете, используйте iPython.
  • Переменные, основные строки и print().
  • Int и типы (включая ошибки типов и литье).
  • Базовый калькулятор. Покажите им 1 / 0, 10 / 3 , но не беспокоите их о деталях.
  • Приведение результатов исчисления в переменные.
  • Использование переменных в исчислении.
  • Строковое формирование с помощью %. Показывать только "% s", это достаточно и всегда работает. Всегда используйте кортеж (с конечной комой), даже если он содержит только один элемент.
  • Списки, индексирование, нарезка и общие ошибки. Затем покажите кортежи как замороженные списки (и кастинг). Покажите, что тогда могут содержать друг друга. Заставьте их работать над этим, пока они не овладеют им отлично: это очень, очень важно.
  • Словари, с общими ошибками. Вложение с кортежами и списками. Настаивайте на последней точке.
  • For цикл по строкам, затем списки, затем кортежи, затем словари.
  • For цикл для вложенных типов. Будьте противны. Не торопитесь. Зная, что эта часть хорошо меняет все.
  • Словарь items(), values() и keys().
  • Чтение файлов с помощью For, включая IOErrors.
  • Запись файлов.
  • Использование методов. Используйте строку в качестве примера, показывающую strip(), lower(), split() и т.д. Не объясняйте ООП, как использовать метод. Использовать мировой "метод" много отныне.
  • Создание файла модуля и его использование. Только один модуль. Все в нем.
  • Функции (только с return, no print(). Запретить print() в функциях).
  • Параметры функции.
  • Именованные параметры.
  • Параметры значения по умолчанию.
  • Try/Except и исключения.
  • Import и создание собственных модулей каталогов. Показать все особые случаи (требуется больше времени, чтобы объяснить это, чем вы думаете).
  • Продемонстрируйте некоторые стандартные модули (но не тратьте на него слишком много времени, просто чтобы показать): datetime, string, os и sys. Избегайте абстрактных материалов, таких как itertools, они мечта кодера, но кошмар ученика.

После этого вы можете принести ООП на стол, но это немного сложнее. Используйте строки, списки и файлы, чтобы ввести понятие объекта. Когда они это получат, начните с занятий. Тогда сила может быть с вами: -)

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

Как правило, выберите один метод, который работает для чего-то и придерживайтесь его. Не показывайте альтернативные способы. Например:

Показывать только строковое формирование с помощью % и игнорировать + и ,. Вы всегда можете добавить небольшой блок "идти дальше" в материал для лекций для тех, кто хочет узнать больше. Показывать только For, а не while. Вы можете запрограммировать почти 90% программ Python без while. Избегайте +=. Не показывайте, что вы можете размножать строки/списки/dict с помощью ints. Это не так, но приведет их к заблуждению. Вам нужно, чтобы они были сосредоточены на основных концепциях.

Не показывать множества. Наборы очень полезны, но редко используются. Поощряйте их вводить код дома и спрашивать, не могут ли они решить проблему. В этом случае show sets, если они являются решением. Знание наборов требует времени и ресурсов мозга учащихся, которые можно использовать для чего-то более часто используемого. У них будет много времени, чтобы выучить новые инструменты позже, без вас: сосредоточиться на том, что трудно или трудоемко учиться в одиночку.

То же самое касается enumerate. Студенты с C или фона Java будут использовать индексы для цикла вместо For, если вы дадите им enumerate. По тем же причинам сохраните len, fd.read, fd.realines и range, если один из последних курсов дает право на "расширенный python", если у вас есть время для этого.

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

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

О, и они будут лучше программистов, если они не начнут изучать такие вещи, как байт-код, рекурсия, сборка, сложность, сортировка пузырьков, стек, детали реализации и т.д. Вы тратите время на обучение этому кому-то, что не может код достойная программа Python, он просто не может понять, что это такое. Практика - это ваши лучшие инструменты для приведения теории. И снова они будут изучать все остальное ими самими, если вы правильно их подготовите, поэтому установите приоритеты и не бойтесь пропустить понятия, даже простые/важные.

Ответ 2

Вы можете увидеть мою схему здесь: http://homepage.mac.com/s_lott/books/nonprog/html/index.html

Этот порядок представления основан на опыте преподавания C, Ada, С++, PL/SQL (и даже курса COBOL один раз).

Там великая книга, которая имеет разумное педагогическое упорядочение понятий.

R. C. Holt, G. S. Graham, E. D. Lazowska, M. A. Scott. Структурированное параллельное программирование с использованием операционных систем. 1978. Эддисон-Уэсли. 0201029375

http://openlibrary.org/b/OL4570626M/Structured_concurrent_programming_with_operating_systems_applications

Ответ 3

e-satis list довольно хорош, но поскольку это для математического класса, я бы добавил следующие предложения:

Прежде всего, используйте Python 3.x или скажите им, чтобы они всегда использовали

from __future__ import division

В противном случае они будут укусаться целым делением. Достаточно легко запомнить, когда вы вводите 1/2 в интерактивном приглашении, но вы получите ошибки в тонких местах, например:

def mean(seq):
    """Return the arithmetic mean of a list."""
    return sum(seq) / len(seq)

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

def derivative(f, x, delta_x=1e-8):
    """Approximate f'(x)."""
    return (f(x + delta_x) - f(x - delta_x)) / (2 * delta_x)

print(derivative(math.sin, 0))

Ответ 4

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

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

Чтобы решить проблему, вы должны понимать хотя бы некоторую основную часть языка. Я собираюсь предположить, что все, что вы делаете, скорее всего, будет содержаться в одной строке, а namespacing, modules, performance и т.д. Действительно не будут главными приоритетами.

Начните с установки их с помощью среды разработки и создайте простую программу для их запуска. Удостоверьтесь, что у них есть среда, в которой есть все, что им нужно (если они нуждаются в numpy, пройдите их через установку), пройдите их через запуск программы из командной строки и, конечно же, редактор, который прост в использовании (например, Eclipse + PyDev, вероятно, слишком сложно). Самое неприятное, когда вы не можете получить рабочую среду. Молитесь, что вам не нужно поддерживать Windows или не иметь много библиотек, с которыми можно бороться.

Как только у вас есть это, познакомьтесь с языком в целом. Типы обложки и тонкие проблемы, которые могут возникнуть, например:

>>> 1/2
0
>>> 1./2
0.5

Я бы даже привил привычку делать все поплавками. Введите строки для вывода и как сделать этот вывод, если вы хотите, чтобы он был на той же строке. Покройте операции и логику, затем предоставьте введение в "функции", убедившись, что вы должны провести различие между математическим эквивалентом. Я думаю, что структуры потока команд должны быть довольно простыми и включать простые (if, else, elif, возможно, while).

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

Изменить:

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

Я думаю, что наборы гораздо более математически релевантны (и полезны!), тогда dicts есть и будут вводить их в первую очередь.

Ответ 5

Недавно я преподал короткий курс краха Python для студентов I-III курсов Computer Science, большинство из которых знали только C и С++, и даже это не так хорошо. Мой подход сильно отличался от того, что вы предлагаете.

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

  • Во-первых, я коротко ознакомился с языком с его сильными и слабыми сторонами и показал некоторые простые программы на Python, которые могут легко получить даже те, кто не знает Python.
  • Затем я сделал полный контроль над структурами данных, используя экстенты REPL для примеров. Конечно, на данный момент они не могли написать программу, но написание любой программы (даже если это был пример с игрушкой) без использования структур данных - это не то, о чем говорит Python; Я бы даже сказал, что попытка это предполагает непитские привычки ученикам. Я пошел в таком порядке:
    • Числа (int -> float)
    • Последовательности (list & tuple -> string -> bytearray)
    • Наборы
    • Словари
    • Bools, включая автоматическое кастинг для bools.
  • Далее был основной синтаксис в следующем порядке:
    • Заявления (разрывы строк и т.д.)
    • Печать
    • Переменные, фокусируясь на особенностях динамической привязки и основных различиях между концепцией C переменных и ее эквивалентом Python.
    • Conditionals
    • Loops
    • Понимание списка
    • Вызов функций/методов, включая цепочки функций, параметры ключевых слов и списки аргументов.
    • Модули, включая импорт и работу с пространствами имен.
  • Форт глубоко погрузился в функции. Удивительно много, чтобы преподавать функции Python, в том числе различные способы определения аргументов (ключевые слова, списки), множественные возвращения, docstrings, scoping (большая предметная область отдельно) и важная, но часто пропущенная часть, которая использует функции как объекты, передавая их, используя lambdas и т.д.
  • Пятый был более практичным обзором файлов, включая проблемы ввода/вывода и кодирования и исключения (концепция → улов → повышение).
  • Наконец, обзор функций OO в Python, включая переменные экземпляра, типы методов (экземпляр/класс/статические), наследование, именование методов (private, mangled, special) и т.д.

По конкретным вопросам:

Например, мой предшественник представил списки перед строками. Я считаю, что обратное - лучшее решение.

Я не согласен. Концептуально строка представляет собой список, который получает много специального лечения, поэтому имеет смысл основываться на простой концепции списка. Если вы начнете с структур данных, как и я, вам также не придется иметь дело с тем, что вы не можете использовать строки в примерах ввода-вывода.

Должны ли быть введены определения функций в самом начале или после освоения основных идей структурированного программирования, таких как решения (if) и циклы (while)?

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

Должны ли вводиться множества перед словарями?

Ну, словари, безусловно, гораздо более используются на практике, но если вы ввели последовательности, объясняющие множества (особенно для студентов-математиков) не должны занимать много времени, и имеет смысл перейти от более простых к более сложным структурам.

Лучше ли начинать чтение и запись файлов на раннем этапе курса или использовать вход и печать для большей части курса?

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

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

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