Избегайте использования глобальных, не запутывая новых студентов программирования на Python?

Я преподавал основному компьютерному программированию 8-9 классов в течение двух недель, и вчера я попытался показать им, как они могут сделать настоящие простые текстовые приключения в Python.

Сцены – это функции (например, dragons_cave() ), которые состоят из некоторых операторов печати, а затем вызова для input() , спрашивающего игрока, куда они хотят перейти далее, который затем передается в globals() чтобы найти соответствующую функцию, а затем называется. Я знаю, что это не идеальный (в какой момент огромная цепочка функций начнет становиться проблемой?), Но, из того, что перешло мне в голову, кажется, что это самый простой для них, хотя и включает лишь небольшую ручную работу.

Моя проблема связана с глобальным состоянием – например. игрок получает ключ в одной сцене, и только тогда они могут разблокировать ворота в другой сцене. Когда у меня есть глобальные immutables, такие как строки или логические значения, Python хочет, чтобы я использовал ключевое слово global в начале функции.

 global hasKey hasKey = True 

Я все в порядке с этим, но у меня есть смутное чувство (взятое из Stackoverflow среди других мест в Интернете), что на global хмурится и всегда имеет превосходный аналог. Я мог бы иметь глобальный словарь или обернуть все в классе, но я не уверен, могу ли я четко защитить эти варианты своим детям (которые все еще думают о последствиях переменных).

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

2 Solutions collect form web for “Избегайте использования глобальных, не запутывая новых студентов программирования на Python?”

Я бы посоветовал им начать изучать ОО

 class Location: name="a place" description = "A dark place. there are exits to the North and East" exits = "North","East" def __str__(self): return "%s\n%s"%(self.name,self.description) class Player: current_location = "Home" inventory = ["Blue Key","Magic Thumbtacks"] health = 100 name = "Unknown" def __init__(self,name): self.name = name player = Player("Player 1") loc = Location() print loc x = input("Input:") 

Честно говоря, игра – сложная концепция (даже текстовое приключение). Но я бы начал их непосредственно над концепциями ОО, они в большей степени выиграют от этого в долгосрочной перспективе.

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

Несвязанный, но лучший пример OO:

 class Animal: voice = '...' def speak(self): return "A %s Says '%s'"%(self.__class__.__name__, self.voice) class Dog(Animal): voice = "Bark, Bark" class Duck(Animal): voice = "Quack, Quack" print Dog().speak() print Duck().speak() 

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

 state['hasKey'] = True 

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

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

  • Почему диапазон (0) == range (2, 2, 2) True в Python 3?
  • Как написать байты в файл в Python 3 без знания кодировки?
  • Декартово произведение для двух словарей python
  • Запуск кода с Python 3.5.0 + Sublime 3.0 на Mac
  • Как отслеживать веб-страницы, открытые в веб-браузере с помощью Python?
  • Может ли Pickle обрабатывать файлы, большие, чем оперативная память, установленная на моей машине?
  • Python 3 - при преобразовании из ints в 'bytes', а затем их конкатенации (для последовательной передачи)
  • Выполнить все итерации на итерабельном
  •  
    Interesting Posts for Van-Lav

    Есть ли у Python аналогичный механизм управления для CountDownLatch для Java?

    Почему это тройное цитирующее решение исправляет ошибку пути?

    Pandas DataFrame вставляет / заполняет пробелы из предыдущих дат

    Установка модуля python в код

    Как я могу сделать свой код набором?

    Можете ли вы предоставить приложение Django подробное имя для использования во всем админ?

    Numpy: исправить массив с строками разной длины, заполнив пустые элементы нулями

    Пропавшие без вести на результатах Beautiful Soup

    Ошибка округления Python с номерами с плавающей запятой

    Как я могу получить весь текст с сайта Scrapy?

    Неустранимая ошибка Python при использовании динамической версии Python для выполнения встроенного кода python

    Написание токенизатора в Python

    Ненадежная производительность загрузки файлов с S3 с помощью boto и многопроцессорной обработки.

    Как я могу установить конкретную версию pip через easy-install? – Mac OS Mavericks

    запуск селена из python на ubuntu

    Python - лучший язык программирования в мире.